Professional Documents
Culture Documents
SUMMARY
When we were kids, even cartoon monsters could scare us to ◊ LM80C Color Computer - part 3 Page 3
death. Did this ever happen to you?
◊ The TMS9918A video chip Page 5
And nowadays, now that we are grown men and women, this ◊ Software compatibility between ZX 81 Page 8
virus has scared us in springtime and still frightens us. And it and ZX Spectrum: monsters & ghosts
paralyses us in many different ways, because it is also a "social" ◊ Alien Attack! From the Amstrad CPC to Page 11
and a "multimedia" virus. A virus that first spread through the C64 equipped with Simons' Basic
rumours and then actually became part of our lives. How can we ◊ Bombs Away! Page 17
get out of this situation? At the moment, we don’t have a vaccine,
a safe therapy. This will require the help of time and medical ◊ A bit of rarity: a treat without trick Page 24
science. Meanwhile, we can at least "fight" the psychological part ◊ The Haunted House ...how to play the Page 27
of the virus with our beloved video games and our glorious same game on 3 different platforms!
vintage computers. ◊ C64: how to disable the keys Page 42
corresponding to joystick switches
According to the World Health Organisation (WHO), the world of ◊ An introduction to AREXX - part 3 Page 44
video games has an effective "therapeutic" power for all of its
users. Dedicating yourself to video games allows you to get ◊ Happy Birthday Monkey Island! Page 47
distracted, you end up engaging yourself in activities that involve ◊ True Lies (SNES) Page 49
and bring social interactivity (just think about the multiplayer ◊ Billy Masters Was Right (PC) Page 50
platforms such as Kaillera). Playing together and sharing
experiences prevents contagion. In fact, it prevents a particular ◊ Project Firestart (C64) Page 51
contagion, which is underestimated but equally dangerous: ◊ Luigi's Mansion (Game Cube) Page 53
loneliness, depression and anxiety. It is not just a question of ◊ Cannon Fodder (Amiga/PC) Page 55
"playing games", but interacting with this incredible universe,
thanks also to the many initiatives that arose during this crazy ◊ Micro Mages (Nes) Page 57
and unexpected pandemic. ◊ Doom (PC) Page 59
◊ Nintendo VS Takeshi (FamiCom) Page 61
In the world of retrocomputing, we have witnessed with interest
the several online challenges on the old classics, the ◊ Stormlord (C64) Page 63
programming competitions using languages such as BASIC (for
example, the competition based on the theme of Alien Attack!
that we at RMW have personally promoted) and the relentless
retro-hardware recovery of so many enthusiasts who repair and
regenerate real gems of the past. All this has allowed us to stay
away from those terrible psychological monsters, even more
frightening than those of horror films or the damage to health
that the virus itself can cause to us and our beloved ones. It is
these fears that we must fight, those same monsters that have
accompanied us over these last hard months.
Well, just a few years ago the WHO stated alarmistically enough People involved in preparing this issue of
that addiction to video games was to be considered as a disease, RetroMagazine World (in no particular order):
they named it "gaming disorder". And now something once
labelled dangerous is becoming a valuable tool that can help us
deal with something much more dangerous. We consider it very • Alberto (Ghostbuster) • Graphics support
Apostolo Irene G. Valeri
positively that the deep qualities of the video games are being
rediscovered , now seen as a means of communication designed • Gianluca Girelli • Cover
Flavio Soldani
to unite rather than isolate. Especially in such a difficult time • Michele "Conte Ugolino"
where we are all indiscriminately subjected to fear and • Proof-reading
• Carlo N. Del Mar Pirazzini Francesco Fiorentini,
uncertainty.
• Daniele Brahimi David La Monaca,
Alberto Apostolo,
Come on, then! The time has come to defeat this "monster" too. • Flavio Soldani Gianluca Girelli, Carlo N.
We now know what to do! Let's start by pressing the power Del Mar Pirazzini,
• Francesco Fiorentini
button of our console or favorite home computer. You'll see that Michele Ugolini
slowly you can turn into a mustache plumber, a spaceship pilot, a • Attilio Capuozzo/RPI
knight in armor, a warrior... We can be all these characters. And ITALIA
we'll also know how to defeat the end-of-level monster. After all, • Querino Ialongo
think about it, haven't we done it hundreds of times yet? ;-) • Leonardo Miliani
by Leonardo Miliani
In the previous part, we analyzed how, thanks to the
address decoders, the CPU can select certain chips to
exchange data with. It is in fact the whole set of integrated
II or the SID of Commodore 64) it would not only have
circuits that work together that form a computer, it is not
linked me to a certain architecture but, given the demand
just the CPU. The CPU (Central Processing Unit) is the
on the second-hand market for these highly sought after
main component but is not the only one. The CPU is
chips and no longer in production for years, it would have
basically like an orchestra conductor. The orchestra is
put me in front of a large economic outlay that I did not
composed of many instruments that are played in a
want to face in any way.
synchronized and harmonious way with the others precisely
thanks to the conductor who decides the rhythm and the
As we have already seen in previous articles, the LM80C
moments when each and every instrument has to play.
is a system based on the Zilog Z80 microprocessor.
Bringing the analogy to the level of a computer, therefore,
Alongside this I have added auxiliary chips that manage
the many instruments are the peripherals that compose
different computer subsystems, following the philosophy
it and the CPU our “conductor”.
in vogue in the 80s, namely to lighten the work of the CPU
by delegating part of its tasks to other subsystems. One
Choosing certain instruments instead of others leads to
of the supporters of this approach was Jay Miner, a US
the composition of a certain type of orchestra, just as
engineer who designed the graphics chips at the base of
integrated circuits create the characteristics of a system
the Atari 2600 console and the Atari 8-bit computers of
as a whole. The choice I had in front of me for the LM80C
the 1980s (figure 1) as well as the creator of the Amiga
was the same as in the late 70s and throughout the 80s
project. Assigning burdensome tasks such as, for example,
of the 20th century the manufacturers of computers and
managing audio and graphics to specialized chips not
consoles: to make a computer completely on their own,
only allows you to recover a good slice of computational
also manufacturing the various individual components,
power from the CPU to be diverted to other tasks but also
or to choose the way of assembly and create a system
engages in those specially designed chip tasks. Many
using parts produced by others. For some manufacturers,
inexpensive computers, such as the ZX80, went a different
the first was a paved road: for example, Commodore owned
way, optimizing costs but not performance: the CPU, in
MOS Technology, and so his computers were based on
fact, also dealt with video signal generation, and this task
chips designed and built “in-house”. Texas Instruments,
drastically reduced the performance of the system. By
with its TI-99 series computers, also followed the same
introducing the FAST instruction in the ZX81, which
path, being a manufacturer of integrated circuits. Others,
deactivated the video while performing particularly heavy
on the other hand, relied on what they found on the market:
tasks, Sinclair tried to put a piece to this problem, allowing
the most famous example are the well-known MSX
the CPU to disengage from image generation and devote
computers, based on components available on the price
itself completely to mathematical calculations. Precisely
lists of various manufacturers. Since I do not yet own my
because the generation of graphic elements of the image
own production plant, I have opted for the assembly of a
is one of the heaviest tasks, some manufacturers did not
machine, but resorting to components produced not
just design chips capable only of generating the video
exclusively for a single system. This has allowed not only
signal but also worked to integrate additional functions
to choose chips that are still easily available in circulation
into their products. One of these is the management of
but also to draw on resources such as documentation and
particular elements that were very popular at the time
software that have accelerated and simplified the design
because they were widely used in games: sprites.
of the computer. Furthermore, if I had opted for chips
created exclusively for a certain system (for example VIC-
When I laid the foundations for the LM80C project, I
immediately wanted the computer not only to be able to
generate a reproducible video image on a common TV set
but also to manage colorful graphics and sprite. I therefore
needed a chip dedicated exclusively to the video sector.
However, it must also have been a chip at the time quite
widespread so that bones are now easily available at an
economic price. The choice fell on the TMS9918A from
Texas Instruments, which meets all the requirements. The
TMS9918A was born in 1979 as a graphics chip for the
Texas Instruments TI-99/4 computer. The first version of
this chip is simply called TMS9918 (without the final “A”)
Figure 1: The Atari 800XL mounted the custom ANTIC, GTIA and is a good chip at the time. It has 3 video modes: a
and POKEY chips to lighten the CPU from video and sound 40x24 character textual mode, a 256x192 pixel graphics
management. based on "tile” and a 64x48 pixel multicolor mode.
RETROMAGAZINE WORLD YEAR 1 - ISSUE 4 Page 3 of 64
HARDWARE
Shortly afterwards the project is reviewed and the chip, instead at a high level because of the WR signal which is high.
which becomes TMS9918A (figure 2), sees the addition
of a graphical mode of type "bitmap” (ie with individually Ultimately, we analyze how THE VDP “MODE” pin enters
manageable pixels). The chip is referred to as "Video
Display Processor”, VDP, in the official documentation.
TMS9918A
The TI-99/4 was not a very successful computer. So TI
Figure 1 - TMS9918 displays only 4 sprites per scan line
improved the design and released the TI-99/4A in 1981,
a version revised in many respects and also equipped with The TMS9918A communicates with the CPU through an
a new graphic chip called TMS9918A. The "A” meant that, 8-bit data bus and only 3 other signals connected to as
if compared to its predecessor, it has a new operating many chip pins: read, write and mode. The first two have
mode called “Graphic 2”, which can handle the image in clear meanings while the last one is used to indicate to
bitmap mode, i.e. every single pixel is individually addressable. the VDP whether the data is to be exchanged with the
The TMS9918, in fact, can only handle graphics in tile VRAM or with one of its internal registers. These registers
mode, where a tileset composed of 256 tiles of 8x8 pixels are 8 in total and write-only. They are needed to program
each, is used to manage graphics. The limitation of this the functions of the graphics processor, such as the
mode is that the elements, repeating on the screen, do graphics mode or in which portions of the VRAM to store
not allow to draw complex graphics or images. In order video buffer and sprite data. One register is read-only, the
to support this new bitmap mode, the TMS9918A must status log, which provides information about, for example,
be equipped with 16 KB of VRAM, all necessary to keep in the collision between sprites or the interrupt. The video
memory not only all the information related to the video image is divided into "display planes”. These “levels” are
buffer but also all the data related to the sprites. in number of 35, from 0 to 34: the lower the number, the
closer the plane is to the observer and has higher priority
Versions and usage than the planes below. The first 32 planes are occupied
The first version of the chip, the TMS9918 (without the by sprites, the 33rd floor contains the background image,
"A”) was only used for the TI-99/4. The TMS9918A (with the 34th is the "backplane”, which is as wide as the entire
the "A”) was initially used for the TI-99/4A but then screen image and forms the background of the entire
licensed to third parties: thanks to this commercial move, image and is generally seen as an edge on the central
TI sold many processors and they were widely used in screen sides. Behind it there is a particular plane called
many systems of the time. It has been mounted on "external VDP” that would allow the video signal generated
ColecoVision, CreatiVision and Sega SG-1000 consoles, from an external source to be introduced into the image:
Spectravideo computers and, most importantly, the first the VDP in fact features a video input (only the TMS9918A
series of MSX home computers. Some more modern model actually does) that, in the plans of the IT designers,
consoles, such as the Sega Master System, Sega Game would have served to overprint the objects and text on
Gear and Mega Drive mounted graphics chips derived the image generated by another VDP, even though, to my
from the TMS9918A. To adapt the VDP to different systems memory, I am not aware of systems that have used this
and different video signals, specific versions have been functionality. The last plane, called “default backplane”,
released: the TMS9928A always generates an NTSC signal is a mere black image that appears for example when the
in YPbPr version (with colour components) but for countries VDP is powered but is not programmed by the CPU. Figure
with PAL standards the TMS9929A has been created. 2 shows an example of sprites overlapping each other and
Subsequently the project was revised and the new TMS9118, the text, which occupies one of the last planes of the image.
TMS9128 and TMS9129 were released: these chips are There are 15 colors available, although they are sometimes
identical to the models they replace, apart from the function referred to as 16: actually the 16th color is “transparent”
of a pin and a different management of the VRAM. and it's needed to show the image of the plane dedicated
to the external signal. In the event that there is no pixel
N.B.: henceforth “TMS9918A” for convenience will mean on in any of the planes below and, in the absence of an
globally both TMS9918A and all its derivatives, since they input signal, then the pixel of the last plane (“default
share the technical characteristics. backplane”) will pass through: this is why it is often thought
that this color is also black, because it passes the color
Technical specifications of the last plane which, in fact, is black.
Regarding VRAM management, the VDP divides the video
memory into various “tables” where, depending on the
selected graphics mode, the data necessary for the
generation of the video image and sprites are stored. The
"pattern table” contains the character patterns, the "name
table” contains the pattern codes to load for each cell of
the screen, the "color table” the color information. The
sprite data are also stored in 2 separate tables: the "sprite
attribute table”, which contains the main sprite data (such
as X and Y coordinates and color) and the "sprite pattern
table”, which instead contains the pixel data that must be
turned on or off to compose the objects.
A major chip deficiency is the absence of hardware scrolling,
both vertical and horizontal. When it was designed, at the
end of the 70s, the games were single-screen based and
Figure 2: sprites rendered above the text, which this feature was not required. Then at the beginning of
occupies one of the top planes of the image
Page 6 of 64 RETROMAGAZINE WORLD YEAR 1 - ISSUE 4
HARDWARE
Software compatibility between ZX-81 and the Spectrum: monsters and ghosts
by Alberto (Ghostbuster) Apostolo
Hardware Differences
The circuits are obviously different. 16 KB memory
expansion for ZX 81 is not usable on ZX Spectrum.
Programs saved on cassettes for ZX 81 cannot be read
on ZX Spectrum. Only the ZX Printer can connect to
both models [Bon83].
The organization of memory is different and
consequently POKE and PEEK commands will also be
different (as well as the machine language routines
and system variables). Figure 1 (above) - Figure 2 (below)
The memory area reserved on ZX 81 for the screen
consists of 768 bytes (24 rows by 32 columns of
characters) and low-resolution graphics (64 x 44
pixels). Figure 3: apex simbol is obtained with Symbol_Shift+7.
The ZX Spectrum model has 6912 bytes divided into:
1) 6144 bytes of graphics (256 x 192 pixels or 24 x 32
characters),
2) 768 bytes (24 rows by 32 columns) reserved for
font colors and other video attributes (brightness and
flashing).
The character set for ZX 81 has its own encoding while
the characters from 0 to 127 in the set for ZX
Spectrum are ASCII. For example, in the ZX 81 model
the "A" character and the "A" character in reverse (Fig.
2) have code 38 and 166 respectively [Bon82] while in
the ZX Spectrum model they have the same code 65
(only the video attributes change). Some graphical
characters not in the ZX Spectrum set can be
implemented through User Defined Graphics (UDGs).
BASIC distinct...
Hardware differences affect their respective versions of
BASIC wired in ROM.
Figure 4
BASIC for ZX Spectrum can be considered an
extension and revision of that for ZX 81. "scrolling" is automatic but with user control with the
FAST and SLOW commands are missing on ZX request "scroll ?" which appears at the bottom of the
Spectrum because it operates at FAST speed and screen. POKE command 23692,255 (system variable
transmits video data in SLOW without interfering with "SCR CT") followed by PRINT AT 21,31;'' emulates
each other's operations and it makes no sense to SCROLL command for ZX 81 (Fig.3).
emulate them (video management is independent).
PAUSE 0 command emulates PAUSE 40000 for ZX 81 UNPLOT command for ZX 81 has been replaced by
[Lis84b]. PLOT OVER 1 command, but care must be taken with
SCROLL command is missing because on ZX Spectrum the graphical resolution and programs for ZX 81 in
Page 8 of 64 RETROMAGAZINE WORLD YEAR 1 - ISSUE 4
SOFTWARE
Conclusions
Why translate a program from ZX 81 to ZX Spectrum
today?
In the world of retrocomputing there are programming
competitions to create software with the least number
Figure 9
of program lines. The small programs created for ZX 81
are a good gym to increase your skill.
Or you want to run a rewritten program on ZX
Spectrum (real or emulated) to take advantage of the
superior features (color, graphics, sound).
There are no fixed conversion "rules". In order not to
hunt monsters and ghosts during the debugging
phase, a preliminary "reverse engineering" is
convenient to understand the behavior of the program
and subsequently improve only the parts related to the
Input-Output, leaving unchanged those consisting of
calculations.
[Bon83] R.Bonelli, "Alla scoperta dello ZX Spectrum", Gruppo Editoriale Jackson, 1983,
https://archive.org/details/allascopertadellozxspectrum
[Hew84] A.Hewson, "ZX equivalents", Sinclair User Magazine, n. 25, Apr.1984, pagg.122-124,
https://archive.org/details/sinclair-user-magazine-025
[Jon83] D.Jones, "Delving deeper into your ZX Spectrum", Interface Publications, 1983.
Alien Attack!
from Amstrad CPC to Commodore 64 through Simons' Basic
by Francesco Fiorentini
After the article in the last issue dedicated to the game consequent relative ease they can be added, has caused,
Alien Attack! written in Locomotive Basic for Amstrad CPC, over the years, the proliferation of several Basic extensions
I realized that it's been a while since I wrote anything for for the Commodore 64. Undoubtedly one of the most
my first computer, the Commodore 64. It was a gap that famous is Simons' Basic.
had to be filled and full with goodwill I decided to convert Created by a talented 16-year-old boy, this software was
that game for the Breadbin. At first glance it might seem released in 1983 and has been incredibly successful ever
a rather simple operation, in the end they are two 8bit since. Anyone who has ever owned a C64 has heard of
machines, almost contemporary, very similar in text screen Simons' Basic at least once.
resolution and both equipped with Basic. But, as the wises The program, generally distributed on cartridges, is now
teach, the devil hides in detail. easily available even in D64 format and adds 114 powerful
commands to the standard Basic!
As I have already written several times, the Locomotive
Basic that equips the Amstrad CPC is a truly advanced The purpose of this article is not to illustrate all the
Basic dialect, nothing to do with the limited capabilities capabilities of Simons' Basic, a book would not suffice,
of the Basic V2 that equips the Commodore 64. The but to indicate some peculiarities that have been useful
commands that the two Basic dialects have in common to me for the porting of the game.
are few and, obviously, I had used in my game most of
those specific to the Locomotive. After a quick analysis I Characters redefinition
was still reasonably convinced that I would be able to As mentioned above, the redefinition of the characters on
transfer all the code fairly easily, with the sole exception the Breadbin is quite a long operation; fortunately Simons'
of characters redefinition. Basic greatly facilitates this task: not at the levels of the
Locomotive Basic, but quite close.
Redefining the characters on Commodore 64 is a rather
long and tedious operation, while it is definitely simple on Before the characters can be redefined, however, they
the Amstrad CPC thanks to the SYMBOL statement. must be copied from ROM to RAM. This operation, which
Obviously I would have avoided redefining the entire is quite tricky in Basic V2, translates into Simons' Basic
character set, but to generate the tiles of the game and in just the MEM statement.
the spaceship, as well as the bomb, I would still have to
redesign some characters. When I was resigned to making As reported in Simons’ Basic’ manual: the MEM command
this effort, in order to effectively convert the game, I came transfers a copy of the character set from ROM to RAM,
up with an idea. An idea called Simons' Basic. under the control of the Kernal operating system. The
screen is moved to location $CC00.
Simons' Basic Keep the highlighted part in mind, you’ll see the reason later.
The limitation of the Basic V2’s commands and the
After copying characters from ROM to RAM, they can be
redefined using the DESIGN statement and the connected
@ command. See the attached code from rows 6000 to 6200.
Not as simple as the Locomotive SYMBOL command, but
close enough.
PRINT AT
Ah, I forgot... The bomb can be shoot with the '1' key.
Have fun!
10 rem **********************************
11 rem alien attack! by francesco fiorentini
12 rem commodore 64 simons' basic
15 rem September 2020
16 rem **********************************
17 hi=5000
18 gosub 10000: rem intro
20 print chr$(147)
6052 @bbbbb.bb
6053 @bbbbbbbb
6054 @bb.bbbbb
6055 @bbbbb.bb
6056 @bbbbbbbb
6057 @bb.bbbbb
6058 @bbbbbbbb
6060 design 2,$e000 + 232 * 8
6061 @bbbbbbbb
6062 @bb.bb.bb
6063 @bbbbbbbb
6064 @bb.bbbbb
6065 @bbbbb.bb
6066 @bb.bbbbb
6067 @bbbbbbbb
6068 @bbbbbbbb
6070 design 2,$e000 + 233 * 8
6071 @bbbbbbbb
6072 @bbbbbbbb
6073 @bb.bb.bb
6074 @bbbbbbbb
6075 @bb.bb.bb
6076 @bbbbbbbb
6077 @bbbbbbbb
6078 @bbbbbbbb
6080 design 2,$e000 + 234 * 8
6081 @bbbbbbbb
6082 @bb.bb.bb
6083 @bbbbbbbb
6084 @bbbb.bbb
6085 @bbbbbbbb
6086 @bb.bb.bb
6087 @bbbbbbbb
6088 @bbbbbbbb
6090 design 2,$e000 + 235 * 8
6091 @bbbbbbbb
6092 @bb.bbbbb
6093 @bbbbbbbb
6094 @bbbb.bbb
6095 @bbbbbbbb
6096 @bbbbbbbb
6097 @bb.bbbbb
6098 @bbbbbbbb
6099 rem draw palace top1 (240)
6100 design 2,$e000 + 240 * 8
6101 @........
6102 @........
6103 @........
6104 @........
6105 @...bb...
6106 @..bbbb..
6107 @.b.bb.b.
6108 @b.bbbb.b
6109 rem draw palace top2 (241)
6110 design 2,$e000 + 241 * 8
6111 @b......b
6112 @b......b
6113 @b......b
6114 @b......b
6115 @bb....bb
6116 @bbb..bbb
6117 @bbbbbbbb
6118 @bbbbbbbb
6119 rem draw palace top3 (242)
6120 design 2,$e000 + 242 * 8
6121 @...bb...
6122 @.bbbbbb.
6123 @.bbbbbb.
6124 @...bb...
6125 @...bb...
6126 @..bbbb..
6127 @.bbbbbb.
6128 @bbbbbbbb
6129 rem draw palace top4 (243)
6130 design 2,$e000 + 243 * 8
6131 @...bb...
6132 @...bb...
6133 @...bb...
6134 @...bb...
6135 @...bb...
6136 @..bbbb..
6137 @.bbbbbb.
6138 @bbbbbbbb
6139 rem af=alienfrontab=alienbackbo=bomb
6190 af=255:ab=254:bo=253
6200 return
Bombs Away!
by Gianluca Girelli
As Francesco Fiorentini wrote in his article on RMW25 ITA,
a couple of months ago our retro coder hearts beat very
hard during the "challenge" to create a clone of “Air Attack”,
an old game from the 1980s possibly developed for every
platform of the time. After so many years, it's amazing
how this simple game has not only withstood the passage
of time but has actually become an icon that can attract
interest in the modern world as well.
It is even more extraordinary how in non-suspicious times
(about a month before the challenge) I decided to create Figura 1 - Bombs Away! splashscreen
my own version to be inserted as a mini-game inside a
- if the bomb goes off it will destroy the building in its
larger game of next-gen derivation.
entirety (unlike other implementations);
- level of difficulty set to medium easy (high score not
While this idea was forming in my mind, the challenge took
important).
place on RPI pages and so (a FaceBook Italian group of
Retro Programmers), instead of programming the game
The next step was to define the graphics: using Gimp (but
using "advanced" techniques (layers or double-buffering
any other program would do) I designed the tiles and
on a graphic screen), I thought of implementing it using
other graphic elements, trying to give them a look as
as much code as possible that mimicked its original
pixellated as possible (see also Francesco's article on the
behavior (text screen and redefined characters).
subject).
the system will continue to react as if the player were a way transparent for the end-users, the effect of the
continuously clicking to shoot. Without going into detail, existence of the individual columns: thanks to Gimp I so
the aforementioned procedures are meant to limit the
program to reacting only once per click.
/****************************************************************
** **
** Name: Bombs Away! **
** Author: Gianluca Girelli **
** Original Code and Graphics: Gianluca Girelli **
** Additional Graphics: Marco Riva **
** Version: 1.0 **
** Date: 08.09.20 **
** Last update: 19.10.20 **
** Interpreter: any **
** Licence: Creative Common 4.0 (CC BYNCSA 4.0 INT) **
** Function: Hollywood implementation of "Air Attack" **
** 8bit videogame. **
** History: **
** 1.0: (22.09.20) **
** game complete **
** 0.1: (08.09.20) **
** Initial test **
****************************************************************/
Function p_Update_input()
;store previous mouse state and read the new one
laststate=currentstate
currentstate=IsLeftMouse()
EndFunction
Function p_MouseState()
; compare present and previous mouse state to determine action to take.
; Events are triggered only if mouse button was just release (mouse state=3)
If laststate=True
If currentstate=True
state=4 ;still pressed
Else
state=3 ;just released
EndIf
Else
If currentstate=True
state=2 ;just pressed
Else
state=1 ;still released
EndIf
EndIf
EndFunction
Function p_AdjustCoordinates(bomb_x_coord)
;mimics a textonly screen by creating "virtual columns" to channel bomb's flight
If bomb_x_coord>=184 And bomb_x_coord<232 Then result=0
If bomb_x_coord>=232 And bomb_x_coord<280 Then result=1
If bomb_x_coord>=280 And bomb_x_coord<328 Then result=2
If bomb_x_coord>=328 And bomb_x_coord<376 Then result=3
If bomb_x_coord>=376 And bomb_x_coord<424 Then result=4
If bomb_x_coord>=424 And bomb_x_coord<472 Then result=5
If bomb_x_coord>=472 And bomb_x_coord<520 Then result=6
If bomb_x_coord>=520 And bomb_x_coord<568 Then result=7
If bomb_x_coord>=568 And bomb_x_coord<616 Then result=8
If bomb_x_coord>=616 And bomb_x_coord<664 Then result=9
If bomb_x_coord>=664 And bomb_x_coord<712 Then result=10
If bomb_x_coord>=712 And bomb_x_coord<760 Then result=11
If bomb_x_coord>=760 And bomb_x_coord<808 Then result=12
If bomb_x_coord>=808 And bomb_x_coord<856 Then result=13
If bomb_x_coord>=856 And bomb_x_coord<904 Then result=14
Function p_minigame()
LoadBrush(140, "Data/44_2.jpg")
LoadBrush(141, "Data/tile1.png", {Transparency = #WHITE})
LoadBrush(142, "Data/tile2.png", {Transparency = #WHITE})
LoadBrush(143, "Data/tile3.png", {Transparency = #WHITE})
LoadBrush(144, "Data/tile4.png", {Transparency = #WHITE})
LoadBrush(145, "Data/tile5.png", {Transparency = #WHITE})
LoadBrush(146, "Data/tile6.png", {Transparency = #WHITE})
LoadBrush(147, "Data/tile7.png", {Transparency = #WHITE})
LoadBrush(148, "Data/tile8.png", {Transparency = #WHITE})
LoadBrush(149, "Data/tile9.png", {Transparency = #WHITE})
LoadBrush(150, "Data/ship.png", {Transparency = #WHITE})
LoadBrush(151, "Data/bomb.png", {Transparency = #WHITE})
LoadBrush(152, "Data/pilot.png", {Transparency = #WHITE})
LoadBrush(153, "Data/bombsaway.png", {Loadalpha = True})
LoadBrush(154, "Data/grass.png", {Transparency = #WHITE})
WaitLeftMouse()
Cls
SetFont("neuropol", 48)
SetFontStyle(#BOLD)
DisplayBrush(140, #CENTER, #CENTER) ;background
CreateTextObject(1, "How to play")
CreateTextObject(2, "Your ship is slowly flying into the ground. Destroy the buildings for a safe
landing. Press left mouse button to drop a bomb.", {Align=#JUSTIFIED, wordwrap=750})
CreateTextObject(3, "Press left mouse button to start.", {Align=#JUSTIFIED, wordwrap=650})
DisplayTextObject(1, #CENTER, 80)
DisplayTextObject(2, #CENTER, 200)
DisplayTextObject(3, #CENTER, 520)
WaitLeftMouse()
Cls
DisplayBrush(140, #CENTER, #CENTER) ;background
SetFillStyle(#FILLCOLOR)
SetFormStyle(#NORMAL)
;generating world
For Local i=280 To 1000 Step 48
DisplayBrush(154, i, 612)
Wait(3)
Next
For Local i=1 To 13
altpal=Rnd(5)+1
whichtype=Rnd(3)+1
For Local j=1 To altpal
DisplayBrush(140+whichtype, x, y)
Wait(3)
y=y48
Next
whichtop=Rnd(6)+4
DisplayBrush(140+whichtop, x, y)
y=558
x=x+48
Next
SetFont("neuropol", 32)
SetFontStyle(#BOLD)
SetFontColor(#WHITE)
Locate(200,45)
Print("Score: "..score)
;commencing game
Repeat
laststate=currentstate=0 ; flush mouse buffer
;read input
p_Update_input()
p_MouseState()
;react to input
If state=3 And fire_enabled And ship_x>184 ;fire has been pressed and bomb is still
unreleased
column=p_AdjustCoordinates(ship_x+24)
bomb_x=b[column]
bomb_y=ship_y+48
fire_enabled=False ;bomb released. no more firing until it hits ground
state=0 ;flush mouse buffer
EndIf
;render screen
DisplayBrush(150, ship_x, ship_y)
If fire_enabled=False Then DisplayBrush(151, bomb_x, bomb_y)
Wait(1)
Box(ship_x, ship_y, 96, 48, $6953f5)
If bomb_y+48>=606
fire_enabled=True
Box(200, 45, 500, 48, $6953f5)
Locate(200,45)
Print("Score: "..score)
EndIf
;termination conditions
sum=0
For Local i=0 To 12
sum=sum+a[i]
Next
If score=650 And sum=0 And bomb_y+48>=606 ;game won
;move ship out of screen boundaries on current row
For Local i=ship_x To 1120 Step 4
DisplayBrush(150, i, ship_y)
Wait(1)
Box(i, ship_y, 96, 48, $6953f5)
Next
;land ship
MoveBrush(150, 190, ship_y+48, 700, 558,{Speed = #SLOWSPEED})
Box(700, 558, 96, 48, $6953f5)
MoveBrush(150, 700, 558, 900, 558,{Speed = #SLOWSPEED})
SetFont("neuropol", 64)
SetFontStyle(#BOLD)
SetFontColor(#WHITE)
CreateTextObject(1, "Game Won !", {Align=#JUSTIFIED, wordwrap=750})
DisplayTextObject(1, #CENTER, #CENTER)
If level=1 Then arcade_game_won=1 Else arcade_game2_won=1
Wait(150)
exit=True
EndIf
FreeClipRegion(1)
For Local i=140 To 154 Do FreeBrush(i)
EndFunction
StartTimer(1)
p_minigame()
A bit of rarity
(rummaging here and there)
https://archive.org/details/LIST1984-02
Pag. 11-12 ORIC-1 "Tris" (Tic-Tac-Toe, game)
Pag. 15-16 ORIC-1 "Rally" (game)
Pag. 23-27 MPF II "High Driver" (game)
Pag. 37-38 MPF II "Banca" (Bank account, business)
Pag. 39-40 MPF II "Istogrammi" (Histograms, utility)
Pag. 45-45 ORIC-1 "La torre" (The Tower, math game)
Pag. 46-46 Sharp MZ-700 (technical sheet, part 2)
Pag. 47-48 Sharp MZ-700 "Mastermind" (game)
Pag. 48-49 Sharp MZ-700 "Armonia" (Harmony, astrology)
Pag. 60-62 ORIC-1 "Zhorick" (game)
Pag. 81-82 ORIC-1 "Mosca cieca" (Blindman's bluff, game)
Pag. 83-85 MPF II "O-X" (Othello,Reversi, game)
Page 24 of 64 RETROMAGAZINE WORLD YEAR 1 - ISSUE 4
SOFTWARE
https://archive.org/details/LIST1984-03
Pag. 13-13 ORIC-1 "Coder-Decoder" (cryptography)
Pag. 14-14 ORIC-1 "Renumber Line" (utility)
Pag. 21-22 ORIC-1 "Falciatrice" (The mower, game)
Pag. 36-39 "Dentro il computer" (Inside the computer, education, part 3)
Pag. 40-40 Correzioni al programma "Tris" (Bug-List of program "Tris", see List n. 1)
Pag. 41-41 Sharp MZ-700 "Caccia al tesoro" (Treasure hunt, game)
Pag. 42-42 ORIC-1 "Istogrammi" (Histograms, utility, Sharp MZ-700 printed in header is a mistake)
Pag. 43-45 ORIC Atmos 48K (technical sheet)
Pag. 57-58 Sega SC-3000 "Cascatutto" (Everything Falls, game)
Pag. 59-60 Sega SC-3000 "Corso Basic" (BASIC course, education, part 1)
Pag. 69-75 MPF II "Fatturazione magazzino" (Inventory invoice, business, part 1)
https://archive.org/details/LIST1984-04
Pag. 18-18 ORIC-1 "Tabella" (printing price lists, utility)
Pag. 32-33 Sega SC-3000 "Corso Basic" (BASIC course, education, part 2)
Pag. 34-35 Sega SC-3000 "Bioritmi" (Biorythm, utility)
Pag. 38-38 Sharp MZ-700 "Istogrammi di percentuali" (Histograms and percentage, utility)
Pag. 39-40 Sharp MZ-700 "Riunisci...la musica" (Collecting music, music)
Pag. 42-43 "Dentro il computer" (Inside the computer, education, part 4)
Pag. 68-69 ORIC-1 "Calendario" (Calendar utility)
Pag. 73-74 MPF II "Quattro in fila" (Four-in-a-row, game)
Pag. 88-90 MPF II "Fatturazione magazzino" (Inventory invoice, business, part 2)
https://archive.org/details/LIST1984-05
Pag. 14-14 Sega SC-3000 "Totocalcio" (Italian football pools)
Pag. 30-30 Sharp MZ-700 "Risoluzione di equazioni con il metodo di Cramer" (Cramer's method, math)
Pag. 45-47 "Dentro il computer" (Inside the computer, education, part 5)
Pag. 64-65 MPF II "Snake" (game)
Pag. 72-73 Sega SC-3000 "Corso di Basic" (BASIC course, education, part 3,4)
https://archive.org/details/LIST1984-06
Pag. 20-21 MPF II "Viaggio nello spazio" (Space journey, game)
Pag. 29-30 ORIC-1 "Gran Prix" (game)
Pag. 31-34 Sega SC-3000 "Caccia al sottomarino" (Submarine hunt, game)
Pag. 35-36 Sharp MZ-700 "Incontri di calcio" (handling football championship results)
Pag. 56-57 "Dentro il computer" (Inside the computer, education, part 6)
Pag. 66-67 Sharp MZ-700 "Tombola" (handling the Bingo)
Pag. 77-78 Sega SC-3000 "Video Picture" (graphics)
Pag. 87-89 Sega SC-3000 "Corso di Basic" (BASIC course, education, part 5)
Pag. 90-91 Sega SC-3000 "Outline" (how changing your character set)
https://archive.org/details/LIST1985-01/mode/2up
Pag. 08-09 Sega SC-3000 "Morra" (Chinese Morra, game)
Pag. 10-11 Sega SC-3000 "Mastermind" (game)
Pag. 15-17 Sharp MZ-700 "Su e giù per la penisola" (part 1, education, geography of Italy)
Pag. 22-24 Sharp MZ-700 "Attacco aereo" (Air attack, game)
Pag. 27-29 ORIC-1 "Levrieri" (Greyhounds, game)
Pag. 45-48 MPF II "Piramide" (Marienbad, game)
Pag. 49-50 Sharp MZ-700 "Istruzioni POKE" (education)
Pag. 53-56 Sega SC-3000 "Corso di Basic" (BASIC course, education, part 6,7)
Pag. 74-77 ORIC-1 "Break-Out" (game)
Pag. 78-79 Sega SC-3000 "Astro War" (game)
Pag. 80-82 Sega SC-3000 "Paroliamo" (Countdown word game)
Pag. 89-90 ORIC-1 "Salta la rana" (Frog, game)
https://archive.org/details/LIST1985-02
Pag. 26-26 Sharp MZ-700 "Load and Run" (education)
Pag. 28-31 Sega SC-3000 "Corso di Basic" (BASIC course, education, part 8,9,10)
Pag. 32-35 ORIC-1 "Char-constructor" (utility)
Pag. 40-42 ORIC-1 "Smash" (The Wall, game)
Pag. 43-45 Sharp MZ-700 "Su e giù per la penisola" (part 2, education, geography of Italy)
Pag. 57-58 Sega SC-3000 "Uova Spaziali" (Space Eggs, game)
pag. 59-61 Sharp MZ-700 "JAZZI" (Jahtzee, game)
Pag. 67-69 Sharp MZ-700 "Boxe" (game)
Pag. 70-72 Sega SC-3000 "Tiro a volo" (Shooting, game)
Pag. 85-88 Sharp MZ-700 "Slot machine" (game)
Pag. 89-90 Sega SC-3000 "Pianoforte" (music)
https://archive.org/details/LIST1985-04
Pag. 31-33 Sega SC-3000 "Super Master Mind" (game)
Pag. 37-38 Sharp MZ-700 "Sci alpino" (Skiing, game)
Pag. 40-41 Sega SC-3000 "Real golf" (game)
Pag. 46-48 Sharp MZ-700 "Dispersioni termiche" (Heat loss, science)
Pag. 49-50 MPF II "Contraerea" (Flak, game)
Pag. 53-54 Sharp MZ-7000 "Bioritmi" (Biorythm, utility)
Pag. 55-56 ORIC-1 "Cubi" (Cubes, game)
Pag. 57-58 MPF II "Mastermind" (game)
Pag. 84-85 Sega SC-3000 "Archer" (game)
https://archive.org/details/LIST1985-05
Pag. 37-39 Sega SC-3000 "Grafica in 3D" (graphics)
Pag. 40-42 Sharp MZ-7000 "Caccia all'U-boot" (U-boot hunting, game)
Pag. 48-49 ORIC-1 "Oric Sequencer" (music)
Pag. 52-57 MPF II "Black-Jack" (game)
Pag. 62-63 Sega SC-3000 "Decisioni" (Choices, mathematical logic)
Pag. 64-65 Sharp MZ-700 "Analisi" (Calculus, math utility)
Pag. 70-71 ORIC-1 "Equazioni di 1° e 2° grado" (math)
Pag. 72-73 ORIC-1 "Semina" (Seeding, game)
https://archive.org/details/LIST1985-08-09
Pag. 74-78 Sega SC-3000 "Math Software" (math utility)
Pag. 79-81 Sega SC-3000 "Fasi Lunari" (Moon phases, astronomy)
Pag. 82-83 Sharp MZ-700 "Ferma il totale" (Stop the total, math game)
Pag. 84-85 Sharp MZ-700 "Biglietti da visita" (business cards printing, utility)
https://archive.org/details/LIST1985-08-09-speciali
Pag. 06-07 Sega SC-3000 "Sega Graphics" (graphics)
Pag. 19-20 Sega SC-3000 "Simulatore di volo" (Flight Simulator, game)
Pag. 21-21 Sharp MZ-700 "Archivio Sharp" (Archive, utility)
https://archive.org/details/LIST1985-10-11
Pag. 67-70 Sega SC-3000 "Bosco maledetto" (The cursed wood, adventure)
Pag. 70-71 Sega SC-3000 "Calcolo dei solidi" (Solid geometry, math)
Pag. 72-75 Sharp MZ-700 "Elenco fornitori" (Suppliers' List, business)
Pag. 75-78 Sharp MZ-700 "Sette e mezzo" (7 and half Italian BlackJack, game)
https://archive.org/details/LIST1986-04
Pag. 52-54,63-64 Sega SC-3000 "Drawer" (graphics)
Pag. 65-69 Sharp MZ-700 "Gestione Magazzino" (Inventory management, business)
Some might argue that the VB6 is not exactly retro, but
since it was released in 1998 and is already 22 years old,
I would say that it can be considered retro in all respects.
Of the 3 portings this was definitely the most challenging.
Figure 1. Haunted House runs on Amstrad CPC
Adapting the GW Basic code created as' deconstructed
RETROMAGAZINE WORLD YEAR 1 - ISSUE 4 Page 27 of 64
SOFTWARE
Figure 3. Haunted House porting on Visual Basic 6 with the ''About...'' form
Here is a list of the actions I had to take: Obviously these are just ideas that I threw down when I
- I had to make a distinction between the descriptive area wrote the article. But the basis is there and implementing
and the command typing area them, as I wrote earlier, would be relatively simple. My
- due to the removal of line numbering, I had to modify all hands itch already to get me to work...: -D
conditional jumps (GOSUB) to point to labels (to do this
first I kept the line number as the label name) I hope this first article on the porting of Basic programs
- VB does not handle READ/DATA, so I had to transform can meet your interest and above all can be a stimulus to
DATA into Array rediscover the old programs.
- old Basic distinguished between variable names if they
contained the type indication; e.g. WA, WA$ and WA% Coming back to Haunted House adventure: if you are
were three totally different variables. In this case I had to experienced adventurers, solving it will be reasonably
rename all variables to allow the program to work properly simple, however if you need any help, here you can find a
- I also added an 'About' form to give Usborne Publishing comfortable walkthrough that will allow you to complete
the credits due the game:
https://solutionarchive.com/file/id%2C9320/
All in all, the result is pleasant. The textual adventure
reflects the spirit of the games of the past, but with a So I just wish you all a lot of fun and forgive me for the
decidedly more modern look and feel. excessive length of the enclosed code, but it is, I hope,
for a good cause. :-)
In addition, the VB6 offers several potentialities to enrich
our software, and with relatively little effort. Perhaps in
one of RetroMagazine's subsequent releases we could
also think of relaunching Haunted House Enhanced!
You could add a list to represent inventory, or add a series
of buttons to run basic commands (instead of typing them
Original GW-Basic code (MS DOS) - also compatible with Locomotive Basic (Amstrad CPC)
10 REM HAUNTED HOUSE ADVENTURE
20 REM ***********************
30 REM THIS VERSION FOR "MICROSOFT" BASIC
40 REM REQUIRES A MINIMUM OF 16K
50 REM SELECT "TEXT MODE" IF NECESSARY
60 REM ***********************
70 V = 25: W = 36: G = 18
73 DIM R$(63), D$(63), O$(W), V$(V)
77 DIM C(W), L(G), F(W)
80 GOSUB 1600 '> DO INITIALISATION
670 IF OB = 20 THEN D = 2
680 IF OB = 21 THEN D = 3
690 IF OB = 22 THEN D = 4
700 IF OB = 23 THEN D = 5
710 IF OB = 24 THEN D = 6
720 IF RM = 20 AND D = 5 THEN D = 1
730 IF RM = 20 AND D = 6 THEN D = 3
740 IF RM = 22 AND D = 6 THEN D = 2
750 IF RM = 22 AND D = 5 THEN D = 3
760 IF RM = 36 AND D = 6 THEN D = 1
770 IF RM = 36 AND D = 5 THEN D = 2
780 IF F(14) = 1 THEN M$ = "CRASH! YOU FELL OUT OF THE TREE!": F(14) = 0: RETURN
790 IF F(27) = 1 AND RM = 52 THEN M$ = "GHOSTS WILL NOT LET YOU MOVE": RETURN
800 IF RM = 45 AND C(1) = 1 AND F(34) = 0 THEN M$ = "A MAGICAL BARRIER TO THE WEST": RETURN
810 IF (RM = 26 AND F(0) = 0) AND (D = 1 OR D = 4) THEN M$ = "YOU NEED A LIGHT": RETURN
820 IF RM = 54 AND C(15) <> 1 THEN M$ = "YOU'RE STUCK!": RETURN
830 IF C(15) = 1 AND NOT (RM = 53 OR RM = 54 OR RM = 55 OR RM = 47) THEN M$ = "YOU CAN'T CARRY A BOAT!":
RETURN
840 IF (RM > 26 AND RM < 30) AND F(0) = 0 THEN M$ = "TOO DARK TO MOVE": RETURN
850 F(35) = 0: RL = LEN(R$(RM))
860 FOR I = 1 TO RL
870 U$ = MID$(R$(RM), I, 1)
880 IF (U$ = "N" AND D = 1 AND F(35) = 0) THEN RM = RM 8: F(35) = 1
890 IF (U$ = "S" AND D = 2 AND F(35) = 0) THEN RM = RM + 8: F(35) = 1
900 IF (U$ = "W" AND D = 3 AND F(35) = 0) THEN RM = RM 1: F(35) = 1
910 IF (U$ = "E" AND D = 4 AND F(35) = 0) THEN RM = RM + 1: F(35) = 1
920 NEXT I
930 M$ = "OK"
940 IF F(35) = 0 THEN M$ = "CAN'T GO THAT WAY!"
950 IF D < 1 THEN M$ = "GO WHERE?"
960 IF RM = 41 AND F(23) = 1 THEN R$ = "SW": M$ = "THE DOOR SLAMS SHUT!": F(23) = 0
970 RETURN
1595 REM GAME INITIALISATION ROUTINE
1600 REM DIM R$(63), D$(63), O$(W), V$(V)
1610 REM DIM C(W), L(G), F(W)
1620 DATA 46,38,35,50,13,18,28,42,10,25,26,4,2,7,47,60,43,32
1630 FOR I = 1 TO G
1640 READ L(I)
1650 NEXT I
1660 DATA HELP,CARRYING?,GO,N,S,W,E,U,D,GET,TAKE,OPEN,EXAMINE,READ,SAY
1665 DATA DIG,SWING,CLIMB,LIGHT,UNLIGHT,SPRAY,USE,UNLOCK,LEAVE,SCORE
1680 FOR I = 1 TO V
1690 READ V$(I)
1700 NEXT I
1705 '> Possible movements (they are associated with the location, sharing the same index)
1710 DATA SE,WE,WE,SWE,WE,WE,SWE,WS
1720 DATA NS,SE,WE,NW,SE,W,NE,NSW
1730 DATA NS,NS,SE,WE,NWUD,SE,WSUD,NS
1740 DATA N,NS,NSE,WE,WE,NSW,NS,NS
1750 DATA S,NSE,NSW,S,NSUD,N,N,NS
1760 DATA NE,NW,NE,W,NSE,WE,W,NS
1770 DATA SE,NSW,E,WE,NW,S,SW,NW
1780 DATA NE,NWE,WE,WE,WE,NWE,NWE,W
1790 FOR I = 0 TO 63
1800 READ R$(I)
1810 NEXT I
1905 DATA STEEP MARBLE STAIRS,DINING ROOM,DEEP CELLAR WITH COFFIN,CLIFF PATH
1920 DATA CLOSET,FRONT LOBBY,LIBRARY OF EVIL BOOKS,STUDY WITH DESK AND HOLE IN WALL
1925 DATA WEIRD COBWEBBY ROOM,VERY COLD CHAMBER,SPOOKY ROOM,CLIFF PATH BY MARSH
1940 DATA RUBBLESTREWN VERANDAH,FRONT PORCH,FRONT TOWER,SLOPING CORRIDOR
1945 DATA UPPER GALLERY,MARSH BY WALL,MARSH,SOGGY PATH
1960 DATA BY TWISTED RAILING, PATH THROUGH IRON GATE,BY RAILINGS,BENEATH FRONT TOWER
1965 DATA DEBRIS FROM CRUMBLING FACADE,LARGE FALLEN BRICKWORK,ROTTING STONE ARCH,CRUMBLING CLIFFTOP
1980 FOR I = 0 TO 63
1990 READ D$(I)
2000 NEXT I
70 v = 25: w = 36: g = 18
73 dim r$(63), d$(63), o$(w), v$(v)
77 dim c(w), l(g), f(w)
80 gosub 1600 '> do initialisation
1705 rem possible movements (associated with the location, same index)
1710 data se,we,we,swe,we,we,swe,ws
1720 data ns,se,we,nw,se,w,ne,nsw
1730 data ns,ns,se,we,nwud,se,wsud,ns
1740 data n,ns,nse,we,we,nsw,ns,ns
1750 data s,nse,nsw,s,nsud,n,n,ns
1760 data ne,nw,ne,w,nse,we,w,ns
1770 data se,nsw,e,we,nw,s,sw,nw
1780 data ne,nwe,we,we,we,nwe,nwe,w
1790 for i = 0 to 63
1800 read r$(i)
1810 next i
VERSION 5.00
Begin VB.Form HauntedHouse
BackColor = &H00E0E0E0&
BorderStyle = 3 'Fixed Dialog
Caption = "HAUNTED HOUSE by Usborne Publishing Ltd 1983 VB6 port by F. Fiorentini 2020"
ClientHeight = 5730
ClientLeft = 8295
ClientTop = 5670
ClientWidth = 10575
ForeColor = &H00000040&
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 5730
ScaleWidth = 10575
ShowInTaskbar = 0 'False
Begin VB.CommandButton Command1
Caption = "About"
BeginProperty Font
Name = "MS Sans Serif"
Size = 9.75
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 495
Left = 9600
TabIndex = 3
Top = 5160
Width = 855
End
Begin VB.CommandButton Command_Check
Caption = "OK"
BeginProperty Font
Name = "MS Sans Serif"
Size = 9.75
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 495
Left = 9000
TabIndex = 2
Top = 5160
Width = 495
End
Begin VB.TextBox InputString
BeginProperty Font
Name = "Verdana"
Size = 14.25
Charset = 0
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 495
Left = 50
TabIndex = 1
Top = 5160
Width = 8895
End
Begin VB.TextBox Testo
BackColor = &H00E0E0E0&
BeginProperty Font
Name = "Trebuchet MS"
Size = 12
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H00000040&
Height = 5055
Left = 50
Locked = 1 'True
MultiLine = 1 'True
ScrollBars = 2 'Vertical
TabIndex = 0
Text = "Haunted House.frx":0000
Top = 0
Width = 10455
End
End
Attribute VB_Name = "HauntedHouse"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim RL
Dim AddString As String
500:
Rem VERB 1
AddString = "WORDS I KNOW:" & vbCrLf
For I = 1 To V
AddString = AddString & Varray(I) & ", "
Next I
M$ = ""
AddString = AddString & vbCrLf
Return
570:
Rem VERB 2
AddString = "YOU ARE CARRYING:" & vbCrLf
For I = 1 To G
If C(I) = 1 Then AddString = AddString & OArray(I) & ", "
Next I
AddString = AddString & vbCrLf
M$ = ""
Return
640:
Rem VERBS 3 TO 9 INCLUSIVE
D = 0
If OB = 0 Then D = VB 3
If OB = 19 Then D = 1
If OB = 20 Then D = 2
If OB = 21 Then D = 3
If OB = 22 Then D = 4
If OB = 23 Then D = 5
If OB = 24 Then D = 6
If RM = 20 And D = 5 Then D = 1
If RM = 20 And D = 6 Then D = 3
If RM = 22 And D = 6 Then D = 2
If RM = 22 And D = 5 Then D = 3
If RM = 36 And D = 6 Then D = 1
If RM = 36 And D = 5 Then D = 2
If FArray(14) = 1 Then M$ = "CRASH! YOU FELL OUT OF THE TREE!": FArray(14) = 0: Return
If FArray(27) = 1 And RM = 52 Then M$ = "GHOSTS WILL NOT LET YOU MOVE": Return
If RM = 45 And C(1) = 1 And FArray(34) = 0 Then M$ = "A MAGICAL BARRIER TO THE WEST": Return
If (RM = 26 And FArray(0) = 0) And (D = 1 Or D = 4) Then M$ = "YOU NEED A LIGHT": Return
If RM = 54 And C(15) <> 1 Then M$ = "YOU'RE STUCK!": Return
If C(15) = 1 And Not (RM = 53 Or RM = 54 Or RM = 55 Or RM = 47) Then M$ = "YOU CAN'T CARRY A BOAT!":
Return
If (RM > 26 And RM < 30) And FArray(0) = 0 Then M$ = "TOO DARK TO MOVE": Return
FArray(35) = 0: RL = Len(RArray(RM))
For I = 1 To RL
U$ = Mid$(RArray(RM), I, 1)
If (U$ = "N" And D = 1 And FArray(35) = 0) Then RM = RM 8: FArray(35) = 1
If (U$ = "S" And D = 2 And FArray(35) = 0) Then RM = RM + 8: FArray(35) = 1
If (U$ = "W" And D = 3 And FArray(35) = 0) Then RM = RM 1: FArray(35) = 1
If (U$ = "E" And D = 4 And FArray(35) = 0) Then RM = RM + 1: FArray(35) = 1
Next I
M$ = "OK"
If FArray(35) = 0 Then M$ = "CAN'T GO THAT WAY!"
If D < 1 Then M$ = "GO WHERE?"
If RM = 41 And FArray(23) = 1 Then R_$ = "SW": M$ = "THE DOOR SLAMS SHUT!": FArray(23) = 0
Return
980:
Rem VERBS 10 AND 11
If OB > G Then M$ = "I CAN'T GET " + W_$: Return
If LArray(OB) <> RM Then M$ = "IT ISN'T HERE"
If FArray(OB) <> 0 Then M$ = "WHAT " + W_$ + "?"
If C(OB) = 1 Then M$ = "YOU ALREADY HAVE IT"
If OB > 0 And LArray(OB) = RM And FArray(OB) = 0 Then C(OB) = 1: LArray(OB) = 65: M$ = "YOU HAVE THE " +
W_$
Return
1030:
Rem VERB 12
If RM = 43 And (OB = 28 Or OB = 29) Then FArray(17) = 0: M$ = "DRAWER OPEN"
If RM = 28 And OB = 25 Then M$ = "IT'S LOCKED"
If RM = 38 And OB = 32 Then M$ = "THAT'S CREEPY!": FArray(2) = 0
Return
1070:
Rem VERB 13
If OB = 30 Then FArray(18) = 0: M$ = "SOMETHING HERE!"
If OB = 31 Then M$ = "THAT'S DISGUSTING!"
If (OB = 28 Or OB = 29) Then M$ = "THERE'S A DRAWER"
If OB = 33 Or OB = 5 Then GoSub 1140
If RM = 43 And OB = 35 Then M$ = "THERE'S SOMETHING BEYOND..."
If OB = 32 Then GoSub 1030
If OB > 0 And M$ = "" Then M$ = "NOTHING REALLY USEFUL FOUND..."
Return
1140:
Rem VERB 14
If RM = 42 And OB = 33 Then M$ = "THEY ARE DEMONIC WORKS"
If (OB = 3 Or OB = 36) And C(3) = 1 And FArray(34) = 0 Then M$ = "USE THIS WORD WITH CARE 'XZANFAR'"
If C(5) = 1 And OB = 5 Then M$ = "THE SCRIPT IS IN AN ALIEN TONGUE"
Return
1180:
Rem VERB 15
M$ = "OK '" + W_$ + "'"
If C(3) = 1 And OB = 34 Then M$ = "*MAGIC OCCURS*": If RM <> 45 Then RM = Fix(Rnd(1) * 64)
If C(3) = 1 And OB = 34 And RM = 45 Then FArray(34) = 1
Return
1220:
Rem VERB 16
If C(12) = 1 Then M$ = "YOU MADE A HOLE"
If C(12) = 1 And RM = 30 Then M$ = "DUG THE BARS OUT": DArray(RM) = "HOLE IN THE WALL": RArray(RM) =
"NSE"
Return
1250:
Rem VERB 17
If C(14) <> 1 And RM = 7 Then M$ = "THIS IS NO TIME TO PLAY GAMES"
If OB = 14 And C(14) = 1 Then M$ = "YOU SWUNG IT"
If OB = 13 And C(13) = 1 Then M$ = "WHOOSH"
If OB = 13 And C(13) = 1 And RM = 43 Then RArray(RM) = "WN": DArray(RM) = "STUDY WITH A SECRET ROOM": M$
= "YOU BROKE THE THIN WALL"
Return
1300:
Rem VERB 18
If OB = 14 And C(14) = 1 Then M$ = "IT ISN'T ATTACHED TO ANYTHING!"
If OB = 14 And C(14) <> 1 And RM = 7 And FArray(14) = 0 Then M$ = "YOU SEE THICK FORREST AND CLIFF
SOUTH": FArray(14) = 1: Return
If OB = 14 And C(14) <> 1 And RM = 7 And FArray(14) = 1 Then M$ = "GOING DOWN!": FArray(14) = 0
Return
1340:
Rem VERB 19
If OB = 17 And C(17) = 1 And C(8) = 0 Then M$ = "IT WILL BURN YOUR HANDS"
If OB = 17 And C(17) = 1 And C(9) = 0 Then M$ = "NOTHING TO LIGHT IT WITH"
If OB = 17 And C(17) = 1 And C(9) = 1 And C(8) = 1 Then M$ = "IT CASTS A FLICKERING LIGHT": FArray(0) =
1
Return
1380:
Rem VERB 20
If FArray(0) = 1 Then FArray(0) = 0: M$ = "EXTINGUISHED"
Return
1400:
Rem VERB 21
If OB = 16 And C(16) = 1 Then M$ = "HISSSS"
If OB = 16 And C(16) = 1 And FArray(26) = 1 Then FArray(26) = 0: M$ = "PFFT! GOT THEM"
Return
1430:
Rem VERB 22
If OB = 10 And C(10) = 1 And C(11) = 1 Then M$ = "SWITCHED ON": FArray(24) = 1
If FArray(27) = 1 And FArray(24) = 1 Then M$ = "WHIZZ VACUUMED THE GHOSTS UP!": FArray(27) = 0
Return
1460:
Rem VERB 23
If RM = 43 And (OB = 27 Or OB = 28) Then GoSub 1030
If RM = 28 And OB = 25 And FArray(25) = 0 And C(18) = 1 Then FArray(25) = 1: RArray(RM) = "SEW":
DArray(RM) = "HUGE OPEN DOOR": M$ = "THE KEY TURNS"
Return
1490:
Rem VERB 24
If C(OB) = 1 Then C(OB) = 0: LArray(OB) = RM: M$ = "DONE"
Return
1510:
Rem VERB 25
S = 0
For I = 1 To G
If C(I) = 1 Then S = S + 1
Next I
If S = 17 And C(15) <> 1 And RM <> 57 Then AddString = AddString & vbCrLf & "YOU HAVE EVERYTHING":
AddString = AddString & vbCrLf & "RETURN TO THE GATE FOR FINAL SCORE"
If S = 17 And RM = 57 Then AddString = AddString & vbCrLf & "DOUBLE SCORE FOR REACHING HERE!": S = S * 2
AddString = AddString & vbCrLf & "YOUR SCORE = " & S: If S > 18 Then AddString = AddString & vbCrLf &
"WELL DONE! YOU HAVE FINISHED THE GAME": End
Return
1590:
Return
Stampa:
' Stampa risultato del comando
Testo.Text = "YOUR LOCATION IS:"
Testo.Text = Testo.Text & vbCrLf & DArray(RM)
Testo.Text = Testo.Text & vbCrLf & vbCrLf & "POSSIBLE EXITS:" & vbCrLf
For I = 1 To Len(RArray(RM))
Testo.Text = Testo.Text & Mid$(RArray(RM), I, 1) & ","
Next I
Testo.Text = Testo.Text & vbCrLf
For I = 1 To G
If LArray(I) = RM And FArray(I) = 0 Then Testo.Text = Testo.Text & "YOU CAN SEE " & OArray(I) & "
HERE"
Next I
Testo.Text = Testo.Text & vbCrLf & "========================="
If AddString <> "" Then
Testo.Text = Testo.Text & vbCrLf & AddString
AddString = ""
Else
Testo.Text = Testo.Text & vbCrLf & M$
End If
Testo.Text = Testo.Text & vbCrLf & vbCrLf & "What is your next move?"
InputString.Text = ""
InputString.SetFocus
End Sub
V = 25: W = 36: G = 18
LArray = Array(0, 46, 38, 35, 50, 13, 18, 28, 42, 10, 25, 26, 4, 2, 7, 47, 60, 43, 32)
Varray = Array("", "HELP", "CARRYING", "GO", "N", "S", "W", "E", "U", "D", "GET", "TAKE", "OPEN",
"EXAMINE", "READ", "SAY", "DIG", "SWING", "CLIMB", "LIGHT", "UNLIGHT", "SPRAY", "USE", "UNLOCK",
"LEAVE", "SCORE")
RArray = Array("SE", "WE", "WE", "SWE", "WE", "WE", "SWE", "WS", "NS", "SE", "WE", "NW", "SE", "W",
"NE", "NSW", "NS", "NS", "SE", "WE", "NWUD", "SE", "WSUD", "NS", "N", "NS", "NSE", "WE", "WE", "NSW",
"NS", "NS", "S", "NSE", "NSW", "S", "NSUD", "N", "N", "NS", "NE", "NW", "NE", "W", "NSE", "WE", "W",
"NS", "SE", "NSW", "E", "WE", "NW", "S", "SW", "NW", "NE", "NWE", "WE", "WE", "WE", "NWE", "NWE", "W")
DArray = Array("DARK CORNER", "OVERGROWN GARDEN", "BY LARGE WOODPILE", "YARD BY RUBBISH", "WEEDPATCH",
"FOREST", "THICK FOREST", "BLASTED TREE", "CORNER OF HOUSE", "ENTRANCE TO KITCHEN", "KITCHEN AND GRIMEY
COOKER", "SCULLERY DOOR", " ROOM WITH INCHES OF DUST", "REAR TURRET ROOM", "CLEARING BY HOUSE", "PATH",
"SIDE OF HOUSE", _
"BACK OF HALLWAY", "DARK ALCOVE", "SMALL DARK ROOM", "BOTTOM OF SPIRAL STAIRCASE", "WIDE PASSAGE",
"SLIPPERY STEPS", "CLIFFTOP", "NEAR CRUMBLING WALL", "GLOOMY PASSAGE", "POOL OF LIGHT", "IMPRESSIVE
VAULTED HALLWAY", "HALL BY THICK WOODEN DOOR", "TROPHY ROOM", "CELLAR WITH BARRED WINDOW", "CLIFF PATH",
" CUPBOARD WITH HANGING COAT", _
"FRONT HALL", "SITTING ROOM", "SECRET ROOM", "STEEP MARBLE STAIRS", "DINING ROOM", "DEEP CELLAR WITH
COFFIN", "CLIFF PATH", "CLOSET", "FRONT LOBBY", "LIBRARY OF EVIL BOOKS", "STUDY WITH DESK AND HOLE IN
WALL", "WEIRD COBWEBBY ROOM", "VERY COLD CHAMBER", "SPOOKY ROOM", "CLIFF PATH BY MARSH", "RUBBLESTREWN
VERANDAH", "FRONT PORCH", _
"FRONT TOWER", "SLOPING CORRIDOR", "UPPER GALLERY", "MARSH BY WALL", "MARSH", "SOGGY PATH", "BY TWISTED
RAILING", "PATH THROUGH IRON GATE", "BY RAILINGS", "BENEATH FRONT TOWER", "DEBRIS FROM CRUMBLING
FACADE", "LARGE FALLEN BRICKWORK", "ROTTING STONE ARCH", "CRUMBLING CLIFFTOP")
OArray = Array("", "PAINTING", "RING", "MAGIC SPELLS", "GOBLET", "SCROLL", "COINS", "STATUE",
"CANDLESTICK", "MATCHES", "VACUUM", "BATTERIES", "SHOVEL", "AXE", "ROPE", "BOAT", "AEROSOL", "CANDLE",
"KEY", "NORTH", "SOUTH", "WEST", "EAST", "UP", "DOWN", "DOOR", "BATS", "GHOSTS", "DRAWER", "DESK",
"COAT", "RUBBISH", "COFFIN", "BOOKS", "XZANFAR", "WALL", "SPELLS")
FArray = Array(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, 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, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0)
FArray(18) = 1: FArray(17) = 1: FArray(2) = 1: FArray(26) = 1: FArray(28) = 1: FArray(23) = 1: LL = 60:
RM = 57: M$ = "OK"
In the 4th part of the Tutorial about how to develop a one of the 16 internal chip registers, the Interrupt Control
game entirely in BASIC V2, which you find on the group Register (CIAICR) outlined in Fig. 2.
RetroProgramming Italia – RP Italia, Felice Nardella has
inserted a very useful Table that, for convenience, we
attach to this article (Fig. 1).
Figure 2
The purpose of this trick is to completely disable the use In this specific case, our purpose is to disable the generation
of these keys in programs that manage movements through of the IRQ Interrupt by Timer A, which in Register 56333
the Joystick. is controlled by bit 0.
Let's start by saying that the first operation to be done is Then you must use the following statement:
to disable the scanning of the keyboard, which usually poke 56333.1
takes place every 1/60 seconds.
Let's briefly remember that Timer A counts down from a
Keyboard scanning, as well as cursor blinking management default start value – called LATCH VALUE – up to 0. When
as well as updating the so-called Jiffy Clock, the precise it reaches 0, if the corresponding bit in the aforementioned
C64 software clock per second (the Reserved Variables Registry is enabled, the Interrupt request will be generated.
TI and TI$, of THE BASIC V2, refer to the Jiffy Clock), are
managed through an Interrupt Routine. By default CIA # 1, as mentioned, generates an IRQ
Interrupt (via Timer A) 60 times per second.
To generate (“trigger”) the Interrupt is a 16-bit counter,
called Timer A, which constitutes one of the 5 Interrupt Before leaving the program we will need to remember to
sources of one of the 2 CIAs – the CIA #1 – acronym for re-enable Timer A (and ultimately re-enable keyboard
Complex Interface Adapter (6526), the specialized chips scanning) by typing a 1 in CIAICR bit 7 and, again, a 1 in
assigned to the interview with the I/O peripherals, that bit 0 that represents our Interrupt source: poke 56333,129
is, Input/Output.
Changing the value contained in the Interrupt Control
CIA chip #1 is connected, via an IRQ type line, to Pin 3 ofRegister is not yet sufficient to achieve our purpose, namely
CPU 6510. to ensure that the user cannot use the combinations of
keys alternative to the movements of the Joystick connected
IRQ stands for Interrupt ReQuest and is one of the 2 types to one of the 2 Control Ports of the C64.
of Interrupt Hardware covered by the C64 architecture. The 64 physical keys of the Commodore 64 are contained
The other Interrupt Hardware is the NMI acronym for Non- in an array of 8 rows for 8 columns, i.e. the Keyboard Matrix
Maskable Interrupt; CIA #2 is connected, via an NMI line, (See Fig. 3).
to Pin 4 of the 6510 microprocessor.
The Keyboard Matrix is connected to the CIA #1 via 2 of
The 5 Interrupt sources of CIA # 1 can be detected via its 16 internal registers: Data Port Register A mapped to
Figure 3
address 56320 ($DC00) and Data Port Register B In order to be sure to read, in one of the 2 Data Port
corresponding to memory location 56321 ($DC01). Registers, a value that comes from the Joystick, we only
have to write in advance in the 56320 Register (the Data
Actually, the physical keys of a C64 are 66 in all; the Port Register used, as mentioned, in writing) a 1 in its 8
Keyboard Matrix lacks the SHIFT LOCK key that does not bits corresponding to the 8 Columns of the Keyboard
need to be detected as it is replaced by the normal left Matrix. In fact, writing 1 in the bits of the 56320 Registry
SHIFT, the LEFT SHIFT (whose pressure it simulates), and will ignore the reading of the corresponding Columns of
the RESET key whose pressure generates an NMI type the KeyBoard Matrix (the opposite effect is obtained by
Interrupt. setting the bits of the Registry to 0).
The 56320 Registry (Data Port A) is used for writing to In BASIC V2, therefore, we will type the following statement:
select the Columns to be read from the Keyboard Matrix poke 56320,255
while the 56321 Registry (Data Port B), used for reading,
is used to read the Matrix Rows for the Column previously Ultimately, the 2 instructions that will be executed before
selected through the Data Port Register A. the next readings of one of the 2 Control Ports to which
the Joystick is connected (Register 56320 = Control Port
Just to complicate the life of us C64 RetroProgrammers, 2 or Register 56321 = Control Port 1) are the following:
the same Registers store - in the first 5 bits - the values poke 56333.1:poke 56320.255
corresponding to the 5 switches of the Joystick as well
described by the aforementioned Tutorial by Felice Nardella. We have finally achieved our long-awaited goal!
So when we go to read the contents of one of the 2 That's all folks!
aforementioned Registers we will have no way of knowing
if the bits of the Registers have been modified by the
Joystick movement (and/or by pressing the Fire Button)
If you want to join RetroProgramming Italia - RP
or by pressing 1 key (or a combination of keys) simulating
Italia group:
the 5 switches of the Joystick.
https://www.facebook.com/groups/retroprogramming/
by Gianluca Girelli
This article first appeared on Bitplane pages in May 2013.
ENGINE (GAME)
MATRICES, CONDITIONAL INSTRUCTIONS AND The graphics engine is the software core of a video
PROCEDURES game or any other application with real-time
graphics.
It provides basic technologies, simplifies
After learning in the previous tutorial how to work with development, and often allows the game to run on
strings or, rather, how powerful the string management different platforms such as consoles or operating
instructions are in ARexx, let's go into the details of systems for personal computers. Basic functionality
typically provided by a graphics engine includes a
procedures, matrices and, above all, conditional instructions.
rendering engine ("renderer") for 2D and 3D
graphics, a physical engine or collision detector,
PROCEDURES sound, scripting, animations, artificial intelligence,
networking, and scene-graph.
Unlike other languages (e.g. Pascal), where the difference "Parser" passing the variable "phrase"
between functions and procedures is strictly and syntactically
formal (as well as conceptual), ARexx handles subprograms ; subprogram structure
very easily. From the beginning, in fact, both the author Parser:
of the language and the community of developers preferred statement 1 ;these instructions
the simplicity of use and ease of reading to the formal use the content of "phrase"
complexity of structured languages. .....
Without wanting to go too far into the theory, we will simply instruction n
remember that, while a procedure generally aims to perform return
actions/operations, a function "returns" a result. In other
words: a procedure is usually invoked simply by writing Having said that, we will henceforth use the generic term
its name, while a function (returning a result) is assigned 'subprogram' for simplicity, avoiding, if possible, the term
to a variable. 'procedure'. The reason is this: as we know, in ARexx the
variables are all "global" and you do not need to declare
For our purposes, it is sufficient to know that ARexx a variable before using it. Nonetheless, the variables used
subprograms are invoked with the command "CALL within a subprogram are generally known only to the
subprogram_name (expression,...)". calling process. To change the scope of visibility of a
The list of parameters in parentheses has no length variable, the reserved word "PROCEDURE" was then added
limitations and is evaluated from left to right. If our to the language.
subprogram is actually a function, then the last expression This statement can be used within a procedure to make
might be the variable that contains the final result. In this certain variables "unknown" to the rest of the code.
case, it might be more convenient (and conceptually “PROCEDURE”, however, can also be used, in conjunction
correct) to use the following syntax: "result = with "EXPOSE", to modify this behavior. Before looking at
subprogram_name (expression,...)". an example, let's introduce another topic: matrices.
instead of having to use the classic: Please note the call to the subroutine "some_variables",
the implicit initialization of simple and compound variables,
for i=1 to 100 the use of the stem as well as that of the instructions
vector.i = 0 "PROCEDURE" and "EXPOSE".
next i
CONDITIONAL INSTRUCTIONS AND ITERATIVE CYCLES
Surprises don't end there, though. Since the "node" of a
stem can also contain other dots (ex: a.b.c), the stem also Let’s now close the present tutorial with a summary of
represents the name of the multidimensional matrix conditional instructions (already introduced in the previous
associated with it. In this case, assuming you want to issue with some examples of syntax analyzers) and iterative
initialize a two-dimensional array of 100x100 elements cycles.
to zero, the operation: Like all the more advanced languages, ARexx implements
constructs for iterating statements, but instead of having
matrix. = 0 different types of statements, it uses the following syntax:
Two activities linked to but distinct from porting are With regard to conditional constructs, they are presented
emulation and cross-compilation.
in the following forms:
===========================================
In the code snippet below you can see the use of the just-
So don't miss the next round of articles: "Game Coding
mentioned constructs as used in the textual adventure
with ARexx".
"cyber.rexx", written for educational purposes by the author
of this article. To introduce its scope, this is the subprogram
that manages "navigation" within the game world, for the Using the examples
sake of simplicity implemented as a two-dimensional matrix
As reported in previous articles, to use the examples
of "X" rows and "Y" columns. you have to save the script in text mode in the format
"name_script.rexx".
We have so clarified how the navigation works: we modifiy To launch the script just type from shell
X,Y coordinates according to the desired destination. As ">rx name_script.rexx"
or simply,
an example, “go east" means moving one location to the ">rx name_script"
right and it translates into the statement y=y+1 (while x
remains untouched).
special compass: the navigator's head. It is the only one in afirst-rate horror game or production. In The Secret of
able to find its way in this Dante Alighieri’s maze where Monkey Island, on the other hand, we find them mixed
mushrooms grow. This is truly a talking head kept alive with irony and carefree.
by a special magic of Monkey Island cannibals.
TRUE LIES
Year: 1994
Publisher: Acclaim
Platform: Snes
Genere: Platform
WAS RIGHT
Genre: Point-and-click
adventure
Platform: Windows
PROJECT
Year: 1989
Developer: Dynamix
Publisher: Electronics Arts
FIRESTART
Genre: Action/adventure/
survival horror
Platform: Commodore 64
» Gameplay 85%
Difficult and not suitable for
classic arcade "purists". Once
inside the game you will not be
able to stop easily.
» Longevity 85%
The Prometheus will not be
released in a moment. Many
hours of play.
Damon Slye and published by Electronic above all, but above all the thing).
Arts in 1989. Players of the time were not accustomed
to alien enemies so disgusting and
To all intents and purposes it is to be leathery compared to the standard.
considered the first example of survival
horror with multiple endings, conceived Difficult, violent, distressing...
ten years before the most famous games Beautiful.
of the genre.
A real killer application for Commodore
The gloomy atmosphere, the feeling 64. Never been out for other systems,
that the enemy is hiding around every envied by owners of more powerful
corner and that sense of powerlessness machines.
when you're out of ammunition made
it fast at the time and gave it a halo of Try it locked in your room... With only
mystical mystery. The magazines praised the C64 on, your joystick and the silence
him for the concept and for the game of the space station where...
system, the players were astonished at
the realization but then complained No one will hear you scream.
about the anomalous difficulty and a
totally different approach. by Carlo N. Del Mar Pirazzini
MANSION
Developer: Nintendo
Genre: Survival Horror/Action
Platform: Game Cube
"Mariooooooooo..... Mario! " not the first time he put himself in the
How many times by pressing the A role of the protagonist. Ten years
button of the Cube did we make Luigi earlier, he starred in "Mario is Missing!"
repeat this sentence? Me very often.
Luigi's Mansion is a title conceived by The story is simple: Mario was
“Mamma” Nintendo that gave life to kidnapped by the Boo, the popular
a saga very often underestimated, but ghosts of the series. For this
with an appeal, a style and an excellent characteristic, in the wake of the
gameplay. This first chapter was Ghostbusters' films, Luigi will find
released in 2001 (2002 in Italy) as himself facing them with a vacuum
the first title for the newborn Game cleaner and a Game Boy Horror with
Cube. the aim of exterminating the more
than 50 rooms of the haunted palace
It's part of the big series of titles to free up his brother after having
devoted to Mario and it had a remake obviously defeated the evil King Boo,
on DS and a beautiful third episode the final boss. Each room contains
on Switch. secrets, traps or moments of fear (up
to a certain point, ndN).
Upon its release it was criticized by
magazines and game experts, who It is in the gameplay that this first
superficially labeled the title "childish" episode presented itself as various
and simple. But everything improves and original, with ideas that still make
over time (wine, for example, ndN). it incredibly modern and never boring.
Let's go with order. The same formula proved to be
successful and remained almost
The game is fundamental to the history identical in the new chapters. This is
of the brand, as not only valorizes a an incredible strength. The use of the
character often in the background wonderful Nintendo cube joypad is
compared to Mario; Luigi who becomes masterful. The controls are very
an unexpected protagonist. This game comfortable and complete with the
basically does two things: detaches balanced use of all the buttons and
itself from the concept
of the series of a classic
platform and above all it
mimics the numerous
survival horrors that
prevailed in that
period.
An experiment never
attempted before by
Nintendo and that was
not understood by the
magazines. This is
something that should
be considered
innovative and
incredible!
CANNON
Year: 1993
Publisher: Sensible Software/
Virgin
FODDER
Developer: Sensible Software
Genre: Shoot'em-up/Real-time
strategy
Platform: Amiga
» Gameplay 96%
A successful mix of real time
strategy and shooter, with so
many classy touches and a
playability so high that can
hand down win the challenge
with time.
» Longevity 95%
As said above Cannon Fodder
is a brilliant video game that,
along with many others, has
helped to fix in our hearts the
creativity that permeated the
early '90s by making us love
the Commodore Amiga
systems.
MICRO MAGES
Year: 2019
Developer: Morphcat Games
Genre: Platform
Platform: Nintendo NES
"Do not be a magician - be magic!" one shot to kill the opponents, but
Leonard Cohen increasing the levels we will face more
" coriaceous" opponents who will
Micro Mages for the Nintendo need several shots.
Entertainment System, developed by During your exploration, you'll find
Morphat Games, is a vertical sliding chests and treasures to help you. In
platform game that sees us as a each box we will find several useful
magician just arrived in an ancient bonuses like a fairy who will give us
demonic fortress to save the princess a shield to protect from opponents
from the forces of evil. shots or a feather that will give us the
chance to fly… And much more.
The journey inside the fortress will
place our hero in pink tunic in front Every 16,000 points (collected with
of great treasures, horrible creatures bonuses or destroying the enemies)
and deadly traps. Only thanks to his we will be awarded an extra life.
magical skills and his climbing skills There are also checkpoints, as in any
the little magician can reach, with our respected platform, usually located
help, the top of the tower. at the middle of the level and really
useful during the longest and most
There are 4 towers to pass: complicated routes (the third world
The Haunted Dungeon - an old lost for example).
tower full of bats and skeletons and The game also has a convenient
where a huge ghost screams at its password system to save the location.
victims to kill them. Passwords will be provided at the end
Valhalla Tower - where the Goblins of each tower.
are building a structure that leads to Once we reach the top of the towers
Valhalla. we’ll be faced by their big bosses.
The Jungle Temple - built inside a
dormant volcano and ruled by the
Prince of Darkness... and finally
Last Tower - The last tower is the
somewhat mysterious headquarters
of the supreme evil that trapped the
princess.
» Gameplay 90%
Smooth, dynamic and well
balanced. It won't bore you
and will keep you hooked to the
joypad to complete all the 4
worlds of the game.
» Longevity 65%
...4 Worlds that are a little bit
few and once you get the
patterns of opponents and the
logic of the puzzles it will be
easy and fast to finish the
game. Such a shame...
Year: 1993
Publisher: Id Software
DOOM
Developer: Id Software
Platform: Pc MS DOS, Atari
Jaguar, Super Nintendo, Sega
Mega32x, Sega Saturn, Sony
Playstation, 3DO, Amiga.
Genre: FPS
» Gameplay 95%
Immediate, intuitive, fast,
frenetic... Many weapons, levels
and hidden bonuses. Lets you
play and makes you play like
crazy.
» Longevity 95%
Many believe that Doom is just
a relic from the past; an
important relic, of course, but
nothing more. False! The
creation of Id Software is not
only pioneering, but also one of
the best video games ever
makes us understand the age of this never feel bored, especially since every
made; a brilliant work of a
product. What is it? Well... Our hero time a key is collected, some areas will
company whose mentality was
can't tie his shoes, look at the mouses... be repopulated.
practically quite similar to what
I mean, he can't lower his eyes or even
independent developers do
raise them because three-dimensionality Over the years, fans of the saga have
today. A game of players for
was still “a Prototype" and not yet fully created hundreds of maps, mods,
players. It's beautiful, it's fast,
implemented (it will arrive a few years additional layers and systems to make
it's deeply compelling,
later with Quake and Descent). this product eternal. Some of these
immense in single and superb
products are incredibly manufactured
in multiplayer.
That makes Doom old, makes it a like Brutal Doom from which the series
It's Doom, and it's here to stay
masterpiece from another era. restarted again.
until the Hell burns!
Where we haven't concerned by
photorealism, 60 fps, 4k/8k or ultra- It was just adrenaline! No regenerative
realistic engine. health, no guidance on where to go
We were just thinking of using chainsaws next, no artificial intelligence with scripts
to gut every Cacodemon in the world. and no specific covers to hide behind
something.
At the time of its release, Doom was
criticized arguing that it was a simple Run like a madman between levels,
game in which waves of enemies were shoot down demons after demons,
shot down; enemy after enemy. It was collect useful objects.
far away from the truth.
This was DOOM and this is DOOM again.
This is not the usual Left for Dead, but
a game in which we will find a complex by Carlo N. Del Mar Pirazzini
design of fantastic levels, full of traps,
with intelligently positioned enemies,
tons of secrets and many situations in
which you will need to think to not being
slaughtered by demons.
TAKESHI
Genre: Platform
Platform: Nintendo FamiCom
this unfortunate work. It is useful to 7) there are porn situations, you can
remember that Takeshi hated electronics, drink whiskey and play Pachinko OUR FINAL SCORE
mobile phones, emails and his ideas 8) inside the Pachinko room we can
were always mixed in a bizarre only advance to the next levels if we kill
combination of tradition and madness. the people who are beating us
» Gameplay 1%
Takeshi has really created an awkward 9) we will be able to fly aircraft, even
cartridge for Nintendo FamiCom. an aeroplane, but it will not be able to
land and therefore we will crash to the It's a traumatizing experience!
Moreover, during the development of ground unnecessarily, resulting in game
» Longevity 1%
the game, Takeshi was involved in an over
extramarital scandal and ended up in 10) the end of the game is a small
the papers. drawing with Takeshi's face that says You can't wait to turn off the
The editor of the newspaper that "congratulations" FamiCom!
published the news was even beaten 11) plus numerous other strange things
by Takeshi himself (along with his that I absolutely do not want to remember
followers) during a violent rapture of or describe...
madness: from that day on the great
Takeshi who belonged to the historical It seems like a tragicomic, violent and
comedic duo "Beat Takeshi" was enriched absurd work, created by a person who
with the qualification of "Beat Takeshi" hates video games: a logic typical of
in the sense of "to beat up". Takeshi who really hates electronics
and video games.
Away from television for a few months, Perhaps this logic was really wanted
he obviously returned more famous by Takeshi, with a macabre conscience.
than before and completed his unfinished No one will ever know. No one will ask
business, scheduling numerous future Takeshi for an explanation. Few will
engagements. remember this troublesome game. I
think Nintendo is not even happy with
The game consists of a very simple the presence of this article, patience,
platform, with several elements and I will try to make it up to you with a
bonuses to discover. In short, it is a letter of apology!
platform where you have to make the
classic decisions to advance at the level. Even the creators of the "Strategy Guide"
The music is frustrating, a loop without to complete the game have “cold
harmony, not listenable at all. The sweated”, facing such an absurd,
English translation, fortunately, is irrational and illogical game.
excellent.
If you will find this cartridge in Tokyo's
https://youtu.be/j_RH518LyOk thrift stores, you absolutely must take
it, it is a collectible monstrosity, with
There are many peculiarities of the the consequent monstrous logic of
game, I will not be able to list all of them collecting prices. Unfortunately, the
since I have played it three times and manual is even rarer. I don't own it either.
I will certainly not play it again in the
future: Well dear readers, I very much hope
that this review has respected the
1) if you throw punches in the air 20,000 "horror" soul of Halloween, goodbye
times on the title screen you get directly to the next issue, I promise you that we
to the end of the game will return to normal talking about
2) there are levels where you have to Japanese madness!
attach the second pad equipped with
a microphone and sing like in the Karaoke by Michele "Conte Ugolino"
halls
3) we can divorce and/or beat the shit
out of wife and children (remember that
the game is officially released by
Nintendo!)
4) we can beat our employer
5) we can beat the cops and at the same
time be beaten by them, losing energy
6) we can beat everyone like crazy and
be hated by everyone and above all be
beaten by people who hate us
Year: 1989
STORMLORD
Developer: Nick Jones,
Raffaele Cecco, Huges Binns
Platfom: Commodore 64
Genre: Platform
But this time I'd be lying if I say this number didn't make any sense to us. Share — copy and redistribute the
material in any medium or format
This number, big, round, high-sounding, awakened our ego and... We wanted
to celebrate! Adapt — remix, transform, and build
upon the material
It is relevant to say that this number is only a part, certainly the largest, of
the absolute total. Some sites mirror our magazines and we have also found The licensor cannot revoke these
freedoms as long as you follow the
some of them on archive.org. This is certainly another point of pride for all of us. license terms. Under the following terms:
But let's stop talking about what we have achieved. Attribution — You must give appropriate
Reached objectives are already part of the past, while we, apart for computers :- credit, provide a link to the license, and
D, are always oriented towards the future! indicate if changes were made. You may
do so in any reasonable manner, but not
in any way that suggests the licensor
During the last internal editorial staff meeting, we discussed many points that endorses you or your use.
we would like to complete in the near future. There are several projects we
hope to be able to announce very soon, but what we would like to see more NonCommercial — You may not use the
and more is the active participation of our readers with their contributions. material for commercial purposes.
Francesco Fiorentini
RetroMagazine World
Year 1 - Issue 4 - NOVEMBER 2020
Chief Editor
Francesco Fiorentini
Managing Editor
David La Monaca
Editing Manager
Marco Pistorio
Web Manager
Giorgio Balestrieri