
Can't get out of the prison cell? You have to ask for help.
The remake of the Sinclair Spectrum from Retro Computers is about to ship. Despite our suggestion that it was a rubbish idea 4,549 of the 7,193 Reg readers who voted in our poll disagreed and quite a few must have put their money where their mouse is - as the first 1,000 Vegas sold out shortly after our article appeared. The …
This post has been deleted by its author
I NEVER finished that! Probably just extremely thick, but I NEVER fathomed what "A window is no obstacle to a thief with friends" meant (and why the fuck, over 30 years later, can I STILL recall that verbatim (at least I think it's verbatim…)…?!). Even reread the book, didn't help dumdum here…
I must have tried every verb-noun combo I could think of. Still couldn't escape.
This post has been deleted by its author
This post has been deleted by its author
Vaguely remember there was a BASIC variable stack pointer which used ROM routines to push and pop or if you were feeling brave accessed directly by reading the pointer from the system variables area. The Spectrum's floating point numbers were stored with a higher precision than 32-bit C floats today, they were 5 bytes long.
This post has been deleted by its author
There were ints, stored in such a way that would never be a legitimate floating point value...
"Small integers have a special representation in which the first byte is 0, the second is a sign byte (0 or FFh) and the third and fourth are the integer in twos complement form, the less significant byte first."
http://www.worldofspectrum.org/ZXBasicManual/zxmanappc.html
So, that's ten minutes that I'll never get back looking that up.
This post has been deleted by its author
But within BASIC there was no explicit integer type for variables, which in other BASICs was normally achieved by suffixing the variable name with %.
You didn't need to tell it to, the interpreter picked the most appropriate format when storing number variables. If a variable needed type conversion (e.g. LET a=1 : LET a=a+0.1) then it was done automatically. I've never seen that done as well in any language since, the usual brain-dead scripting languages around these days are happy to let you do 1+1 but if you're not careful you can get 11 back as the answer.
If only all problems in software now were like this.
There was a ROM routine which made it save some memory to tape. You could run it on every Spectrum in Smiths to make it look like it was loading and come back later to find out how big the queues were getting. Bonus points for changing the screen colour to black and printing "Bytes: <name of latest blockbuster Ultimate game here>" before calling it.
This post has been deleted by its author
Nearly as good as the BBC..
10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10: 10 GOTO 10:
Hit enter and run like hell, as white noise would ensue :-)
This post has been deleted by its author
This post has been deleted by its author
Note quite. It was:
10 G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10:G.10
the point being that the expansion of line number parameter of the GOTO always took four bytes. If you entered GOTO 10 the GOTO was compressed to a one-byte token, so 'GOTO 10' compresses from 7 bytes to 6 bytes, but 'G.10' compresses from four bytes to five bytes, so the input buffer overruns and crashes into the sound buffers. Fixed in later versions of BBC BASIC where an extra BCS err_NoLineSpace was put in.
"It was at address 1331 in the rom. RANDOMIZE USR 1331 would activate it.
You could run it on every Spectrum in Smiths to make it look like it was loading and come back later to find out how big the queues were getting."
Haha yeah, "Program: Manic Miner" was the one that got the most interest.
I always used USR 1310, but looking at the code now, neither start at a sensible point in the code.
"Yes, for some reason the routine never ended, which is odd. I'll have to disassemble it and have a look sometime..."
Yeah... Not sure without looking why it never maxed out at 65536, but here's the disassembly, complete with notes!
This post has been deleted by its author
Look at L34B3 (usr-no). It calls L1E99 (FIND-INT2) which then calls L2DA2 (FP-TO-BC). By the time it comes out of that, BC holds the address given in USR, DE holds STKEND, and the carry flag is not set so it returns back to usr-no.
If you search for 'Part 6. EXECUTIVE ROUTINES', STKEND is 0x5CB6 (23734) or probably little a bit more when the computer starts up.
Somebody else can test it...
Heh, I remember the old 10 print "fuck off" 20 randomize usr 1331 trick. Many happy lunch hours watching the staff at Menzies fiddling round the back of the display Speccys trying to yank the power cord out to shut the thing up.
Anyone try running a 10p across the Amstrad 6128 edge connector?, amazingly, it didnt knacker it like it would have done on any other machine of the era, but produced all sorts of colourful displays and random sounds.
The menzies near me was great, the display machines were far enough away from the checkout that you could get away with all sorts. I used to ask to try c64 games, which they would stick in the tape deck and leave you to it, then I would power off the machine, insert a freeze machine cartridge and copy the game onto a blank tape. Happy days indeed, although one guy got caught doing it and got quite a severe fine after being escorted away by plod.
This post has been deleted by its author
I must admit that I'm a bit puzzled as well.
This appears to be creating line 10, which contains the code "GOTO 10", and doing it repeatedly on a single line (the line parser allows multiple basic statements on a single line, separated by colons, and I think it also worked when entering lines of code).
It looks weird, so I think that if it's doing something unusual, there must be a bug somewhere. I don't remember any sort of bug like this in the BEEB, but then again, I didn't do anything like this.
Alternatively, he might be using the arrows and copy key, recursively copying the characters from the line until the maximum line length was reached, at which time the BEEB would sit there beeping at you for as many copy keystrokes as were buffered in the keyboard buffer. But that would not be white noise, which would not actually be that disruptive in a shop, even if it were at maximum volume.
The sort of stupid things that people did were to reprogram F10 (the break key) to contain "OLD:RUN", so that it was more difficult to stop (especially if ESC was also trapped). [CTRL-Break got it back].
My favourite was on a ZX81, writing about a 4 byte machine code program in a REM statement in the first line of the program (and thus a fixed address) that put a value in the Z80 I register (which was used to contain the high-byte of the address of the character generator table), which led to the screen becoming scrambled. You could tell something was there, everything worked OK, except that you could not read any of the characters,
"My favourite was on a ZX81, writing about a 4 byte machine code program in a REM statement in the first line of the program"
There was a couple of pokes and a USR call you could do with the early ZX81s whereby it would crash but the crash would involve it playing random notes through the TV speaker and rubbish on screen. As crashes go it was pretty impressive. It also made me realise that it could actually generate sound through the TV so why didn't they implement it?
On later versions of the ROM (or actual hardware?) this didn't work however which was a shame.
This post has been deleted by its author
"probably an artifact of your particular TV reacting to a non-standard video signal during the crash."
Quite possibly. But the TV never did it on anything else. I'm wondering if somehow the video modulator was over modulated which pushed part of the video signal into the audio band and caused it that way.
There was nothing particularly cheap about the modulator (well, actually it was probably the cheapest Sinclair could source, but it was the same as fitted in any number of other home computers), but it was not unusual for audio crosstalk in any of the machines of this generation, especially when displaying 'busy' pictures on cheap black and white televisions.
I bought an add-on (effectively a second modulator) which remodulated the signal to include sound, which I fed from a Quicksilver sound board (it has an AY-3-8910), controlled by a number of memory-mapped locations. I used it, along with a programmable character set mod (remember what I said about the I register) to get mine to display and play music. Unfortunately, in slow mode, ZX Basic was more than a bit slow, so there was an appreciable delay in displaying the notes and them playing. But it kept me occupied on dark nights back in 1981 while I waited for my BBC Micro to arrive.
This post has been deleted by its author
That's interesting. I knew about the data bus isolation resistors, but did not know what their real function was. I assumed that the Z80 was effectively idling or halted during the display cycle, and also that the ULA was driving the data bus address lines, but what you say makes a lot of sense, and would make the ULA much less complex.
Presumably at the beginning of every display frame or line, there was some form of context save so that the Z80 could resume where it left off after taking an excursion to walk through the display memory addresses.
I'm still a bit puzzled, though. The ZX81 display file was not bit-mapped, so it would have to read each character position 8 times (one for each row of the character), one for each of the 8 horizontal scan lines, so what was being addressed was the index into the character generator table, with an offset to get the correct line. The display hardware would then have to look up the line in the CG table to get the 8 bits to serialise out to the modulator. I suppose the ULA may have been able to buffer 32 characters and serialise them. I'll probably never know!
For any of you who didn't understand the bit of halting at the end of the line, when the ZX81 did not have a RAM pack, it used a collapsed display 'file' (this is what it was called) that only contained the characters that had been written on the screen. Any trailing whitespace (well, trailing unwritten character locations really) on a line did not have memory allocated, so the actual display could be held in as few as 25 bytes if there was nothing on the screen.
In this case, each line of characters on the display would be empty, with just the "end of line" character that Mr Coder mentions. As the cursor was always one character, at least one of the last two lines normally had a single character, leading to the 25 bytes (23 empty lines with just the EOL character, and one with a single character and the EOL character.
It was amusing to see a ZX81 without a RAM pack struggle to reorganise memory every time you added to the display.
Of course, with a RAM pack, the display file was always it's full size.
This post has been deleted by its author
Only two years late...
The Z80's most primitive operations take four clock cycles to complete. The first two cycles fetch the opcode. The second two are the refresh cycle — the Z80 can refresh dynamic memory for you, and does it then.
So when the ZX80 and ZX81 are walking through display memory, the video output gets two memory accesses for each instruction, not one. It grabs the opcode during the first two cycles and (normally*) supplies a NOP to the processor. Then during the refresh cycle it puts the captured value back onto the bus along with an internal 3-bit counter to fetch the actual pixel byte. Then it outputs that.
There is only a one-byte latch, to preserve the character from the opcode fetch and reproduce it as part of the address during the refresh cycle. No 32-byte buffer. And the top part of the refresh address is unchanged during the refresh cycle. So that's how you can change the character set lookup location.
Both the ZX80 and ZX81 use static RAM. So they don't need a working refresh cycle.
* unless bit six is set. That ensures HALT gets through. It also explains why the ZX80 and ZX81 have only 64 characters in their character set.
Why not just buy an old speccy off ebay or gumtree rather than this hobbled effort? Or if they really must remake a 30 year old computer then why not do it properly and include a proper keyboard so at least people could use it properly? The novelty of playing the games on this will last about 5 minutes at a push I reckon and they won't even be as good as those all in one multigame joysticks that were popular for about 10 minutes 10 years ago.
I just don't see the point - what am I missing here?
This post has been deleted by its author
"If the keyboard is in the released product is authentic to the original, expect a lot of frustrated people. I did use the real machines back in the era, and I'm sorry to tell you, but they were really frustrating and a pain in the arse."
Well yes, but you could say the same about classic cars. Authenticity trumps usability since if you want the latter just buy a modern car/computer.
"The chances of getting a fully working one that stays working now is, err, somewhat low."
Oh ye of little faith.
My Speccy +2 still works perfectly fine, with the built-in tape deck it means no farting around with volume / tone levels either.
But when I want a bit of nostalgia without digging the +2 out, connecting it to a screen and waiting for the tapes to load I have Marvin, it fits in my pocket, along with my Zeemote Bluetooth joystick :)
Right - that's not how you retro-game with style! The proper way is digging up an actual Speccy then jacking the tape input to your smartphone's headphone output and have it play back whatever you want to load at crystal crisp quality - "tape loading error" is not invited to the party...
"tape loading error" is not invited to the party...
Has anyone here tried loading cassettes from 30 years ago? Just wondering if I fire up my old computer whether the print-through from having all the tapes in storage since the 1980s will have rendered them unreadable.
It depends on the binder used on the oxide and the storage conditions. In the pre-cassette Reel to Reel era they produced a rubbish formulation. Earlier and later tapes are OK.
With actual computer "tape backups", some tapes of entry level floppy interface drives could be unreadable a week later, or other tapes could be OK years later depending on maintenance of drive, atmosphere at the computer, make of tape and the tape storage.
This post has been deleted by its author
I occasionally fire up my Apple ][+ emulator.
The problem is that the screen is so very small, or so very horrible when large. I'd love to see some of the games remastered for high-res. Someone re-created choplifter for the mac with fancy graphics and scenery. It was ok, but I'm thinking keep the same look, just smooth out the graphics - 320x240 just looks horrible these days.
It does appear that gameplay hasn't changed much in 30 years. I saw "crossy-road" recently... why can't they just call it Frogger 2015? If you thought 1980's joysticks were rubbish, wait til you try using a touch-screen...
Needless to say the list of games published in the Times at the weekend has several games which they do not have the rights to distribute.
Basically the letters to the rights holders where told, contact us if you DON'T want us to use your software to make money (without paying you).
Which is annoying (to say the least)
This post has been deleted by its author
I was always under the impression that the whole point of shareware was that it was distributed free of charge. It was up to the author to include (within the software or as a separate file) a request for payment if you liked the software and intended to use it beyond some reasonable trial period.
This post has been deleted by its author
Playing with the Speccy as a kid - bit of BASIC and machine code, building hardware connected to the expansion bus controlled by software, adding the Snapshot plus real 3.5" drive for instant game backup and loading, a hardware voice synth for use with the Chess game. EPIC times. All of this led me to a degree course and a very happy life in IT.