dos33fsprogs/textmode/notamoon/notamoon_big.s

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