Saturday 12 June 2010

Welcome to my gaming blog.

Well, I did have a blog on MySpace, but no one reads it and I've neglected it, so I posted some items on FaceBook using the 'notes' thingy which was okay but only people on my friends list could read it or something, so I thought I'd start a blog here. All the best writers have them apparently, so why not me? Well, maybe because my writing is generally the best aspects of mediocrity, and probably because I'll again neglect this, but never mind.

Anyway, a bit about myself: I'm a part-time freelance writer for the magazine Micro Mart (http://www.micromart.co.uk/) published weekly in the United Kingdom and available every Thursday for a partly £2 from your local news agents. I've just finished the first year of my Foundation Degree in Computer Enterprise and work part-time in social care. I have a young daughter, called Ruby Mae, who is fast approaching her second birthday. It's good now she's growing up a bit because it means that we can have a laugh.

But the important thing to know, as this is a gaming blog, is what games I'm playing at the moment... and to be honest, I've not had chance to indulge myself in any binary worlds lately, so here is some Z80 machine code which will happily work on the Sinclair ZX Spectrum for you to look at:

SCR EQU 16384   ; Screen Ram location
ORG $6000       ; This is where we want
                ; our program to start
                ; in RAM (6*4096)

LD BC,STRING    ; Right, let's get the
                ; location of where the
                ; text is that'll be
                ; written the screen
LD DE,SCR       ; And let's get the
                ; locator for the
                ; screen and put
                ; it into a register
                ; DE (or in otherwords
                ; LET DE=SCR)
LOOP            ; Here is our first
                ; label, called LOOP
LD A,(BC)       ; Let's put the first
                ; byte at BC into A,
                ; or in otherwords
                ; LET A=PEEK (BC)
CP 0            ; Compare this to
                ; zero, which is the
                ; marker for the end
                ; of the data which
                ; we're writing to
                ; the screen
JR Z,EXIT       ; If A does equal
                ; zero then let's
                ; go to the label
                ; EXIT
RST $10         ; Print A to the
                ; screen
INC BC          ; Let's increase BC
                ; by one so to get the
                ; next byte from our
                ; DATA string
INC DE          ; We'll increase DE
                ; as well to put the
                ; next char one step
                ; to the right of
                ; the previous
                ; outputted character
JR LOOP         ; This simply jumps back
                ; to the label LOOP to
                ; repeat the process
EXIT            ; Here's our EXIT label
LD BC,0         ; Let's clear the
                ; register BC to zero
RET             ; RET simply returns
                ; to BASIC
STRING          ; Here's our STRING
                ; label (or in other
                ; words, where out text
                ; is)
DEFB "Hello World!"
DEFB 13,0       ; 13 is a new line or
                ; carriage return,
                ; and zero says
                ; "end of data"
  

Good, innit? When assembled, load it into your favourite Speccy emulator and PRINT USR 24576 - amazing eh? But why do you get the zero displayed on the next line after Hello World! is drawn to the screen? Well, you could also try RANDOMIZE USR 24576, but you won't see anything. So, try INK 0: RANDOMIZE USR 24576 - there, it works without the zero being printed... so if you're going to execute the code using the latter method then you need to tell the Speccy to set a colour for what it's going to output first, whic of course you can do in the code itself. But how do you do that? Answers on a post-card.

2 comments:

  1. Hello! Pleased to find your blog. Will this machine code work on any machine with a Z80? I have an intertec superbrain which has zero graphics capabilities - unless using text or special characters etc. I do have a graphics add on card for it - a Micronex Pixel Plotter, not tried it yet and there is very little on the 'net except old Byte magazine adds and such. Need to get a serial transfer link set up and i can get your code across to my 'Brain - or just type it in, which is probably the intention here.

    ReplyDelete
    Replies
    1. As I recall, this routine is for the ZX Spectrum only, although it may be adapted to run on other Z80-based machines.

      Delete