mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-04 20:06:09 +00:00
388 lines
7.4 KiB
ArmAsm
388 lines
7.4 KiB
ArmAsm
.include "zp.inc"
|
|
|
|
;===========
|
|
; CONSTANTS
|
|
;===========
|
|
|
|
NUMSTARS EQU 16
|
|
|
|
|
|
;=====================
|
|
; Starfield
|
|
;=====================
|
|
|
|
;================================
|
|
; Clear screen and setup graphics
|
|
;================================
|
|
|
|
jsr clear_screens_notext ; clear top/bottom of page 0/1
|
|
jsr set_gr_page0
|
|
bit FULLGR
|
|
|
|
; Initialize the 2kB of multiply lookup tables
|
|
jsr init_multiply_tables
|
|
|
|
|
|
;===============
|
|
; Init Variables
|
|
;===============
|
|
lda #0 ; 2
|
|
sta DRAW_PAGE ; 3
|
|
sta RANDOM_POINTER ; 3
|
|
sta STATE
|
|
|
|
; always multiply with low byte as zero
|
|
sta NUM2L ; 3
|
|
|
|
lda #5
|
|
sta SPEED
|
|
|
|
ldy #(NUMSTARS-1) ; 2
|
|
init_stars:
|
|
jsr random_star ; 6
|
|
dey ; 2
|
|
bpl init_stars ; 2nt/3
|
|
|
|
;===========================
|
|
;===========================
|
|
; Main Loop
|
|
;===========================
|
|
;===========================
|
|
|
|
starfield_loop:
|
|
|
|
;===============
|
|
; clear screen
|
|
;===============
|
|
|
|
lda STATE
|
|
|
|
cmp #5
|
|
bne quick_skip
|
|
|
|
lda #0
|
|
sta STATE
|
|
|
|
lda #5
|
|
sta SPEED
|
|
|
|
quick_skip:
|
|
|
|
cmp #3
|
|
beq no_clear
|
|
|
|
cmp #1
|
|
bne black_back
|
|
|
|
dec SPEED
|
|
lda SPEED
|
|
bne not_done
|
|
|
|
inc STATE
|
|
not_done:
|
|
lda #COLOR_BOTH_LIGHTBLUE
|
|
jmp back_color
|
|
|
|
black_back:
|
|
lda #0
|
|
back_color:
|
|
sta clear_all_color+1
|
|
|
|
jsr clear_all ; 6+
|
|
; 6047
|
|
;===============
|
|
; draw stars
|
|
;===============
|
|
no_clear:
|
|
|
|
; start at 15 and count down (rather than 0 and count up)
|
|
ldx #(NUMSTARS-1) ; 2
|
|
|
|
draw_stars:
|
|
stx XX ; 3
|
|
|
|
;================
|
|
; calculate color
|
|
;================
|
|
|
|
lda #$ff ; want if z<16, color = 5 ; 2
|
|
sta COLOR ; if 16<z<32 color = 13 ; 3
|
|
; if 32<z<64 color = 15
|
|
|
|
lda star_z,X ; 4
|
|
tay ; put star_z[i] in X for later ; 2
|
|
|
|
cmp #32 ; 2
|
|
bpl done_color ; 2nt/3
|
|
|
|
cmp #16 ; 15 -1 16 0 17 1 ; 2
|
|
bpl second_color ; 2nt/3
|
|
|
|
lda #$55 ; 2
|
|
sta COLOR ; 3
|
|
|
|
jmp done_color ; 3
|
|
second_color:
|
|
lda #$dd ; 2
|
|
sta COLOR ; 3
|
|
|
|
done_color:
|
|
|
|
|
|
; calculate x value, stars[i].x/stars[i].z
|
|
|
|
; put 1/stars[i].z in NUM1H:NUM1L and multiply
|
|
|
|
lda z_table,Y ; 4
|
|
sta NUM1L ; F ; 3
|
|
|
|
; adjust spacez for 58+
|
|
; all this logic to avoid having a 128 byte table of mostly zero
|
|
|
|
lda #0 ; I ; 2
|
|
clc ; 2
|
|
cpy #60 ; 59 -1 60 0 61 1 ; 2
|
|
bmi no_adjust ; 2nt/3
|
|
adc #1 ; 60, 61 = 1 ; 2
|
|
cpy #62 ; 61 -1 62 0 63 1 ; 2
|
|
bmi no_adjust ; 2nt/3
|
|
adc #1 ; 62 = 2 ; 2
|
|
cpy #63 ; 62 = -1 63 = 0 64 = not possible ; 2
|
|
bne no_adjust ; 2nt/3
|
|
adc #2 ; 63 = 4 ; 2
|
|
no_adjust:
|
|
sta NUM1H ; store int part of spacez ; 3
|
|
|
|
; load stars[i].x into NUM2H:NUM2L
|
|
; NUM2L is always zero
|
|
ldy XX ; 3
|
|
|
|
lda star_x,Y ; 4
|
|
sta NUM2H ; 3
|
|
|
|
|
|
sec ; don't reuse old values ; 2
|
|
jsr multiply ; 6+?
|
|
|
|
; integer result in X
|
|
txa ; 2
|
|
clc ; 2
|
|
adc #20 ; center on screen ; 2
|
|
|
|
sta XPOS ; save for later ; 3
|
|
|
|
; calculate y value, stars[i].y/stars[i].z
|
|
|
|
; 1/stars[i].z is still in NUM1H:NUM1L
|
|
|
|
ldy XX ; reload index ; 3
|
|
|
|
lda star_y,Y ; load integer part of star_ ; 4
|
|
sta NUM2H ; 3
|
|
clc ; reuse old values ; 2
|
|
jsr multiply ; 6+
|
|
|
|
; integer result in X
|
|
txa ; 2
|
|
clc ; 2
|
|
adc #20 ; center the value ; 2
|
|
|
|
tay ; Y is YPOS ; 2
|
|
sty YPOS ; put Y value in Y to plot ; 3
|
|
|
|
|
|
;============================
|
|
; Check Limits
|
|
;============================
|
|
|
|
; ldy YPOS
|
|
bmi new_star ; 2nt/3
|
|
cpy #48 ; 2
|
|
bpl new_star ; if < 0 or > 40 then done ; 2nt/3
|
|
|
|
lda XPOS ; 3
|
|
bmi new_star ; 2nt/3
|
|
cmp #40 ; 2
|
|
bpl new_star ; if < 0 or > 40 then done ; 2nt/3
|
|
|
|
; FIXME: sort out all of these jumps to be more efficient
|
|
bmi plot_star ; 2
|
|
|
|
new_star:
|
|
ldy XX ; 3
|
|
jsr random_star ; 6
|
|
|
|
jmp plot_star_continue ; 3
|
|
|
|
plot_star:
|
|
jsr plot ; 6
|
|
|
|
plot_star_continue:
|
|
|
|
;==============================
|
|
ldx XX ; 3
|
|
|
|
dex ; 2
|
|
bmi move_stars ; 2nt/3
|
|
bpl draw_stars ; 2nt/3
|
|
; jmp draw_stars
|
|
|
|
|
|
;=============================
|
|
; Move stars
|
|
move_stars:
|
|
ldy #(NUMSTARS-1) ; 2
|
|
move_stars_loop:
|
|
; increment z
|
|
clc ; if z >= 64 new star ; 2
|
|
lda star_z,Y ; 4
|
|
adc #1 ; 2
|
|
sta star_z,Y ; 4
|
|
and #64 ; 2
|
|
beq move_loop_skip ; 2nt/3
|
|
|
|
jsr random_star ; new random star ; 6
|
|
|
|
move_loop_skip:
|
|
dey ; 2
|
|
bpl move_stars_loop ; 2nt/3
|
|
|
|
|
|
|
|
|
|
skipskip:
|
|
|
|
|
|
lda #>ship_forward
|
|
sta INH
|
|
lda #<ship_forward
|
|
sta INL
|
|
|
|
lda #15
|
|
sta XPOS
|
|
lda #34
|
|
sta YPOS
|
|
jsr put_sprite
|
|
|
|
|
|
;==================
|
|
; flip pages
|
|
;==================
|
|
|
|
jsr page_flip ; 6
|
|
|
|
|
|
|
|
starfield_keyboard:
|
|
|
|
lda STATE ; if 0, wait
|
|
bne check_keyboard
|
|
|
|
first_press:
|
|
jsr get_key ; get keypress ; 6
|
|
lda LASTKEY
|
|
|
|
beq first_press
|
|
|
|
inc STATE
|
|
|
|
jmp done_keyboard
|
|
|
|
check_keyboard:
|
|
|
|
jsr get_key ; get keypress ; 6
|
|
lda LASTKEY
|
|
beq done_keyboard
|
|
|
|
bit SPEAKER
|
|
inc STATE
|
|
|
|
done_keyboard:
|
|
|
|
;==================
|
|
; loop forever
|
|
;==================
|
|
|
|
jmp starfield_loop ; 3
|
|
|
|
|
|
; matches scroll_row1 - row3
|
|
star_x EQU $8A00
|
|
star_y EQU $8B00
|
|
star_z EQU $8C00
|
|
|
|
;===================
|
|
; star number in Y
|
|
; FIXME: increment at end?
|
|
; X trashed
|
|
random_star:
|
|
; random x location
|
|
ldx RANDOM_POINTER ; 3
|
|
|
|
lda random_table,X ; 4
|
|
sta star_x,Y ; 5
|
|
inx ; 2
|
|
|
|
; random y location
|
|
lda random_table,X ; 4
|
|
sta star_y,Y ; 5
|
|
inx ; 2
|
|
|
|
; random z location
|
|
lda random_table,X ; 4
|
|
and #$3f ; 2
|
|
sta star_z,Y ; 5
|
|
inx ; 2
|
|
|
|
stx RANDOM_POINTER ; 3
|
|
|
|
rts ; 6
|
|
|
|
;===============================================
|
|
; External modules
|
|
;===============================================
|
|
|
|
.include "../asm_routines/pageflip.s"
|
|
.include "../asm_routines/gr_setpage.s"
|
|
.include "../asm_routines/keypress.s"
|
|
.include "../asm_routines/gr_putsprite.s"
|
|
.include "../asm_routines/gr_offsets.s"
|
|
.include "../asm_routines/gr_fast_clear.s"
|
|
.include "../asm_routines/gr_plot.s"
|
|
.include "../asm_routines/multiply_fast.s"
|
|
|
|
|
|
.include "sprites.inc"
|
|
|
|
;======================
|
|
; some "random" numbers
|
|
;======================
|
|
random_table:
|
|
.byte 103,198,105,115, 81,255, 74,236, 41,205,186,171,242,251,227, 70
|
|
.byte 124,194, 84,248, 27,232,231,141,118, 90, 46 ,99, 51,159,201,154
|
|
.byte 102, 50, 13,183, 49, 88,163, 90, 37, 93, 5, 23, 88,233, 94,212
|
|
.byte 171,178,205,198,155,180, 84, 17, 14,130,116, 65, 33, 61,220,135
|
|
.byte 112,233, 62,161, 65,225,252,103, 62, 1,126,151,234,220,107,150
|
|
.byte 143, 56, 92, 42,236,176, 59,251, 50,175, 60, 84,236, 24,219, 92
|
|
.byte 2, 26,254, 67,251,250,170, 58,251, 41,209,230, 5, 60,124,148
|
|
.byte 117,216,190, 97,137,249, 92,187,168,153, 15,149,177,235,241,179
|
|
.byte 5,239,247, 0,233,161, 58,229,202, 11,203,208, 72, 71,100,189
|
|
.byte 31, 35, 30,168, 28,123,100,197, 20,115, 90,197, 94, 75,121, 99
|
|
.byte 59,112,100, 36, 17,158, 9,220,170,212,172,242, 27, 16,175, 59
|
|
.byte 51,205,227, 80, 72, 71, 21, 92,187,111, 34, 25,186,155,125,245
|
|
.byte 11,225, 26, 28,127, 35,248, 41,248,164, 27, 19,181,202, 78,232
|
|
.byte 152, 50, 56,224,121, 77, 61, 52,188, 95, 78,119,250,203,108, 5
|
|
.byte 172,134, 33, 43,170, 26, 85,162,190,112,181,115, 59, 4, 92,211
|
|
.byte 54,148,179,175,226,240,228,158, 79, 50, 21, 73,253,130, 78,169
|
|
|
|
z_table:
|
|
; 1/16.0 - 1/12.25
|
|
.byte $10,$10,$10,$10,$11,$11,$11,$11,$12,$12,$12,$13,$13,$14,$14,$14
|
|
; 1/12.0 - 1/8.25
|
|
.byte $15,$15,$16,$16,$17,$17,$18,$18,$19,$1A,$1A,$1B,$1C,$1D,$1E,$1F
|
|
; 1/8.0 - 1/4.25
|
|
.byte $20,$21,$22,$23,$24,$25,$27,$28,$2A,$2C,$2E,$30,$33,$35,$38,$3C
|
|
; 1/4.0 - 1/0.25
|
|
.byte $40,$44,$49,$4E,$55,$5D,$66,$71,$80,$92,$AA,$CC,$00,$55,$00,$00
|
|
|