Posts: 1,789
Threads: 56
Joined: Aug 2019
Reputation:
25
01-15-2018, 03:12 PM
(This post was last modified: 04-05-2020, 12:41 PM by boriel.)
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 -->
Posts: 615
Threads: 49
Joined: Feb 2009
Reputation:
2
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.
Posts: 615
Threads: 49
Joined: Feb 2009
Reputation:
2
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'
Posts: 1,789
Threads: 56
Joined: Aug 2019
Reputation:
25
This looks like a compiler bug :!:
The code that produces it is the one posted above??
Posts: 615
Threads: 49
Joined: Feb 2009
Reputation:
2
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
Posts: 1,789
Threads: 56
Joined: Aug 2019
Reputation:
25
Ok. This seems to be with -O3. Using -O2 or lower should give no problems.
Posts: 615
Threads: 49
Joined: Feb 2009
Reputation:
2
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.
Posts: 1,789
Threads: 56
Joined: Aug 2019
Reputation:
25
LCD Wrote:Today I made a big progress with BorIDE. Custom loader (Counter Load) works also too. Hope to release it soon. Great!!!
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.
Posts: 615
Threads: 49
Joined: Feb 2009
Reputation:
2
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!!!
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.
Posts: 615
Threads: 49
Joined: Feb 2009
Reputation:
2
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
Posts: 1,789
Threads: 56
Joined: Aug 2019
Reputation:
25
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)
Posts: 615
Threads: 49
Joined: Feb 2009
Reputation:
2
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.
Posts: 1,789
Threads: 56
Joined: Aug 2019
Reputation:
25
01-26-2018, 11:50 PM
(This post was last modified: 04-05-2020, 12:44 PM by boriel.)
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?
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
Posts: 1,789
Threads: 56
Joined: Aug 2019
Reputation:
25
01-28-2018, 11:30 PM
(This post was last modified: 04-05-2020, 12:44 PM by boriel.)
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??
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.
Posts: 615
Threads: 49
Joined: Feb 2009
Reputation:
2
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.
|