mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-18 21:06:31 +00:00
175 lines
2.8 KiB
ArmAsm
175 lines
2.8 KiB
ArmAsm
|
; That's not a moon....
|
||
|
|
||
|
; by Vince `deater` Weaver, dSr, Lovebyte 2021
|
||
|
|
||
|
; based on the following BASIC program
|
||
|
|
||
|
; 1HOME:POKE49167,0
|
||
|
; 2FORX=0TO64:POKE1024+RND(1)*999,174:NEXT
|
||
|
; 3FORI=0TO1:COLOR=6-I:FORJ=0TO1
|
||
|
; 4HLIN8,10AT6+J*10+I:HLIN7,11AT8+J*6+I:HLIN6,12AT10+J*2+I:NEXTJ,I
|
||
|
; 6VTAB6:HTAB11:?"()"
|
||
|
; 7FORX=13TO37:POKE1063+X,90:POKE1064+X,91:POKE1065+X,95
|
||
|
; 8FORI=1TO200:NEXT:VTAB9:HTABX:?" ":NEXT
|
||
|
; 9GOTO7
|
||
|
|
||
|
; 167 -- initial implementation
|
||
|
; 170 -- smooth grey support
|
||
|
; 152 -- make death star data byte array
|
||
|
; 148 -- make death star VTAB not hardcoded
|
||
|
; 144 -- move to zero page
|
||
|
; 136 -- index into ROM for "random" numbers
|
||
|
; 133 -- optimize star placement
|
||
|
; 131 -- note when X already 0
|
||
|
; 130 -- optimize tie erase
|
||
|
; 126 -- more optimize death star drawing
|
||
|
; 124 -- use the DEC CV the instruction before VTAB
|
||
|
|
||
|
; need 124 for lovebyte
|
||
|
|
||
|
; zero page
|
||
|
CV = $25
|
||
|
BASL = $28
|
||
|
BASH = $29
|
||
|
SEEDL = $4E
|
||
|
INL = $66
|
||
|
INH = $67
|
||
|
|
||
|
; soft-switches
|
||
|
MOUSETEXT = $C00F ; (write) to enable mouse text
|
||
|
|
||
|
; rom routines
|
||
|
HOME = $FC58 ; Clear the text screen
|
||
|
WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us
|
||
|
VTAB = $FC22 ; calc screen position in CV, put in (BASL)
|
||
|
VTABZ = $FC24 ; calc screen position in A, put in (BASL)
|
||
|
|
||
|
.zeropage
|
||
|
.globalzp grey_smc,ds_data,star_store_smc,tie_data
|
||
|
|
||
|
;=======================
|
||
|
; Clear screen and setup
|
||
|
;=======================
|
||
|
sw:
|
||
|
|
||
|
jsr HOME ; clear the screen
|
||
|
sta MOUSETEXT ; enable mouse text
|
||
|
|
||
|
;=======================
|
||
|
; Display Stars
|
||
|
;=======================
|
||
|
|
||
|
ldx #64
|
||
|
star_loop:
|
||
|
lda $F100,X
|
||
|
eor $F300,X ; fake random
|
||
|
tay
|
||
|
|
||
|
lda $F800,X
|
||
|
eor $F900,X ; more fake random
|
||
|
and #$3
|
||
|
ora #$4
|
||
|
sta star_store_smc+2
|
||
|
|
||
|
lda #'.'|$80
|
||
|
star_store_smc:
|
||
|
sta $400,Y
|
||
|
dex
|
||
|
bne star_loop
|
||
|
|
||
|
;=======================
|
||
|
; Display Death Star
|
||
|
;=======================
|
||
|
|
||
|
; ldx #0 ; X already 0
|
||
|
lda #9 ; count backwards
|
||
|
sta CV
|
||
|
ds_loop:
|
||
|
;============================
|
||
|
; draw grey line
|
||
|
;============================
|
||
|
grey_line:
|
||
|
jsr $FC20 ; this is a DEC CV line before VTAB
|
||
|
; jsr VTAB ; position VTAB based on CV
|
||
|
sec
|
||
|
lda #19
|
||
|
sbc ds_data,X
|
||
|
sta grey_smc+1
|
||
|
ldy ds_data,X
|
||
|
|
||
|
; inx
|
||
|
; lda ds_data,X
|
||
|
; sta grey_smc+1
|
||
|
inx
|
||
|
grey_loop:
|
||
|
clc
|
||
|
tya
|
||
|
and #$1
|
||
|
adc #$56 ; make it an even grey
|
||
|
sta (BASL),Y
|
||
|
iny
|
||
|
grey_smc:
|
||
|
cpy #0
|
||
|
bne grey_loop
|
||
|
; inc CV
|
||
|
cpx #6
|
||
|
bne ds_loop
|
||
|
|
||
|
; draw reflector
|
||
|
lda #'('+$80 ; 5,10?
|
||
|
sta $68A
|
||
|
lda #')'+$80 ; 5,11?
|
||
|
sta $68B
|
||
|
|
||
|
|
||
|
;=======================
|
||
|
; Draw Tie Fighter
|
||
|
;=======================
|
||
|
|
||
|
tie_loop:
|
||
|
ldy #12
|
||
|
|
||
|
tie_move:
|
||
|
|
||
|
; draw tie
|
||
|
|
||
|
ldx #2
|
||
|
xloop1:
|
||
|
lda tie_data,X
|
||
|
sta $428,Y ; line 8 (vtab 9)
|
||
|
iny
|
||
|
dex
|
||
|
bpl xloop1
|
||
|
|
||
|
; delay a bit
|
||
|
lda #200
|
||
|
jsr WAIT
|
||
|
|
||
|
; erase
|
||
|
|
||
|
lda #$A0 ; space (the final frontier)
|
||
|
xloop2:
|
||
|
dey
|
||
|
sta $428,Y ; line 8 (vtab 9)
|
||
|
inx
|
||
|
cpx #2
|
||
|
bne xloop2
|
||
|
|
||
|
iny
|
||
|
cpy #38
|
||
|
bne tie_move
|
||
|
|
||
|
beq tie_loop
|
||
|
|
||
|
tie_data:
|
||
|
.byte 95,91,90
|
||
|
|
||
|
|
||
|
ds_data:
|
||
|
.byte 8;,11
|
||
|
.byte 7;,12
|
||
|
.byte 6;,13
|
||
|
.byte 6;,13
|
||
|
.byte 7;,12
|
||
|
.byte 8;,11
|