Toolbox-2/source/boulder/bellatrix/Status.spin

220 lines
5.9 KiB
Plaintext
Raw Normal View History

' This cog handles the status line.
' Also keeps the real-time counter
con
STATUS_NONE, STATUS_PRE, STATUS_GAME, STATUS_PAUSE, STATUS_OUT_OF_TIME, STATUS_GAME_OVER
var
long status_addr
long stack[20]
long vsync_addr
long score
byte ticks_per_sec
byte tick_count
byte time
byte diamond_count
byte diamond_value
byte diamonds_needed
byte player
byte men
byte cave
byte level
byte status_mode
byte update
byte status_temp[20*2]
byte toggle
byte decbuf[6]
pub start(video_params)
vsync_addr := long[video_params + constant(6 * 4)]
status_addr := long[video_params + constant(5 * 4)] + constant(40 * 28 + 4 + 4)
time := 0
status_mode := STATUS_NONE
update := true
toggle := 0
if long[video_params + constant(4 * 4)] == 0
ticks_per_sec := 60 'NTSC
else
ticks_per_sec := 50 'PAL
cognew(process, @stack)
pub player_params(p, m, c, l, s)
player := p
men := m
cave := c
level := l
score := s
pub cave_params(dn, dv, t)
diamonds_needed := dn
diamond_value := dv
diamond_count := 0
time := t
tick_count := ticks_per_sec
pub set_time(t)
tick_count := ticks_per_sec
time := t
update := true
pub get_time
return time
pub set_mode(m)
status_mode := m
update := true
pub set_score(s)
score := s
update := true
pub set_diamond_value(dv)
diamond_value := dv
update := true
pub set_diamond_count(n)
diamond_count := n
update := true
pub process
repeat
'wait for vsync
repeat while byte[vsync_addr] == 0
repeat while byte[vsync_addr] <> 0
if update
update := false
if status_mode == STATUS_NONE
long[status_addr] &= !1
else
long[status_addr] |= 1
if toggle
longmove(status_addr, @status_temp, 10)
toggle := 0
if status_mode == STATUS_PRE
bytefill(status_addr + constant(4 + 20), $06, 20)
if cave > 16
text_out(status_addr + 4, @bonus_life, 20)
else
text_out(status_addr + 4, @pre, 20)
byte[status_addr + constant(4 + 8)] := player + $80
byte[status_addr + constant(4 + 11)] := men + $80
byte[status_addr + constant(4 + 17)] := cave + $90
byte[status_addr + constant(4 + 19)] := level + $81
elseif status_mode == STATUS_GAME
byte[status_addr + constant(4 + 0)] := $90
if diamond_count => diamonds_needed
byte[status_addr + constant(4 + 1)] := $AC
byte[status_addr + constant(4 + 2)] := $AC
byte[status_addr + constant(4 + 21)] := $06
byte[status_addr + constant(4 + 22)] := $06
else
convert_to_dec(diamonds_needed, 2)
byte[status_addr + constant(4 + 1)] := decbuf[1]
byte[status_addr + constant(4 + 2)] := decbuf[0]
byte[status_addr + constant(4 + 21)] := $9D
byte[status_addr + constant(4 + 22)] := $9D
byte[status_addr + constant(4 + 3)] := $AC
convert_to_dec(diamond_value, 2)
byte[status_addr + constant(4 + 4)] := decbuf[1]
byte[status_addr + constant(4 + 5)] := decbuf[0]
byte[status_addr + constant(4 + 6)] := $90
convert_to_dec(diamond_count, 2)
byte[status_addr + constant(4 + 7)] := decbuf[1]
byte[status_addr + constant(4 + 8)] := decbuf[0]
byte[status_addr + constant(4 + 9)] := $90
convert_to_dec(time, 3)
byte[status_addr + constant(4 + 10)] := decbuf[2]
byte[status_addr + constant(4 + 11)] := decbuf[1]
byte[status_addr + constant(4 + 12)] := decbuf[0]
byte[status_addr + constant(4 + 13)] := $90
convert_to_dec(score, 6)
byte[status_addr + constant(4 + 14)] := decbuf[5]
byte[status_addr + constant(4 + 15)] := decbuf[4]
byte[status_addr + constant(4 + 16)] := decbuf[3]
byte[status_addr + constant(4 + 17)] := decbuf[2]
byte[status_addr + constant(4 + 18)] := decbuf[1]
byte[status_addr + constant(4 + 19)] := decbuf[0]
byte[status_addr + constant(4 + 27)] := $9D
byte[status_addr + constant(4 + 28)] := $9D
elseif status_mode == STATUS_GAME_OVER
bytefill(status_addr + constant(4 + 20), $06, 20)
text_out(status_addr + 4, @game_over, 20)
if --tick_count == 0
tick_count := ticks_per_sec
if status_mode == STATUS_GAME
if time > 0
convert_to_dec(--time, 3)
byte[status_addr + constant(4 + 10)] := decbuf[2]
byte[status_addr + constant(4 + 11)] := decbuf[1]
byte[status_addr + constant(4 + 12)] := decbuf[0]
elseif status_mode == STATUS_PAUSE
if toggle
longmove(status_addr, @status_temp, 10)
toggle := 0
else
longmove(@status_temp, status_addr, 10)
bytefill(status_addr + constant(4 + 20), $06, 20)
text_out(status_addr + 4, @pause, 20)
toggle := 1
elseif status_mode == STATUS_OUT_OF_TIME
'out of time
if toggle
longmove(status_addr, @status_temp, 10)
toggle := 0
else
longmove(@status_temp, status_addr, 10)
bytefill(status_addr + constant(4 + 20), $06, 20)
text_out(status_addr + 4, @out_of_time, 20)
toggle := 1
pub convert_to_dec(val, len) | i
repeat i from 0 to len-1
decbuf[i] := val // 10 + $80
val /= 10
pub text_out(addr, str, len) | i, c
repeat i from 0 to len-1
c := byte[str + i]
if c == $20
byte[addr + i] := $90
elseif c == $2C
byte[addr + i] := $AF
elseif c == $2F
byte[addr + i] := $8C
else
byte[addr + i] := c + $50
dat
pre byte " PLAYER , MEN / "
out_of_time byte " OUT OF TIME "
pause byte " SPACEBAR TO RESUME "
bonus_life byte " B O N U S L I F E "
game_over byte " G A M E O V E R "