' This cog handles the status line.' Also keeps the real-time countercon STATUS_NONE, STATUS_PRE, STATUS_GAME, STATUS_PAUSE, STATUS_OUT_OF_TIME, STATUS_GAME_OVERvar 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_secpub set_time(t) tick_count := ticks_per_sec time := t update := truepub get_time return timepub set_mode(m) status_mode := m update := truepub set_score(s) score := s update := truepub set_diamond_value(dv) diamond_value := dv update := truepub set_diamond_count(n) diamond_count := n update := truepub 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 := 1pub 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 datpre 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 "