Search code examples
assembly68000easy68k

How to slowly output text to the console using easy68k


I'm currently creating a simple space-style resource management game in easy68k.

One part of my game consists of a simple loop which signifies the point from which the players fleet leaves home base to when they reach their mission destination. The loop is controlled by the distance to travel and the ships fuel. So if the fuel runs out then I will add in a function that will let the player know they didn't make it to their destination and they have lost their ships.

In between all of this happening I have a random number generated from 1-100, depending on the number generated, a certain event may happen e.g the player will find some salvage, crewmen, abandoned ships, pirates etc. When one of these events occurs I want to output a message to the console screen to let the player know.

My problem is that when the loop is run, if any events occur, they are all output to the screen in less than a second and the player ends up missing out on most of the events.

I'm wondering, is there a way to delay the output so that the writing appears at a pace that the player can easily follow?

Any help would be greatly appreciated.

If it helps here is my loop, I'm not fully finished implementing all mechanics but the loop itself works fine.

      *-------------------------------------------------------
      *---------------Update Mission Progress-----------------
      *  Move to mission location, random events will occur
      *------------------------------------------------------- 
update:
bsr     endl            print a CR and LF
bsr     decorate        decorate with dots using a loop

move.w  $4000, D7       move distance value into D7
move.w  $4020, D6       move fuel value into D6

lea     update_msg,A1   Display update message
move.b  #14,D0
trap    #15

update_loop:

move.b  #8,d0           Get time 1/100th seconds since midnight
trap    #15
and.l   #$5FFFFF,D1     prevent overflow in divu
divu    #100,D1         time count / 100
swap    D1              swap upper and lower words of D1 to put remainder in low word
addq.w  #1,D1           d1.w contains number from 1 to 100
move    D1,D2           d2 = d1

bsr     check_events    check to see if any of the events will occur   

sub.b   #fuel_cost, D6  reduce ships fuel by one
CMP     #0, D6          if the ships fuel reaches 0 then go to out of fuel routine
BEQ     out_of_fuel     

sub.b   #1, D7          reduce mission distance by 1               
CMP     #0, D7          when it reaches 0 go to the continue subroutine            
BNE     update_loop     otherwise go back to the top of the loop

BRA     continue_loop 

continue_loop:
*Used to leave the update loop
lea     continue_msg,A1 
move.b  #14,D0
trap    #15

move.b  #5,D0           wait for input so the player can read the event messages
trap    #15

CMP     $94, D1
BNE     continue_loop


move.w  D6, $4020       store the new value for ship fuel

bsr     decorate                           
rts

check_events:    
*Check to make sure the random value is within the specific range for each event
CMP     #95, D2
BGE     check_found_salvage

CMP     #75, D2
BGE     check_hit_mine

CMP     #55, D2
BGE     check_pirate_attack

CMP     #35, D2
BGE     check_found_ship

CMP     #15, D2
BGE     check_found_crew

rts
*Further checks to make sure the random value is within the specific ranges 
check_found_salvage:

CMP     #97, D2                   
BLE     collect_salvage              
rts                                 

check_hit_mine:

CMP     #77, D2                    
BLE     hit_mine              
rts                 

check_pirate_attack:

CMP     #57, D2                    
BLE     initiate_attack              
rts                 

check_found_ship:

CMP     #37, D2
BLE     check_collect_ship
RTS

check_found_crew:

CMP     #17, D2
BLE     collect_crew
rts
*Run each event, outputting a message to the screen if an event occurs  
collect_salvage:

lea     found_salvage_msg,A1   
move.b  #14,D0
trap    #15

rts                                 

hit_mine:   

lea     hit_mine_msg,A1   
move.b  #14,D0
trap    #15

rts

initiate_attack:    

lea     initiate_attack_msg,A1   
move.b  #14,D0
trap    #15

rts

check_collect_ship:    

lea     found_ship_msg ,A1   
move.b  #14,D0
trap    #15

rts

collect_crew:    

lea     found_crew_msg,A1   
move.b  #14,D0
trap    #15

rts
*Not fully implemented out of fuel mechanic yet
out_of_fuel:
rts

Solution

  • According to the Easy68k forums there is a trap to just wait a specified amount of time:

    move.l   #100,D1     ; delay in 1/100th of seconds
    moveq    #23,D0
    trap     #15
    

    You could just use this trap to wait for a bit after printing an event?