Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
As BorIDE progresses...
It did!! See now https://zxbasic.readthedocs.io/en/latest/if/
Basically, for the ELSEIF (compound if), there must be a new line after THEN.
This is because ZX BASIC now allows no END IF for single line ones!! (yes, like classic BASIC).
See: <!-- w --><a class="postlink" href="http://www.boriel.com/forum/post6091.html#p6091">www.boriel.com/forum/post6091.html#p6091</a><!-- w -->
Reply
Oh I understand. This explains a lot. Excellent!
Also now the output stream shows warning and errors with paths. That's why the errors are not marked in Source anymore. I will fix that code.
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
Still have some Traceback errors ...
Code:
Traceback (most recent call last):
  File "D:\Restliche Programme\zxbasic\zxb.py", line 339, in <module>
    sys.exit(main())  # Exit
  File "D:\Restliche Programme\zxbasic\zxb.py", line 244, in main
    debug=(OPTIONS.Debug.value > 2))
  File "D:\Restliche Programme\zxbasic\ply\yacc.py", line 328, in parse
    return self.parseopt(input, lexer, debug, tracking, tokenfunc)
  File "D:\Restliche Programme\zxbasic\ply\yacc.py", line 820, in parseopt
    p.callable(pslice)
  File "D:\Restliche Programme\zxbasic\zxbparser.py", line 2461, in p_addr_of_id
    entry.accessed = True
  File "D:\Restliche Programme\zxbasic\symbols\label.py", line 39, in accessed
    for entry in self.scope_owner:
  File "D:\Restliche Programme\zxbasic\symbols\label.py", line 44, in scope_owner
    return list(self._scope_owner)
AttributeError: 'SymbolLABEL' object has no attribute '_scope_owner'
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
This looks like a compiler bug :!:
The code that produces it is the one posted above??
Reply
boriel Wrote:This looks like a compiler bug :!:
The code that produces it is the one posted above??
No, it is different, the upper code (Full code below) of the earlier prigram produces this:
Code:
Traceback (most recent call last):
  File "D:\Restliche Programme\zxbasic\zxb.py", line 339, in <module>
    sys.exit(main())  # Exit
  File "D:\Restliche Programme\zxbasic\zxb.py", line 287, in main
    asm_output = optimize(asm_output) + '\n'
  File "D:\Restliche Programme\zxbasic\arch\zx48k\optimizer.py", line 2326, in optimize
    x.optimize()
  File "D:\Restliche Programme\zxbasic\arch\zx48k\optimizer.py", line 1982, in optimize
    regs.op(i1, o1)
  File "D:\Restliche Programme\zxbasic\arch\zx48k\optimizer.py", line 693, in op
    self.inc(o[0])
  File "D:\Restliche Programme\zxbasic\arch\zx48k\optimizer.py", line 558, in inc
    v_ = self.getv(self.mem.get(r_, None))
  File "D:\Restliche Programme\zxbasic\arch\zx48k\optimizer.py", line 516, in getv
    v = self.get(r)
  File "D:\Restliche Programme\zxbasic\arch\zx48k\optimizer.py", line 498, in get
    if r.lower() == '(sp)' and self.stack:
AttributeError: 'NoneType' object has no attribute 'lower'

Here it is:
Code:
dim control$,key$ as string
dim posx,posy,dir,drw,found as byte
dim shtx,shty,shard as Uinteger


poke uinteger 23675,@UDGs01

sub waitnokey()
    while inkey$<>"":wend
end sub
sub Drawscreen()
    dim x,y,byt as ubyte
    dim adr as uinteger
    dim a$ as string
    adr=@Buffer
    for y=0 to 21
        a$=""
        for x=0 to 31
            byt=peek adr
            if byt=0 then a$=a$+" ":else a$=a$+"\a":end If
            adr=adr+1
        next x
        print at y,0;ink 4;a$;
    next y
end sub
function Piece(x as Uinteger,y as Uinteger)
    dim b as uinteger
    dim a$ as string
    b=@Buffer+(y<<5)+x
    if peek b=0 then
        a$=" "
    elseif peek b=1 then
        a$="\{i4}\a"
    elseif peek b=2 then
        a$="\{i5}\g"
    elseif peek b=3 then
        a$="\{i5}\h"
    end if
    print at y,x;a$;
end function
sub PlacePiece(x as uinteger,y as Uinteger,piece as ubyte)
    poke @Buffer+(y<<5)+x,piece
end sub
function GetPiece(x as uinteger,y as Uinteger) as ubyte
    return @Buffer+(y<<5)+x
end Function
sub PlaceShards(cnt as integer)
    dim dir,dir1 as ubyte
    dim xy as uinteger
    while cnt>0
        xy=int(rnd*704)
        if peek(@Buffer+xy)=1 then
            cnt=cnt-1
            dir=int(rnd*1.99)
            if dir=1 then
                dir1=2
            else
                dir1=3
            end If
            poke @Buffer+xy,dir1
        end If
    wend

end sub



border 1:paper 0:bright 0:ink 7:Flash 0:Inverse 0:cls
print at 0,0;"\{b1}\{p1}Inu Yasha-Test  by LCD";

print at 3,1;"1. Keyboard QAOPM";
print at 4,1;"2. Sinclair 67890";

control$=""
while control$=""
    key$=inkey$
    if key$="1" then control$="qaopm":end If
    if key$="2" then control$="98670":end If
wend

randomize
cls

PlaceShards(32)
Drawscreen()

posx=10:posy=20


print at posy,posx;"\{i7}\j";
mainloop:
while key$<>control$(4)
    key$=inkey$
    if key$=control$(0) and posy>0 then Piece(posx,posy):posy=posy-1:print at posy,posx;"\{i7}\j";:waitnokey():end If
    if key$=control$(1) and posy<21 then Piece(posx,posy):posy=posy+1:print at posy,posx;"\{i7}\j";:waitnokey():end If
    if key$=control$(2) and posx>0 then Piece(posx,posy):posx=posx-1:print at posy,posx;"\{i7}\j";:waitnokey():end If
    if key$=control$(3) and posx<31 then Piece(posx,posy):posx=posx+1:print at posy,posx;"\{i7}\j";:waitnokey():end If
wend
if key$=control$(4) then
    print at 22,0;"\{p6}\{i2}\{b1}Select firing direction";
    print at 23,0;"\{p6}\{i2}\{b1}SPC to purify and get Shard";
    waitnokey()
    dir=0
    while dir=0
        key$=inkey$
        waitnokey()
        if key$=control$(0) then dir=1:end if
        if key$=control$(1) then dir=2:end if
        if key$=control$(2) then dir=3:end if
        if key$=control$(3) then dir=4:end if
        if key$=" " then
            found=0
            if GetPiece(posx+1,posy)>1 then found=found+1:shard=shard+1:PlacePiece(posx+1,posy,1):end If
            if GetPiece(posx-1,posy)>1 then found=found+1:shard=shard+1:PlacePiece(posx-1,posy,1):end If
            if GetPiece(posx,posy-1)>1 then found=found+1:shard=shard+1:PlacePiece(posx,posy-1,1):end If
            if GetPiece(posx,posy+1)>1 then found=found+1:shard=shard+1:PlacePiece(posx,posy+1,1):end If
            if found=0 then border 2:pause 5:border 0:end if
            dir=5
        end if


    wend
    if dir=5 then dir=0:end if
    print at 22,0;"\{p0}\{i7}\{b0}                       ";
    print at 23,0;"\{p0}\{i7}\{b0}                           ";
    shtx=posx
    shty=posy
    while dir>0
        if dir=1 and shty>0 then shty=shty-1:end if
        if dir=2 and shty<22 then shty=shty+1:end if
        if dir=3 and shtx>0 then shtx=shtx-1:end if
        if dir=4 and shtx<31 then shtx=shtx+1:end if
        bg=peek(@Buffer+(shty<<5)+shtx)
        if bg=2 then dir=peek(@Shoottable1+dir-1):end If
        if bg=3 then dir=peek(@Shoottable2+dir-1):end if
        if shtx=0 or shtx=31 or shty=0 or shty=22 then dir=0:end If
        'if bg<99 then
        if bg=0 then
            drw=1
        else
            drw=0
        end if
        if drw then
        print at shty,shtx;"*";
        end if
    wend
end if
goto mainloop

End
Shoottable1:
asm
    defb 4,3,2,1 ;/
end asm
Shoottable2:
asm
    defb 3,4,1,2 ;\
end asm
UDGs01:
asm
    defb 24, 44, 94, 60, 24, 24, 60,  0 ;A Tree
    defb 16, 56, 16, 16, 16, 16, 56, 40 ;B Arrow up
    defb  0,  0,  0,194,127,194,  0,  0 ;C Arrow right
    defb 40, 56, 16, 16, 16, 16, 56, 16 ;D Arrow down
    defb  0,  0,  0, 67,254, 67,  0,  0 ;E Arrow left
    defb 16, 42, 84, 40, 16,  8, 20,  0 ;F Tree Visited
    defb  0,  2, 12, 28, 56, 48, 64,  0    ;G Shard /
    defb  0, 64, 48, 56, 28, 12,  2,  0 ;H Shard \
    defb 24, 24, 60, 60, 90, 24, 60, 36 ;I Youkai
    DEFB  0, 24, 24, 60, 90, 24, 36, 36    ;J Figure
end asm
Buffer:
asm
    DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
    DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
end asm
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
Ok. This seems to be with -O3. Using -O2 or lower should give no problems.
Reply
boriel Wrote:Ok. This seems to be with -O3. Using -O2 or lower should give no problems.
That's true.
Today I made a big progress with BorIDE. Custom loader (Counter Load) works also too. Hope to release it soon.
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
LCD Wrote:Today I made a big progress with BorIDE. Custom loader (Counter Load) works also too. Hope to release it soon.
Great!!! Tongue
BTW I'm going to add a zxbasic "check only" mode, which just outputs errors but does nothing else (e.g. zxb --check) useful for editors and normally faster.
Reply
boriel Wrote:
LCD Wrote:Today I made a big progress with BorIDE. Custom loader (Counter Load) works also too. Hope to release it soon.
Great!!! Tongue
BTW I'm going to add a zxbasic "check only" mode, which just outputs errors but does nothing else (e.g. zxb --check) useful for editors and normally faster.
Sounds like agreat addition. Currently I deactivated the Debug mode, but forgot why.
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
Oh, Found a bug, I think:
Code:
Traceback (most recent call last):
  File "D:\Restliche Programme\zxbasic\zxb.py", line 339, in <module>
    sys.exit(main())  # Exit
  File "D:\Restliche Programme\zxbasic\zxb.py", line 244, in main
    debug=(OPTIONS.Debug.value > 2))
  File "D:\Restliche Programme\zxbasic\ply\yacc.py", line 328, in parse
    return self.parseopt(input, lexer, debug, tracking, tokenfunc)
  File "D:\Restliche Programme\zxbasic\ply\yacc.py", line 820, in parseopt
    p.callable(pslice)
  File "D:\Restliche Programme\zxbasic\zxbparser.py", line 2461, in p_addr_of_id
    entry.accessed = True
  File "D:\Restliche Programme\zxbasic\symbols\label.py", line 39, in accessed
    for entry in self.scope_owner:
  File "D:\Restliche Programme\zxbasic\symbols\label.py", line 44, in scope_owner
    return list(self._scope_owner)
AttributeError: 'SymbolLABEL' object has no attribute '_scope_owner'
That was without optimizer, in this code:
Code:
dim tiles(16) as uinteger
tiles(0)=@void
tiles(1)=@Sea
tiles(2)=@Bridge
tiles(3)=@Park
tiles(4)=@Schutt
tiles(5)=@skyscraper

tiles(6)=@car
tiles(7)=@PoliceCar
tiles(8)=@People
tiles(9)=@house

dim monstergfx(5,1,3) as uinteger
dim directionstring$(3) as string
directionstring$(0)="NORTH"
directionstring$(1)="WEST "
directionstring$(2)="SOUTH"
directionstring$(3)="EAST "

dim winddir,headingdir,headdir as byte
dim monsterx,monstery as byte
dim alt as ubyte
goto start
buffer:
asm
    defs 3360
end asm
mapSF: '1024 bytes
asm
    DEFB     05,00,05,00,05,00,09,00,    00,00,01,01,01,01,01,03,    00,00,05,00,00,00,00,00,    00,00,00,00,00,00,00,00
    DEFB     09,00,09,00,09,00,09,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
    DEFB     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
    DEFB     03,00,09,09,00,03,09,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
    DEFB     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
    DEFB     03,00,09,00,09,00,09,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
    DEFB     03,00,09,00,09,00,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
    DEFB     00,00,03,00,09,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
                    
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
                    
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
                    
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
    DEFB     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
end asm

void:
asm
    DEFB 0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0
    DEFB 0,0,0,0,0,0,0,0
end asm

People: '3x3
asm
    DEFB    000,000,000,000,000,000,000,000
    DEFB    014,015,014,006,007,007,015,006
    DEFB    015,031,063,062,007,006,006,014
    DEFB    000,000,000,000,000,000,000,000
    DEFB    004,131,193,000,000,003,004,006
    DEFB    002,131,193,034,192,064,000,000
    DEFB    000,000,000,000,224,224,224,096
    DEFB    248,102,108,096,096,224,048,024
    DEFB    012,006,002,004,000,000,000,000
end asm
skyscraper: '3x3
asm
    DEFB    000,000,000,000,031,063,127,254
    DEFB    170,171,254,170,171,254,170,171
    DEFB    254,170,170,255,170,171,255,254
    DEFB    003,004,009,019,255,167,063,103
    DEFB    191,039,127,167,063,103,191,039
    DEFB    127,167,063,103,255,167,063,063
    DEFB    192,192,192,192,192,255,193,131
    DEFB    253,093,093,093,093,093,093,093
    DEFB    093,093,093,093,093,093,094,252
end asm
Park: '3x3
asm
    DEFB    000,001,009,053,060,024,115,121
    DEFB    061,246,018,003,001,000,000,048
    DEFB    120,124,124,056,016,016,255,000
    DEFB    000,128,192,192,112,160,240,120
    DEFB    076,092,096,240,168,128,128,128
    DEFB    128,132,159,159,156,132,255,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    048,124,124,124,092,017,255,000
end asm
Schutt: '3x3
asm
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,000,001,007
    DEFB    030,061,111,245,119,007,001,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,028,187,119
    DEFB    235,253,159,231,251,221,190,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,000,000,192
    DEFB    160,184,220,103,190,216,000,000
end asm
PoliceCar: '3x3
asm
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,001,002,004,115
    DEFB    255,248,243,228,004,003,000,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,028,020,255,000,000,255
    DEFB    129,065,066,165,189,000,000,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,128,128,064,224
    DEFB    254,031,207,039,036,192,000,000
end asm
Bridge:
asm
    DEFB    255,153,096,237,237,236,094,191
    DEFB    191,109,204,172,109,012,255,012
    DEFB    255,255,012,141,237,140,191,192
    DEFB    254,231,031,249,231,030,255,126
    DEFB    030,129,203,102,189,000,255,000
    DEFB    255,255,000,231,255,126,102,126
    DEFB    127,249,134,183,183,048,123,253
    DEFB    253,182,051,053,182,048,255,048
    DEFB    255,255,048,176,183,049,252,001
end asm
Sea:
asm
    DEFB    255,051,252,207,243,252,255,060
    DEFB    255,207,060,255,207,243,252,207
    DEFB    063,252,207,063,255,243,060,255
    DEFB    252,207,063,243,207,060,255,255
    DEFB    060,195,255,255,207,063,252,243
    DEFB    255,252,051,207,255,243,207,063
    DEFB    255,243,012,255,255,240,015,255
    DEFB    243,255,051,207,252,255,255,051
    DEFB    204,255,255,049,207,255,241,063
end asm
car:
asm
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,000,000,031
    DEFB    063,126,124,125,061,003,001,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,127,255,123,056,024,024,255
    DEFB    255,063,030,222,094,225,192,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,128,192,224,048,024,252
    DEFB    254,030,014,239,174,240,224,000
end asm
car1:
asm
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    007,031,117,117,127,255,165,024
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    192,224,096,088,254,255,165,024
    DEFB    000,000,000,000,000,000,000,000
end asm

house:
asm
    DEFB    003,103,111,127,127,255,085,042
    DEFB    065,034,065,042,000,031,063,127
    DEFB    253,223,027,027,027,031,000,000
    DEFB    000,128,192,224,240,248,080,160
    DEFB    016,039,023,039,006,255,255,255
    DEFB    085,255,007,119,119,119,000,000
    DEFB    000,000,000,000,008,060,062,255
    DEFB    127,073,073,127,127,248,254,255
    DEFB    127,247,050,050,052,248,000,000
end asm
faxctory:
asm
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,000,002,007,015,031,063,127
    DEFB    255,106,106,110,110,110,127,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,001,001,001,129,193,227,243
    DEFB    255,170,187,187,170,170,255,000
    DEFB    000,000,000,000,000,000,000,000
    DEFB    000,152,152,152,152,152,252,252
    DEFB    255,171,187,187,171,171,255,000

end asm
infantry:
asm
    DEFB    255,255,255,255,255,255,255,255
    DEFB    249,249,249,224,208,176,176,177
    DEFB    129,208,178,242,230,206,158,142
    DEFB    255,255,255,252,250,246,246,246
    DEFB    224,218,182,062,188,121,243,241
    DEFB    255,255,127,127,127,127,127,127
    DEFB    061,059,051,011,023,015,063,063
    DEFB    031,015,079,079,207,207,207,199
    DEFB    255,255,255,255,255,255,255,255
end asm
helicopter:
asm
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,159,064,035,156,255,255
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,255,255,255,000,000,254
    DEFB    248,247,239,015,239,111,143,247
    DEFB    248,251,245,192,255,255,255,255
    DEFB    255,255,255,255,255,000,000,127
    DEFB    031,015,007,007,007,247,247,239
    DEFB    031,223,235,007,255,255,255,255
end asm
police2:
asm
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,254,253,192,128,173,243,255
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,255,255,255,255,255,239
    DEFB    215,001,238,016,056,017,255,255
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,255,003,001,107,159,255
    DEFB    255,255,255,255,255,255,255,255
end asm

civilans:
asm
    DEFB    255,255,255,255,255,255,227,224
    DEFB    226,243,241,241,225,243,225,192
    DEFB    128,131,240,243,243,227,255,255
    DEFB    255,255,254,254,254,255,246,249
    DEFB    125,255,255,248,247,243,251,249
    DEFB    125,187,127,127,255,255,255,255
    DEFB    255,255,063,063,063,063,015,051
    DEFB    039,063,063,063,159,207,231,243
    DEFB    251,247,255,255,255,255,255,255
end asm

civcar:
asm
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,252,252,252,248,250,255
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,255,255,255,255,255,255
    DEFB    193,000,084,085,000,000,210,063
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,255,255,255,255,255,255
    DEFB    255,255,255,063,015,007,215,063
    DEFB    255,255,255,255,255,255,255,255
end asm

park:
asm
    DEFB    255,255,255,255,255,255,255,255
    DEFB    008,042,170,170,170,170,170,170
    DEFB    042,028,028,028,028,028,028,062
    DEFB    255,255,255,255,255,255,255,255
    DEFB    000,000,128,128,128,128,160,160
    DEFB    112,168,113,171,115,171,115,249
    DEFB    255,255,255,255,255,255,255,255
    DEFB    000,000,000,008,008,028,008,028
    DEFB    042,028,042,156,170,136,156,062
end asm


fire:
asm
    DEFB    000,000,000,000,032,016,016,016
    DEFB    024,030,014,003,003,007,007,015
    DEFB    014,027,027,051,251,255,127,063
    DEFB    000,000,000,000,000,000,016,048
    DEFB    032,032,104,076,196,134,003,003
    DEFB    003,135,199,225,225,115,247,255
    DEFB    000,000,128,192,068,196,068,068
    DEFB    108,014,012,028,028,028,030,028
    DEFB    028,190,246,254,094,015,254,254

end asm

GoshiraL1:
asm
    DEFB    255,255,255,255,255,255,254,255
    DEFB    254,255,254,255,240,239,216,182
    DEFB    113,117,109,158,254,254,255,255
    DEFB    254,253,251,243,138,085,132,069
    DEFB    146,096,164,069,194,087,103,035
    DEFB    028,087,179,241,251,253,110,118
    DEFB    239,119,023,123,043,091,247,239
    DEFB    239,119,051,125,186,187,187,254
    DEFB    177,091,205,197,173,245,237,219
end asm
GoshiraL2:
asm
    DEFB    255,255,255,255,255,255,254,255
    DEFB    254,255,254,255,240,239,216,182
    DEFB    113,117,109,158,254,254,255,255
    DEFB    254,253,251,243,138,085,132,069
    DEFB    146,096,164,069,194,087,103,035
    DEFB    028,087,179,241,251,253,110,118
    DEFB    239,119,023,123,043,091,247,239
    DEFB    239,119,051,125,186,187,187,254
    DEFB    177,091,205,197,173,245,237,219

    DEFB    255,255,255,255,255,255,253,253
    DEFB    248,252,252,241,240,254,254,253
    DEFB    252,253,252,191,159,166,200,225
    DEFB    255,252,250,245,202,212,152,102
    DEFB    175,109,078,087,009,023,171,016
    DEFB    040,148,170,092,042,085,171,103
    DEFB    063,063,159,079,191,255,127,127
    DEFB    127,127,255,127,191,127,255,127
    DEFB    127,063,063,095,159,079,175,143
end asm
GoshiraD1:
asm
    DEFB    255,255,255,255,255,255,254,253
    DEFB    254,253,225,159,108,125,231,235
    DEFB    219,059,251,251,251,251,251,247
    DEFB    239,223,208,189,170,055,191,047
    DEFB    170,079,157,165,247,255,202,194
    DEFB    039,063,031,063,253,250,247,247
    DEFB    191,223,095,239,175,103,235,165
    DEFB    171,149,205,046,121,253,159,030
    DEFB    037,230,198,230,254,254,126,127
end asm
GoshiraR1:
ASM
    DEFB    247,239,232,222,212,219,239,247
    DEFB    247,238,206,191,093,221,223,127
    DEFB    143,219,179,183,191,191,191,223
    DEFB    127,191,223,199,088,171,161,162
    DEFB    073,070,047,162,075,255,230,197
    DEFB    058,235,205,223,255,255,126,126
    DEFB    255,255,255,255,255,127,127,255
    DEFB    127,255,127,255,015,247,027,109
    DEFB    142,174,182,121,127,127,255,255
end asm
GoshiraU1:
asm
    DEFB    255,255,255,254,254,252,250,253
    DEFB    250,253,250,244,234,235,239,247
    DEFB    240,244,244,244,247,247,247,239
    DEFB    190,127,065,193,170,085,170,000
    DEFB    042,000,008,000,171,001,130,004
    DEFB    012,017,147,247,255,239,209,221
    DEFB    255,127,127,191,191,031,175,095
    DEFB    047,095,047,247,027,045,125,126
    DEFB    238,246,177,183,247,247,247,251
end asm

SquidL1:
asm
    DEFB    024,024,024,024,056,056,120,120
    DEFB    120,240,240,240,240,120,124,062
    DEFB    031,031,015,003,001,135,127,127
    DEFB    000,048,060,062,062,127,255,255
    DEFB    245,245,255,255,255,255,126,062
    DEFB    127,255,255,255,255,255,255,128
    DEFB    000,000,000,003,015,015,015,014
    DEFB    142,143,143,143,143,015,014,014
    DEFB    142,254,254,252,252,000,254,031
end asm

title: '30x14, compressed
asm
    DEFB    000,199,001,007,143,028,056,181
    DEFB    120,079,255,248,255,252,124,062
    DEFB    251,030,031,007,003,000,005,068
    DEFB    255,255,125,192,128,136,061,234
    DEFB    128,144,223,255,130,163,144,252
    DEFB    255,145,015,052,236,001,199,235
    DEFB    001,003,015,216,255,254,042,175
    DEFB    031,128,039,255,028,002,006,015
    DEFB    222,030,014,255,254,142,134,143
    DEFB    015,063,127,000,193,117,255,056
    DEFB    143,252,030,178,008,022,121,192
    DEFB    011,174,145,254,126,060,145,255
    DEFB    028,204,252,062,115,252,031,216
    DEFB    007,002,046,191,144,127,063,031
    DEFB    015,014,030,040,252,255,031,063
    DEFB    111,206,216,140,008,046,188,144
    DEFB    001,002,004,012,124,006,003,016
    DEFB    029,241,180,189,008,012,015,004
    DEFB    134,072,186,003,247,007,030,078
    DEFB    074,071,255,121,116,156,152,106
    DEFB    239,209,252,012,159,057,149,224
    DEFB    112,056,136,027,024,017,176,227
    DEFB    189,148,031,241,063,248,240,128
    DEFB    217,158,116,143,192,240,236,242
    DEFB    123,031,149,237,240,038,255,112
    DEFB    255,048,039,120,121,115,222,119
    DEFB    124,244,160,120,241,027,248,252
    DEFB    012,123,053,001,098,127,199,044
    DEFB    232,076,209,124,038,056,028,014
    DEFB    015,113,099,006,187,165,236,083
    DEFB    133,239,144,129,243,247,241,075
    DEFB    085,016,083,153,211,131,016,055
    DEFB    225,216,227,199,255,215,052,034
    DEFB    255,129,006,205,247,093,007,015
    DEFB    025,225,057,048,001,097,012,024
    DEFB    133,096,078,255,051,062,012,204
    DEFB    090,224,224,032,255,096,125,240
    DEFB    243,231,238,248,235,244,240,214
    DEFB    241,248,060,144,075,215,192,017
    DEFB    226,025,253,114,224,144,255,236
    DEFB    236,252,124,088,192,124,215,112
    DEFB    056,028,030,113,099,012,132,150
    DEFB    255,062,026,243,197,008,025,248
    DEFB    059,124,248,056,024,194,152,032
    DEFB    120,224,027,255,124,023,226,013
    DEFB    249,252,219,140,112,132,037,251
    DEFB    236,207,012,007,052,117,144,192
    DEFB    240,124,194,240,074,037,013,044
    DEFB    073,024,105,072,224,204,048,024
    DEFB    036,014,175,253,002,243,118,214
    DEFB    048,224,073,229,133,090,112,095
    DEFB    062,241,047,125,112,224,241,192
    DEFB    064,133,129,096,057,216,031,014
    DEFB    163,146,004,012,247,029,062,124
    DEFB    028,007,108,092,079,113,104,133
    DEFB    154,112,211,048,112,255,096,032
    DEFB    005,027,248,117,194,206,237,248
    DEFB    124,126,197,028,144,096,248,190
    DEFB    142,117,095,036,235,022,012,188
    DEFB    021,193,115,092,112,048,124,223
    DEFB    142,172,129,253,146,140,165,150
    DEFB    250,159,011,122,112,059,043,030
    DEFB    062,153,035,134,142,035,041,034
    DEFB    029,143,152,206,252,028,232,014
    DEFB    058,048,164,081,215,112,056,126
    DEFB    230,220,131,001,255,071,244,061
    DEFB    249,131,230,126,056,130,158,172
    DEFB    112,001,148,255,129,120,193,244
    DEFB    192,255,142,128,253,150,059,253
    DEFB    009,250,112,091,239,102,156,255
    DEFB    144,017,221,184,030,248,089,253
    DEFB    159,208,095,066,226,014,031,062
    DEFB    187,195,175,251,030,158,206,142
    DEFB    009,182,192,195,223,035,171,255
    DEFB    189,174,006,119,152,171,046,060
    DEFB    144,024,062,111,135,162,149,253
    DEFB    071,145,001,075,246,207,005,108
    DEFB    149,040,159,231,183,252,030,103
    DEFB    124,027,189,252,246,195,176,231
    DEFB    084,094,145,192,255,093,127,003
    DEFB    220,254,031,247,225,120,244,251
    DEFB    252,193,243,223,206,005,117,033
    DEFB    015,113,160,254,077,199,131,195
    DEFB    143,227,115,231,065,097,099,248
    DEFB    135,015,176,031,086,179,017,110
    DEFB    120,158,192,195,134,140,252,028
    DEFB    031,156,227,255,158,143,246,135
    DEFB    195,225,011,214,016,235,224,248
    DEFB    028,206,104,216,089,056,030,248
    DEFB    246,240,010,182,016,096,016,000
end asm

' MegaLZ Unpacker by Britlion
SUB megaLZDepack(source as uInteger,dest as uInteger)
ASM

LD E,(IX+6)
LD D,(IX+7)

;'Z80 depacker for megalz V4 packed files   (C) fyrex^mhm

;' DESCRIPTION:
;'
;' Depacker is fully relocatable, not self-modifying,
;'it's length is 110 bytes starting from DEC40.
;'Register usage: AF,AF',BC,DE,HL. Must be CALL'ed, return is done by RET.
;'Provide extra stack location for store 2 bytes (1 word). Depacker does not
;'disable or enable interrupts, as well as could be interrupted at any time
;'(no f*cking wicked stack usage :).

;' USAGE:
;'
;' - put depacker anywhere you want,
;' - put starting address of packed block in HL,
;' - put location where you want data to be depacked in DE,
;'   (much like LDIR command, but without BC)
;' - make CALL to depacker (DEC40).
;' - enjoy! ;)

;' PRECAUTIONS:
;'
;' Be very careful if packed and depacked blocks coincide somewhere in memory.
;'Here are some advices:
;'
;' 1. put packed block to the highest addresses possible.
;'     Best if last byte of packed block has address #FFFF.
;'
;' 2. Leave some gap between ends of packed and depacked block.
;'     For example, last byte of depacked block at #FF00,
;'     last byte of packed block at #FFFF.
;'
;' 3. Place nonpackable data to the end of block.
;'
;' 4. Always check whether depacking occurs OK and neither corrupts depacked data
;'     nor hangs computer.
;'

;'DEC40

        LD      A,80h
        EX      AF,AF'
MS:     LDI
M0:      LD      BC,2FFh
M1:      EX      AF,AF'
M1X:     ADD     A,A
        JR      NZ,M2
        LD      A,(HL)
        INC     HL
        RLA
M2:      RL      C
        JR      NC,M1X
        EX      AF,AF'
        DJNZ    X2
        LD      A,2
        SRA     C
        JR      C,N1
        INC     A
        INC     C
        JR      Z,N2
        LD      BC,33Fh
        JR      M1

X2:      DJNZ    X3
        SRL     C
        JR      C,MS
        INC     B
        JR      M1
X6:
        ADD     A,C
N2:
        LD      BC,4FFh
        JR      M1
N1:
        INC     C
        JR      NZ,M4
        EX      AF,AF'
        INC     B
N5:      RR      C
        JP     C, END_DEC40
        RL      B
        ADD     A,A
        JR      NZ,N6
        LD      A,(HL)
        INC     HL
        RLA
N6:      JR      NC,N5
        EX      AF,AF'
        ADD     A,B
        LD      B,6
        JR      M1
X3:
        DJNZ    X4
        LD      A,1
        JR      M3
X4:      DJNZ    X5
        INC     C
        JR      NZ,M4
        LD      BC,51Fh
        JR      M1
X5:
        DJNZ    X6
        LD      B,C
M4:      LD      C,(HL)
        INC     HL
M3:      DEC     B
        PUSH    HL
        LD      L,C
        LD      H,B
        ADD     HL,DE
        LD      C,A
        LD      B,0
        LDIR
        POP     HL
        JR      M0
      
      
END_DEC40:

END ASM
END SUB
sub wait(frames as ubyte)
    dim a as ubyte
    for a=0 to frames
        asm
            halt
        end asm
    next a
end sub
SUB paint (x as uByte,y as uByte, width as uByte, height as uByte, attribute as ubyte)
  asm
    ld      a,(IX+7)   ;'ypos
    rrca
    rrca
    rrca               ;' Multiply by 32
    ld      l,a        ;' Pass to L
    and     3          ;' Mask with 00000011
    add     a,88       ;' 88 * 256 = 22528 - start of attributes. Change this if you are working with a buffer or somesuch.
    ld      h,a        ;' Put it in the High Byte
    ld      a,l        ;' We get y value *32
    and     224        ;' Mask with 11100000
    ld      l,a        ;' Put it in L
    ld      a,(IX+5)   ;' xpos
    add     a,l        ;' Add it to the Low byte
    ld      l,a        ;' Put it back in L, and we're done. HL=Address.

    push HL            ;' save address
    LD A, (IX+13)      ;' attribute
    LD DE,32
    LD c,(IX+11)       ;' height

    BLPaintHeightLoop:
    LD b,(IX+9)        ;' width

    BLPaintWidthLoop:
    LD (HL),a          ;' paint a character
    INC L              ;' Move to the right (Note that we only would have to inc H if we are crossing from the right edge to the left, and we shouldn't be needing to do that)
    DJNZ BLPaintWidthLoop

    BLPaintWidthExitLoop:
    POP HL             ;' recover our left edge
    DEC C
    JR Z, BLPaintHeightExitLoop

    ADD HL,DE          ;' move 32 down
    PUSH HL            ;' save it again
    JP BLPaintHeightLoop

    BLPaintHeightExitLoop:

  end asm
END SUB
SUB paintData (x as uByte,y as uByte, width as uByte, height as uByte, address as uInteger)
  asm
    ld      a,(IX+7)   ;'ypos
    rrca
    rrca
    rrca               ;' Multiply by 32
    ld      l,a        ;' Pass to L
    and     3          ;' Mask with 00000011
    add     a,88       ;' 88 * 256 = 22528 - start of attributes. Change this if you are working with a buffer or somesuch.
    ld      h,a        ;' Put it in the High Byte
    ld      a,l        ;' We get y value *32
    and     224        ;' Mask with 11100000
    ld      l,a        ;' Put it in L
    ld      a,(IX+5)   ;' xpos
    add     a,l        ;' Add it to the Low byte
    ld      l,a        ;' Put it back in L, and we're done. HL=Address.

    push HL            ;' save address
    LD D, (IX+13)
    LD E, (IX+12)
    LD c,(IX+11)       ;' height

    BLPaintDataHeightLoop:
    LD b,(IX+9)        ;' width

    BLPaintDataWidthLoop:
    LD a,(DE)
    LD (HL),a          ;' paint a character
    INC L              ;' Move to the right (Note that we only would have to inc H if we are crossing from the right edge to the left, and we shouldn't be needing to do that)
    INC DE
    DJNZ BLPaintDataWidthLoop

    BLPaintDataWidthExitLoop:
    POP HL             ;' recover our left edge
    DEC C
    JR Z, BLPaintDataHeightExitLoop
    PUSH DE
    LD DE,32
    ADD HL,DE          ;' move 32 down
    POP DE
    PUSH HL            ;' save it again
    JP BLPaintDataHeightLoop

    BLPaintDataHeightExitLoop:

  end asm
END SUB  
SUB putChars(x as uByte,y as uByte, width as uByte, height as uByte, dataAddress as uInteger)
  asm
    BLPutChar:
      LD      a,(IX+5)
      ;AND     31
      ld      l,a
      ld      a,(IX+7) ;' Y value
      ld      d,a
      AND     24
      add     a,64 ;' 256 byte "page" for screen - 256*64=16384. Change this if you are working with a screen address elsewhere, such as a buffer.
      ld      h,a
      ld      a,d
      AND     7
      rrca
      rrca
      rrca
      OR      l
      ld      l,a

      PUSH HL ;' save our address

      LD E,(IX+12) ;' data address
      LD D,(IX+13)
      LD B,(IX+9) ;' width
      PUSH BC ;' save our column count

      BLPutCharColumnLoop:

      LD B,(IX+11) ;' height

      BLPutCharInColumnLoop:
      
      ;' gets screen address in HL, and bytes address in DE. Copies the 8 bytes to the screen
      ld a,(DE) ;' First Row
      LD (HL),a
      
      INC DE
      INC H
      ld a,(DE)
      LD (HL),a ;' second Row
      
      INC DE
      INC H
      ld a,(DE)
      LD (HL),a ;' Third Row
      
      INC DE
      INC H
      ld a,(DE)
      LD (HL),a ;' Fourth Row
      
      INC DE
      INC H
      ld a,(DE)
      LD (HL),a ;' Fifth Row
      
      INC DE
      INC H
      ld a,(DE)
      LD (HL),a ;' Sixth Row
      
      INC DE
      INC H
      ld a,(DE)
      LD (HL),a ;' Seventh Row
      
      INC DE
      INC H
      ld a,(DE)
      LD (HL),a ;' Eigth Row
      
      INC DE ;' Move to next data item.
      
      DEC B
      JR Z,BLPutCharNextColumn
      ;'The following code calculates the address of the next line down below current HL address.
      PUSH DE ;' save DE
      ld   a,l  
      and  224  
      cp   224  
      jp   z,BLPutCharNextThird

      BLPutCharSameThird:
                ld   de,-1760
                ;'and  a        
                add  hl,de    
        POP DE ;' get our data point back.
        jp BLPutCharInColumnLoop

      BLPutCharNextThird:
        ld   de,32    
        ;'and  a
        add  hl,de  
        POP DE ;' get our data point back.
        JP BLPutCharInColumnLoop

      BLPutCharNextColumn:
        POP BC
        POP HL
        DEC B
        JP Z, BLPutCharsEnd

        INC L   ;' Note this would normally be Increase HL - but block painting should never need to increase H, since that would wrap around.
        PUSH HL
        PUSH BC
        JP BLPutCharColumnLoop

            BLPutCharsEnd:
  end asm
END SUB
SUB clearBox(x AS UBYTE, y AS UBYTE, width AS UBYTE, height AS UBYTE)
' This subroutine will blank the pixels for a box, measured in Character Squares
' from print positions X,Y to X+Width, Y+height.
'
' Expected to be useful for clearing a window of space - perhaps in a game.
' because of this THE ERROR CHECKING IS NONEXISTENT.
' Please make sure you send sensible data -
' 0<x<32, 0<y<23, x+width<32 and y+height<23
' Britlion 2012.

ASM
    ld b,(IX+5)         ;' get x value
    ld c,(IX+7)        ;' get y value

    ld a, c        ;' Set HL to screen byte for this character.    
    AND 24        ;'   |
    OR 64        ;'   |
    ld h, a        ;'   |
    ld a, c        ;'   |
    AND 7        ;'   |
    rra        ;'   |
    rra        ;'   |
    rra        ;'   |
    rra        ;'   |
    add a, b    ;'   |
    ld l, a        ;'   v

    ld b, (IX+11)   ;' get height
    ld c,(IX+9)     ;' get width        

clearbox_outer_loop:
    XOR a
    push bc     ;' save height.
    push hl     ;' save screen address.
    ld d, 8     ;' 8 rows to a character.

    clearbox_mid_loop:
        ld e,l       ;' save screen byte lower half.
        ld b,c       ;' get width.

        clearbox_inner_loop: ld (hl), a    ;' write out a zero to the screen.
        inc l            ;' go right.
    djnz clearbox_inner_loop    ;' repeat.

        ld l,e       ;' recover screen byte
        inc h             ;' down a row

    dec d
    jp nz, clearbox_mid_loop  ;' repeat for this row.

    pop hl             ;' get back address at start of line
    pop bc             ;' get back char count.

    ld a, 32         ;' Go down to next character row.
    add a, l         ;'
    ld l, a              
    jp nc, clearbox_row_skip      

    ld a, 8              
    add a, h        
    ld h, a              

    clearbox_row_skip:

djnz clearbox_outer_loop
END ASM
END SUB
SUB BLWindowScrollUp(X AS UBYTE,Y AS UBYTE,Width AS UBYTE,Height AS UBYTE)
ASM
;'Routine FOR printing AND scrolling text in any
;'window, anywhere on the screen.

;'Main scrolling routine
BLWindowScrollUp:
EX AF, AF'
LD   A,(IX+11)  ;'(ROWS) Store # of Lines in A'
EX AF,AF'

LD   HL,BLWindowScrollUpScreenTable    ;'Start of address table
LD   C,(IX+7)   ;'(Y) Move the "pointer" TO the
LD   B,0         ;'appropriate position in the table
ADD  HL,BC       ;'and store it in (BLWindowScrollPOINT)
ADD  HL,BC
LD   (BLWindowScrollUpPOINT),HL  ;'Pointer position stored
BLWindowScrollUpLOOP:
    LD   HL,(BLWindowScrollUpPOINT)
    LD   E,(HL)
    INC  HL
    LD   D,(HL)

    ;'Address of start of screen line now in DE
    LD A,(IX+5) ;(X)
    ADD A,E
    LD E,A

    ;'Address of left-hand side of window now in DE
    EX AF,AF'
    DEC  A
    JP   Z,BLWindowScrollUpBLANK     ;'Quit this LOOP IF we have
    EX AF,AF'
    INC  HL          ;'Move the pointer TO the NEXT item
    LD   (BLWindowScrollUpPOINT),HL  ;'in the table. SAVE position
    LD   C,(HL)
    INC  HL
    LD   B,(HL)      ;'Start of NEXT line down in BC
    LD   L,(IX+5)    ;' (X)
    LD   H,0
    ADD  HL,BC
    ;'HL now points TO the screen address 8 pixels below
    ;'the one held in DE
    LD   B,8         ;'8 pixel lines TO be transferred
    ;'Now move 8 pixel lines up the screen by 8 pixels

    BLWindowScrollUpTRANS:
        LD A,B ; SAVE B
        LD   C,(IX+9) ;'(Cols)
        LD   B,0
        PUSH HL
        PUSH DE          ;'Save all registers
        LDIR             ;'Transfer the line of pixels
        POP  DE
        POP  HL

        ;'Move HL AND DE down one pixel
        INC D
        INC H

        LD B,A ;' Recover B

    DJNZ BLWindowScrollUpTRANS
    ;'One line of characters has now been transferred
JP   BLWindowScrollUpLOOP        ;'Back FOR NEXT line of characters

;'Scrolling finished. Now erase last character line
BLWindowScrollUpBLANK:
LD   C,8
LD   L,(IX+9) ;' (COLS)
BLWindowScrollUpLOOP2:
    PUSH DE    
    LD   B,L ;'(IX+11) - Cols
    XOR  A
    BLWindowScrollUpLOOP3:
        LD   (DE),A
        INC E
    DJNZ BLWindowScrollUpLOOP3
    POP  DE
    INC D
    DEC C
    JR NZ, BLWindowScrollUpLOOP2
;'DJNZ BLWindowScrollUpLOOP2
JP BLWindowScrollEnd


BLWindowScrollUpPOINT:  DEFW 0

BLWindowScrollUpScreenTable:
       DEFW 16384
       DEFW 16416
       DEFW 16448
       DEFW 16480
       DEFW 16512
       DEFW 16544
       DEFW 16576
       DEFW 16608
       DEFW 18432
       DEFW 18464
       DEFW 18496
       DEFW 18528
       DEFW 18560
       DEFW 18592
       DEFW 18624
       DEFW 18656
       DEFW 20480
       DEFW 20512
       DEFW 20544
       DEFW 20576
       DEFW 20608
       DEFW 20640
       DEFW 20672
       DEFW 20704
BLWindowScrollEnd:
END ASM
END SUB
sub waitkey()
    asm
    waitkey1:
        xor a
        in a,($fe)
        cpl
        and %00011111
        jr z,waitkey1
    end asm
end sub
sub WaitNoKey()
    asm
        waitnokey1:
        xor a
        in a,($fe)
        cpl
        and %00011111
        jr nz,waitnokey1
    end asm
end sub
sub CopyMem(src as Uinteger,des as Uinteger,length as Uinteger)
    poke uinteger @CopyMemory+1,src
    poke uinteger @CopyMemory+4,des
    poke uinteger @CopyMemory+7,length
    CopyMemory:
    asm
        ld hl,1
        ld de,2
        ld bc,3
        ldir
    end asm
end sub
sub FillMem(mem as Uinteger,size as Uinteger,byt as Ubyte)
    poke uinteger @FillMemory+1,mem
    poke @FillMemory+4,byt
    poke uinteger @FillMemory+6,mem+1
    poke uinteger @FillMemory+9,size-1
    FillMemory:
    asm
        ld hl,1
        ld (hl),2
        ld de,3
        ld bc,4
        ldir
    end asm
end sub
sub drawmap(x as ubyte,y as ubyte)
    dim x1,y1 as ubyte
    dim adr as Uinteger
    for y1=0 to 7
        adr=@buffer+x+(y+y1)*32
        for x1=0 to 7
            putChars(x1*3,y1*3,3,3,tiles(peek(adr+x1)))
        next x1
    next y1
end sub
sub monster(posx as ubyte,posy as ubyte,monster as ubyte,direction as ubyte)
    dim adr as uinteger
    if monster=0
        if direction=0 'N
            if alt=0
                adr=@GoshiraU1
            elseif alt=1
                adr=@GoshiraU1
            end if
        elseif direction=1 'W
            if alt=0
                adr=@GoshiraL1
            elseif alt=1
                adr=@GoshiraL2
            end if
        elseif direction=2 'S
            if alt=0
                adr=@GoshiraD1
            elseif alt=1
                adr=@GoshiraD1
            end if
        elseif direction=3 'E
            if alt=0
                adr=@GoshiraR1
            elseif alt=1
                adr=@GoshiraR1
            end if
        end if
    
    end if
    
    putChars(posx*3,posy*3,3,3,adr)
    paint(posx*3,posy*3,3,3,32)
    alt=1-alt
end sub
sub deletemonster(monsterx as ubyte,monstery as ubyte)
    putChars(monsterx*3,monstery*3,3,3,@void)
    paint(monsterx*3,monstery*3,3,3,7)
    if gettile(monsterx,monstery)=5
        settile(monsterx,monstery,4)
    end if
    putChars(monsterx*3,monstery*3,3,3,@Schutt)
end sub
sub status()
    ink 7
    print at 1,24;directionstring$(winddir)
    print at 4,24;directionstring$(headingdir)
end sub
function gettile(x as ubyte,y as ubyte) as ubyte
    return peek(@buffer+y*32+x)
end Function
sub settile(x as ubyte,y as ubyte,tile as ubyte)
    poke @buffer+y*32+x,tile
    putChars(monsterx*3,monsterx*3,3,3,@void)
end sub

start:
border 0: ink 7:paper 0:bright 0: flash 0: inverse 0:over 0:cls
megaLZDepack(@title,@buffer)
putChars(1,1,30,14,@buffer)

Dim font (767) As uByte => { _
      0,  0,  0,  0,  0,  0,  0,  0, _
     24, 24, 24, 24, 24,  0, 24,  0, _
    102,102,102,  0,  0,  0,  0,  0, _
      0,108,254,108,108,254,108,  0, _
     24, 62, 96, 60,  6,124, 24,  0, _
      0,102,108, 24, 48,102, 70,  0, _
     56,108, 56,112,222,204,118,  0, _
     24, 24, 24,  0,  0,  0,  0,  0, _
     14, 28, 24, 24, 24, 28, 14,  0, _
    112, 56, 24, 24, 24, 56,112,  0, _
      0,102, 60,255, 60,102,  0,  0, _
      0, 24, 24,126, 24, 24,  0,  0, _
      0,  0,  0,  0,  0, 48, 48, 96, _
      0,  0,  0,126,  0,  0,  0,  0, _
      0,  0,  0,  0,  0, 24, 24,  0, _
      2,  6, 12, 24, 48, 96, 64,  0, _
     60,102,110,118,102,102, 60,  0, _
     24, 56, 24, 24, 24, 24,126,  0, _
     60,102,  6, 12, 24, 48,126,  0, _
    126, 12, 24, 12,  6,102, 60,  0, _
     12, 28, 60,108,126, 12, 12,  0, _
    126, 96,124,  6,  6,102, 60,  0, _
     60, 96, 96,124,102,102, 60,  0, _
    126,  6, 12, 24, 48, 48, 48,  0, _
     60,102,102, 60,102,102, 60,  0, _
     60,102,102, 62,  6, 12, 56,  0, _
      0, 24, 24,  0, 24, 24,  0,  0, _
      0, 24, 24,  0, 24, 24, 48,  0, _
      6, 12, 24, 48, 24, 12,  6,  0, _
      0,  0,126,  0,  0,126,  0,  0, _
     96, 48, 24, 12, 24, 48, 96,  0, _
     60,102,  6, 12, 24,  0, 24,  0, _
     60,102,110,106,110, 96, 62,  0, _
     24, 60,102,102,126,102,102,  0, _
    124,102,102,124,102,102,124,  0, _
     60,102, 96, 96, 96,102, 60,  0, _
    120,108,102,102,102,108,120,  0, _
    126, 96, 96,124, 96, 96,126,  0, _
    126, 96, 96,124, 96, 96, 96,  0, _
     62, 96, 96,110,102,102, 62,  0, _
    102,102,102,126,102,102,102,  0, _
     60, 24, 24, 24, 24, 24, 60,  0, _
      6,  6,  6,  6,  6,102, 60,  0, _
    102,108,120,112,120,108,102,  0, _
     96, 96, 96, 96, 96, 96,126,  0, _
    198,238,254,214,198,198,198,  0, _
    102,118,126,126,110,102,102,  0, _
     60,102,102,102,102,102, 60,  0, _
    124,102,102,124, 96, 96, 96,  0, _
     60,102,102,102,118,108, 54,  0, _
    124,102,102,124,108,102,102,  0, _
     60,102, 96, 60,  6,102, 60,  0, _
    126, 24, 24, 24, 24, 24, 24,  0, _
    102,102,102,102,102,102, 62,  0, _
    102,102,102,102,102, 60, 24,  0, _
    198,198,198,214,254,238,198,  0, _
    102,102, 60, 24, 60,102,102,  0, _
    102,102,102, 60, 24, 24, 24,  0, _
    126,  6, 12, 24, 48, 96,126,  0, _
     30, 24, 24, 24, 24, 24, 30,  0, _
     64, 96, 48, 24, 12,  6,  2,  0, _
    120, 24, 24, 24, 24, 24,120,  0, _
     16, 56,108,198,  0,  0,  0,  0, _
      0,  0,  0,  0,  0,  0,254,  0, _
      0,192, 96, 48,  0,  0,  0,  0, _
      0,  0, 60,  6, 62,102, 62,  0, _
     96, 96,124,102,102,102,124,  0, _
      0,  0, 60, 96, 96, 96, 60,  0, _
      6,  6, 62,102,102,102, 62,  0, _
      0,  0, 60,102,126, 96, 60,  0, _
     28, 48,124, 48, 48, 48, 48,  0, _
      0,  0, 62,102,102, 62,  6,124, _
     96, 96,124,102,102,102,102,  0, _
     24,  0, 56, 24, 24, 24, 60,  0, _
     24,  0, 24, 24, 24, 24, 24,112, _
     96, 96,102,108,120,108,102,  0, _
     56, 24, 24, 24, 24, 24, 60,  0, _
      0,  0,236,254,214,198,198,  0, _
      0,  0,124,102,102,102,102,  0, _
      0,  0, 60,102,102,102, 60,  0, _
      0,  0,124,102,102,102,124, 96, _
      0,  0, 62,102,102,102, 62,  6, _
      0,  0,124,102, 96, 96, 96,  0, _
      0,  0, 62, 96, 60,  6,124,  0, _
      0, 24,126, 24, 24, 24, 14,  0, _
      0,  0,102,102,102,102, 62,  0, _
      0,  0,102,102,102, 60, 24,  0, _
      0,  0,198,198,214,124,108,  0, _
      0,  0,102, 60, 24, 60,102,  0, _
      0,  0,102,102,102, 62,  6,124, _
      0,  0,126, 12, 24, 48,126,  0, _
     14, 24, 24, 48, 24, 24, 14,  0, _
     24, 24, 24, 24, 24, 24, 24, 24, _
    112, 24, 24, 12, 24, 24,112,  0, _
      0, 96,242,158, 12,  0,  0,  0, _
      0, 24, 24, 52, 52, 98,126,  0 _
}
Poke uInteger 23606, (@font (0)) - 256
dim mapx,mapy as ubyte

print at 16,2;"Monster";at 22,0;"\{i1}by LCD using ZX BASIC Compiler."

waitkey()

cls
paint(24,0,8,24,15)
paper 1:ink 5
print at 0,24;"WIND"
print at 3,24;"HEADING"
print at 6,24;"TIME"
print at 9,24;"HEADTILT"
mapx=0:mapy=0
monsterx=1
monstery=1
CopyMem(@mapSF,@buffer,1024)
drawmap(0,0)

gameloop8:
WaitNoKey()
status()
monster(monsterx,monstery,0,headingdir)
gameloop9:
key$=inkey$
if key$="l"
    headingdir=headingdir+1:if headingdir=4:headingdir=0:end If
    goto gameloop8
elseif key$="r"
    headingdir=headingdir-1:if headingdir=-1:headingdir=3:end If
    goto gameloop8
elseif key$="m"
    deletemonster(monsterx,monstery)
    
    if headingdir=0 and monstery>0 and (gettile(monsterx,monstery-1)=0 or gettile(monsterx,monstery-1)=1)
        monstery=monstery-1
    elseif headingdir=2 and monstery<31
        monstery=monstery+1
    elseif headingdir=1 and monsterx<7
        monsterx=monsterx+1
    elseif headingdir=3 and monsterx>0
        monsterx=monsterx-1
    elseif headdir=1 and monsterx>6
        monsterx=0
        mapx=mapx+8
        drawmap(mapx,mapy)
    
    end if
    goto gameloop8
end if
goto gameloop9
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
Thanks, will test it.
Also, the new syntax allows directly initializing arrays with complex constant expressions like @labels or @label + 2 * @label3. So, try you could replace:

Code:
DIM tiles(16) as Uinteger: REM <== Positions 10..16 are not used??

tiles(0)=@void
tiles(1)=@Sea
tiles(2)=@Bridge
tiles(3)=@Park
tiles(4)=@Schutt
tiles(5)=@skyscraper

tiles(6)=@car
tiles(7)=@PoliceCar
tiles(8)=@People
tiles(9)=@house
to
Code:
DIM tiles(9) as UInteger => { @void, @Sea, @Bridge, _
    @Park, @Schutt, @skyscraper, _
    @car, @PoliceCar, @People, @house }

:!: Notice that in the 2nd way, it's an initialization, so the number of elements of the array (0 .. 9 => 10) must match the number of elements between brackets.
(cannot test it at this moment, but should work)
Reply
boriel Wrote:Thanks, will test it.
Also, the new syntax allows directly initializing arrays with complex constant expressions like @labels or @label + 2 * @label3. So, try you could replace:

Code:
DIM tiles(16) as Uinteger: REM <== Positions 10..16 are not used??

tiles(0)=@void
tiles(1)=@Sea
tiles(2)=@Bridge
tiles(3)=@Park
tiles(4)=@Schutt
tiles(5)=@skyscraper

tiles(6)=@car
tiles(7)=@PoliceCar
tiles(8)=@People
tiles(9)=@house
to
Code:
DIM tiles(9) as UInteger => { @void, @Sea, @Bridge, _
    @Park, @Schutt, @skyscraper, _
    @car, @PoliceCar, @People, @house }

:!: Notice that in the 2nd way, it's an initialization, so the number of elements of the array (0 .. 9 => 10) must match the number of elements between brackets.
(cannot test it at this moment, but should work)

Looks like very useful feature. I will test it later with some other Programs.
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply
LCD Wrote:Oh, Found a bug, I think:
Code:
Traceback (most recent call last):
  File "D:\Restliche Programme\zxbasic\zxb.py", line 339, in <module>
    sys.exit(main())  # Exit
  File "D:\Restliche Programme\zxbasic\zxb.py", line 244, in main
    debug=(OPTIONS.Debug.value > 2))
  File "D:\Restliche Programme\zxbasic\ply\yacc.py", line 328, in parse
    return self.parseopt(input, lexer, debug, tracking, tokenfunc)
  File "D:\Restliche Programme\zxbasic\ply\yacc.py", line 820, in parseopt
    p.callable(pslice)
  File "D:\Restliche Programme\zxbasic\zxbparser.py", line 2461, in p_addr_of_id
    entry.accessed = True
  File "D:\Restliche Programme\zxbasic\symbols\label.py", line 39, in accessed
    for entry in self.scope_owner:
  File "D:\Restliche Programme\zxbasic\symbols\label.py", line 44, in scope_owner
    return list(self._scope_owner)
AttributeError: 'SymbolLABEL' object has no attribute '_scope_owner'
That was without optimizer, in this code:
Code:
dim tiles(16) as uinteger
tiles(0)=@void
...
Next time better post the bugs in the Bug Reports folder in the forum.
I think this one is fixed (the -O3 one still pending).
Can you download one of these beta-versions and test if it works, please?  Rolleyes

http://boriel.com/files/zxb/zxbasic-1.8....-win32.zip
http://boriel.com/files/zxb/zxbasic-1.8.1-beta3.tar.gz
http://boriel.com/files/zxb/zxbasic-1.8.1-beta3.zip
Reply
LCD Wrote:
boriel Wrote:Ok. This seems to be with -O3. Using -O2 or lower should give no problems.
That's true.
Today I made a big progress with BorIDE. Custom loader (Counter Load) works also too. Hope to release it soon.

Ok, I think I've fixed it.
Can you download and check from here, please??  Rolleyes

http://boriel.com/files/zxb/zxbasic-1.8....-win32.zip
http://boriel.com/files/zxb/zxbasic-1.8.1-beta3.tar.gz
http://boriel.com/files/zxb/zxbasic-1.8.1-beta3.zip

These include the fix from the other patch (crash with -O2 with the other source).
Try this and tell me.
Reply
Yes, you are right. I should have post it in the bug section.
Next time I will do so.
Will check the new compiler ASAP (New project from my job started, and one improvement screwed my linking code). Will try to fix it today after work.
But I think, the improvement was worth it.
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)