I'm trying to program a game for the +2A/+2B/+3, so I can use more RAM. Thanks to a lot of info I found on the forums, I manage to access all memory banks with this:
Code:
asm
di
end asm
poke 23388,16 + bank_number : OUT 32765,16 + bank_number
asm
ei
end asm
Question is, I don't know how to efectively save and retrieve data in the 45152-65535 address range. I prepared some programs just with data arrays, saved with something like SAVE "databank6" CODE 49151,16384 and then load it from the main program but no data is restored, so I assume I'm doing it wrong and saving no data at all.
How can it be achieved? Thanks in advance an regards.
With some help from boriel & britlion (thank you both!) I've just finished another game: O-Puzz Attack!!, a game inspired in the Panel de Pon/Tetris Attack/Puzzle League series by Nintendo. Two game modes, nine levels of difficulty and more awaits!
Attached to this post is a .7zip file with the playable .TAP, the cassette inlay, the source code and a readme.txt . I've enjoyed so much making this game, but I think this can be my last "one-screen-skill-game" and start with other kinds of games, like adventures, platforms or even simulation
AFAIK, poking 23617 address with 128 locks the CAPS in BASIC. I'm trying this inside the compiler but only works with a bunch of keys, while using others (like W, Z or X) shows garbage instead of the CAPS.
Is there any other way to force CAPS inside ZX Basic? I already tried all possible values 0 to 255) with no luck.
In order to control a 8x16 sprite, I'm using the MultiKeys function to read keyboard/Sinclair II input in a form of a subroutine inside the program. Problem is, the control experience is abrupt at its best, because keyboard is only read each time the subroutine is called. I'm trying to adjust it calling the subroutine in several places of the program, but it's not enough good to have a steady sprite control performance.
Any advice regards keyboard/sprite control, or it's just about to detect good places in the program to call the keyboard subroutine?
Although is not 100% finished, I have decided to release a beta of the game I'm now working on: a clone of the 80s VTech handheld named Escape. These images compare the original with this version:
Guards' sprites are not finished and they are giving me hard time (I'm using ZX Paintbrush to convert JPGs to UDGs, but they are so tiny and masked that there is almost no detail at all), there are some random crashes and some features are not implemented (all included in the README.txt file) but besides that, I'm trying to simulated all handheld features (clock, chrono, cycles, etc...) For a full comparative, you can download the Escape simulator for Windows from Madrigal's site
As always, attached the .tap with the source code and a readme.txt with instructions and additional info. Any comments and help (especially with the sprites thing) are welcome
' SpaceWorm - em00k
' David Saphier 2018
paper 0 : ink 0: cls :border 0
dim c,sc as uinteger
dim a as float
' Fill screen with some Graphics
for n=1 to 192
print inverse 0;"\.' ";
print inverse 1;"\.' ";
Next
a=1 : ad=1
do
' draws a line of attribs at X=26 Y+7 colour blue (1)
for y=1 to 7
poke 22528+26+(y<<5),1
next
' reads the sin data from sinpos+c and pops into cc
cc=peek(@sinpos+c)+1
' get the current colour and make sure its *8 so it affects the paper
ic=i<<3
' draw the colour ic at X=26 and Y+cc
poke 22528+26+((15-cc)<<5),ic
poke 22528+26+((16-cc)<<5),ic
' increase c to for reading sintable
c=c+ad
' if its bigger than 60, reset the position
if c>60
c=0
endif
' increase mc, used for setting speed
mc=mc+1
if mc>10
' mc was 10 to now we make ad = (speed+sc)
ad=peek(@speed+sc) : sc=sc+1 : mc=0
if sc>13 : sc=0 : endif
endif
' fractional for slower colour changes
a=a+.75
if a>1
i=i+1 : a=0
if i>7 : i=1 : endif
endif
pause 2
asm
; code for copying the attribs from right to left
lin equ 4
len equ 26
ld hl,22529+lin+32
ld de,22528+lin+32
ld bc,len
ldir
ld hl,22529+lin+32+32
ld de,22528+lin+32+32
ld bc,len
ldir
ld hl,22529+lin+32+32+32
ld de,22528+lin+32+32+32
ld bc,len
ldir
ld hl,22529+lin+32+32+32+32
ld de,22528+lin+32+32+32+32
ld bc,len
ldir
ld hl,22529+lin+32+32+32+32+32
ld de,22528+lin+32+32+32+32+32
ld bc,len
ldir
ld hl,22529+lin+32+32+32+32+32+32
ld de,22528+lin+32+32+32+32+32+32
ld bc,len
ldir
ld hl,22529+lin+32+32+32+32+32+32+32
ld de,22528+lin+32+32+32+32+32+32+32
ld bc,len
ldir
end asm
loop
cols:
asm
db 6,6,6,6,6,2
db 70,68,6,6,6,2
db 3,4,5,6,6,2
db 6,6,6,6,6,2
db 3,4,5,6,6,2
end asm
sinpos:
asm
db 2,2,2,1,1,1,1,1,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2
db 2,2,3,3,3,3,3,4,4,4,4,4,4,4,4,4
db 4,4,4,4,4,4,4,4,3,3,3,3,3,2,2,2
end asm
speed:
asm
db 1,1,2,3,4,5,6,5,4,3,2,1,1
end asm
Trying to save some UDGs, I'm looking for a way to mirror an existing sprite/UDG, so I only have to define them one way (i.e. facing sprites left) and, with a function, use those sprites to print them facing right.
I was toying with the hmirror function (<!-- m --><a class="postlink" href="http://www.boriel.com/wiki/en/index.php/ZX_BASIC:HMirror.bas">http://www.boriel.com/wiki/en/index.php ... Mirror.bas</a><!-- m -->) but I can't get it to work
I think I've just found a bug in 1.8.8 (or just my Spectrum emulators doesn't work any more); please, look at this piece of code:
Code:
paper 0: border 0: bright 1: ink 7: cls
DIM y as byte
dim testarray(4,2) as byte
print at 0,0; "Creacion de testarray OK";
for y = 0 to 4
testarray(y,0) = 0
testarray(y,1) = 1
testarray(y,2) = 2
next y
print at 1,0; "Inicializacion de testarray OK";
for y = 0 to 4
print at y+5,0; testarray(y,0);
next y
print at 2,0; "Lectura de valores OK";
If I compile the code without the --debug-array parameter, the code works well; but if the --debug-array parameter is used, the Spectrum can create the "testarray" array, but it can't initialize the arrays values, giving a 3 Subscript wrong, 40:1 error. Array-base is 0, heap-size is 4768 and ORG is 24576, but tried with other values and still fails.
While testing my last game, I come with some issue that makes me wonder if I understood well how OVER works. AFAIK, OVER 0 is the default mode, so if I have...
Code:
OVER 1
PRINT "Hello";
OVER 0
... last OVER 0 will affect all screen and all PRINT, DRAW, CIRCLE, PLOT commands? Affect sprites that are already draw in screen? I had a strange behaviour with the sonar so I had to make a workaround. Anyway, I'd like to know how OVER really works.