Showing posts with label Easy68k. Show all posts
Showing posts with label Easy68k. Show all posts

Tuesday, 25 June 2013

Easy68k... Editor / Assembler / Simulator... 68k in Windows!

I have stumbled upon Easy68k, this looks like a great way to learn vanilla 68000 assembly language.  OK so it's in Windows, but surely I'll learn the skills needed for achieving my goal of making a game for the Amiga 500.

For starters it was very easy to install and it comes with some tutorials as well as examples on their website.  The forum on their website is full of people in a similar boat of learning 68000.

So already I've been reading up and now finally have a good environment to have a play about.  I will try and share with you examples of my progress and I think this is a good starting point.

Moving a red blob!

I often find with tutorials and examples when learning technology that the basic stuff is REALLY basic, then all of a sudden the examples are so advance you struggle working out the steps involved.  With that in mind, I wanted to share an example to move a blob about the screen using some user input, the keyboard.  This covers drawing to the screen, and capturing key strokes.  

There is already a Snake type game called Pallet Eater in the examples which is great, but I just wanted to break a few things down.  Simply draw a single red square, and the user can move up / down / left / right.  That's it!


That really is it!

I'm not an expert at assembly (yet), please let me know how I can improve my code.  Any sort of hints and tips would be great. Also if there is a better way to share the code examples please let me know as the code will be getting a lot bigger!

Comment here or get involved on twitter: @rich_lloyd

Here's the code:

*-----------------------------------------------------------
* Title      : Red Blob
* Written by : Rich (http://www.retrorich.co.uk)
* Date       : 24 June 2013
* Description: Moving a red blob around the screen using keys 4,6,8,5
*-----------------------------------------------------------

CR      EQU     $0D
LF      EQU     $0A 

START   ORG    $1000

* --  Make the pen and fill red  -- 
        move.l #$000000FF,d1 
     move.b #80,d0
     trap #15
     move.l #$000000FF,d1
     move.b #81,d0
     trap #15
      
* --  Turn echo off  --
     move.b #0,d1
     move.b #12,d0
     trap #15

* --  Get the time and store it in d5
     move.b #8,d0       
     trap #15
     move.l d1,d5    
   
* --  Set game loop speed
     move.l #5,speed    

* --  Set start position --     
     lea     player,a0     
     move.w #100,(a0)+     Set the start pos to be 100, 100
     move.w #100,(a0) 
        lea     player,a0
        
* -----------------------------------

LOOP    

* -- timing the game loop --

     move.b #8,d0     Re-get the time
     trap #15
     sub.l d5,d1     Subtract the old time from this new time
     cmp.l speed,d1 If less than  hundredths of a second has passed
     blo     LOOP         Loop again until it has
     move.b #8,d0     Now that enough time has passed
     trap #15
     move.l d1,d5     Put the current time in memory for the next loop

* -- grab input --
    *Check to see if a key has been pressed
     clr.l d1
     move.b #7,d0
     trap #15
     tst.l d1
     beq     nokey     Key wasn't pressed, clear movement

    *Read the key that was pressed and find out which key it was
     move.b #5,d0
     trap #15
     
     cmp.b #$35,d1     Key pressed: 5 (down)
     beq     move_down
     cmp.b #$38,d1     Key pressed: 8 (up)
     beq     move_up
     cmp.b #$34,d1     Key pressed: 4 (left)
     beq     move_left
     cmp.b #$36,d1     Key pressed: 6 (right)
     beq     move_right


nokey
        clr.l   d6          Clear any movement
        clr.l   d7
        
continue

        move.b  #11,d0      Clear screen
        move.w  #$ff00,d1
        trap    #15
    
     lea     player,a0     Store current position
     add.w d6,(a0)+     Add any movement to position
     add.w d7,(a0) 
        lea     player,a0       Update current position

        bsr     draw_square     Draw player

        bra     LOOP

* -- key(5) was pressed
move_down
     move.w #0,d6 
     move.w #10,d7 
     bra continue

* -- key(8) was pressed
move_up
     move.w #0,d6
     move.w #-10,d7
     bra continue

* -- key(4) was pressed
move_left
     move.w #-10,d6
     move.w #0,d7
     bra continue

* -- key(6) was pressed
move_right
     move.w #10,d6
     move.w #0,d7
     bra continue

DONE    MOVE.B  #9,D0
        TRAP    #15
    
draw_square
     clr.l d1
     clr.l d2
     clr.l d3
     clr.l d4
     move.w (a0)+,d1
     move.w (a0),d2
     move.w d1,d3
     add.w #10,d3
     move.w d2,d4
     add.w #10,d4
     move.b #87,d0
     trap #15
     rts
 
speed ds.l 1       store game loop speed
player ds.w 2       store player screen pos

Monday, 24 June 2013

Starting to learn assembly language - the journey begins... where do I start?!

Final goal?

Write a game for the Amiga 500.  Bonus goal would be for the same game to run on the Sega Mega Drive (Genesis), but I'll work that out once the first goal is achieved.

Lets start!

I have an Amiga 500, and as mentioned before I'll be following the Amiga Format Bullfrog tutorials for writing a game in assembly language (I'll be writing separate blog posts for each tutorial).  OK so tutorial 1 was pretty straight forward, very basic beginnings pretty much incrementing a register to move a sprite position and understanding some basics.  I've had a quick flick through ahead of the future tutorials and it's pretty obvious that I'm going to have to do some extra research!

OK after some quick googling, I've come across the following websites:

Through those links I was able to download numerous pdf documents, text file tutorials and lots of other people discussing assembler. Great!

A few people had mentioned particular books that they recommended, which then put me on a mission to hit ebay for real world BOOKS! Ebay books for 68000 processor

Real world books I've ended up with, should keep me going for a while!

"Lets get real"

OK so coding on the Amiga 500 is great, I have DevPac 2 and I can run simple examples.  However, this is going to take forever!  Not only is assembly language slow to code (especially when I'm learning), but one of the biggest draw backs is the lack of resources on the machine. As in, I can't just Google something and try it out.  My Amiga 500 is on my desk and sits next to my laptop so yes I can Google stuff, but I have no way to transfer files across other than typing out line by line. What do I do?

Ebay to the rescue again... I've purchased an Amiga 1200 (with a broken floppy drive - hopefully I will blog to explain how I will fix it).  The great thing about the Amiga 1200 is that you can connect it to the internet, and also use a compact flash card as a hard drive!! 4Gb!!  It's still in the post, but I expect I will try and code on the A1200 and once I'm up to speed I'll try and create boot disks with my tests and trials for the A500.  Remember my goal is to write a game for the Amiga 500 not Amiga 1200!


What next?

I've read through most of 2 68000 books, and I think it's becoming clear that I'm learning vanilla 68k assembly language.  I need some Amiga specific references.  I'm using DevPac 2, but maybe I need to get my hands of DevPac 3, AsmOne or some other assembler package?  And then find a reference + tutorials for that package?

I have stumbled upon Easy68k, this is an Editor, Assembler and Simulator for the 68000 that runs in Windows.  Again this looks like just vanilla 68k, but looks like a great way to learn the basics without crashing my Amiga ever time!

Do you still code in Assembler?!

Would love to hear from anyone who still codes in assembler, especially for the Amiga machines.  Or maybe if you used to?  Any hints or tips you could recommend?

Comment here or get involved on twitter: @rich_lloyd