mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-29 00:31:52 +00:00
168 lines
2.6 KiB
ArmAsm
168 lines
2.6 KiB
ArmAsm
; death star?
|
|
|
|
; 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
|
|
|
|
; zero page
|
|
CV = $25
|
|
BASL = $28
|
|
BASH = $29
|
|
SEEDL = $4E
|
|
INL = $66
|
|
INH = $67
|
|
;LINE = $68
|
|
;MAXX = $69
|
|
|
|
; 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)
|
|
|
|
;=======================
|
|
; Clear screen and setup
|
|
;=======================
|
|
sw:
|
|
|
|
jsr HOME ; clear the screen
|
|
sta MOUSETEXT ; enable mouse text
|
|
|
|
;=======================
|
|
; Display Stars
|
|
;=======================
|
|
|
|
ldx #64
|
|
ldy #0
|
|
star_loop:
|
|
jsr random8
|
|
sta BASL
|
|
|
|
jsr random8
|
|
and #$3
|
|
clc
|
|
adc #$4
|
|
sta BASH
|
|
lda #'.'|$80
|
|
sta (BASL),Y
|
|
dex
|
|
bne star_loop
|
|
|
|
;=======================
|
|
; Display Death Star
|
|
;=======================
|
|
|
|
ldx #0
|
|
lda #3
|
|
sta CV
|
|
ds_loop:
|
|
;============================
|
|
; draw grey line
|
|
;============================
|
|
grey_line:
|
|
jsr VTAB ; position VTAB based on CV
|
|
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 #12
|
|
bne ds_loop
|
|
|
|
; draw reflector
|
|
lda #'('+$80 ; 5,10?
|
|
sta $68A
|
|
lda #')'+$80 ; 5,11?
|
|
sta $68B
|
|
|
|
|
|
;=======================
|
|
; Draw Tie Fighter
|
|
;=======================
|
|
|
|
tie_loop:
|
|
ldx #12
|
|
tie_move:
|
|
; draw
|
|
lda #90
|
|
sta $428,X ; line 8 (vtab 9)
|
|
lda #91
|
|
sta $429,X
|
|
lda #95
|
|
sta $42A,X
|
|
|
|
; delay a bit
|
|
lda #200
|
|
jsr WAIT
|
|
|
|
; erase
|
|
lda #' '|$80
|
|
sta $428,X
|
|
sta $429,X
|
|
sta $42A,X
|
|
|
|
inx
|
|
cpx #38
|
|
bne tie_move
|
|
|
|
jmp tie_loop
|
|
|
|
|
|
;=============================
|
|
; random8
|
|
;=============================
|
|
; 8-bit 6502 Random Number Generator
|
|
; Linear feedback shift register PRNG by White Flame
|
|
; http://codebase64.org/doku.php?id=base:small_fast_8-bit_prng
|
|
|
|
random8:
|
|
lda SEEDL ; 2
|
|
beq doEor ; 2
|
|
asl ; 1
|
|
beq noEor ; if the input was $80, skip the EOR ; 2
|
|
bcc noEor ; 2
|
|
doEor:
|
|
eor #$1d ; 2
|
|
noEor:
|
|
sta SEEDL
|
|
rts
|
|
|
|
|
|
|
|
|
|
ds_data:
|
|
.byte 8,11
|
|
.byte 7,12
|
|
.byte 6,13
|
|
.byte 6,13
|
|
.byte 7,12
|
|
.byte 8,11
|