dos33fsprogs/graphics/gr/boxes/rr.s

310 lines
5.1 KiB
ArmAsm

; Never going to...
; by Vince `deater` Weaver <vince@deater.net> / dSr
; For LoveByte 2021
; 256 bytes -- at first
; LoveByte Rule is 252 bytes (there's a 4-byte DOS33 header)
; zero page
H2 = $2C
COLOR = $30
X0 = $F0
XX = $F1
FRAME = $F2
Y1 = $F3
; soft-switches
KEYPRESS = $C000
KEYRESET = $C010
FULLGR = $C052
; ROM routines
PLOT = $F800 ;; PLOT AT Y,A
PLOT1 = $F80E ;; PLOT at (GBASL),Y (need MASK to be $0f or $f0)
HLINE = $F819 ;; HLINE Y,$2C at A
SETCOL = $F864 ;; COLOR=A
SETGR = $FB40 ;; init lores and clear screen
WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us
;1DEFFNP(X)=PEEK(2054+I*5+X)-32:
;GR:POKE49234,0:
;FORI=0TO29:COLOR=FNP(0):FORY=FNP(3)TOFNP(4)
;:HLINFNP(1),FNP(2)ATY:NEXTY,I:GETA
;================================
; Clear screen and setup graphics
;================================
rr:
jsr SETGR ; set lo-res 40x40 mode
draw_box_loop:
; get color/Y0
jsr load_byte
tax ; Y0 is in X
tya ; check for end
bmi end
jsr load_byte ; Y1
sta Y1
jsr load_byte ; X0
sta X0
tya
lsr
lsr
sta COLOR
jsr load_byte ; X1
sta H2
tya
and #$C0
ora COLOR
lsr
lsr
lsr
lsr
jsr SETCOL
inner_loop:
;; HLINE Y,H2 at A
;; X left alone, carry set on exit
;; H2 left alone
;; Y and A trashed
ldy X0
txa
jsr HLINE
cpx Y1
inx
bcc inner_loop
bcs draw_box_loop
end:
music_outer_loop:
lda #0
play_music_loop:
tax
try_again:
lda music_sequence,X
bmi long_duration
ldy #$40
.byte $2C ; bit trick
long_duration:
ldy #$80
sty speaker_duration
and #$f
cmp #8
bcc all_good
and #$3
all_done:
beq all_done
lda #200
jsr WAIT
inx
jmp try_again
all_good:
tay
lda note_freqs,Y
sta speaker_frequency
inx
txa
; lda #0
;play_music_loop:
; tax
; lda music_sequence,X
; sta speaker_duration
; bpl play_music_continue
; cmp #$ff
; beq all_done
;play_music_continue:
; lda music_sequence+1,X
; sta speaker_frequency
; inx
; inx
; txa
; old
;NOTE_A3 = $98 ; 152
;NOTE_B3 = $87 ; 135
;NOTE_CSHARP4 = $79 ; 121
;NOTE_D4 = $72 ; 114
;NOTE_E4 = $66 ; 102
;NOTE_FSHARP4 = $5B ; 91
; new
;NOTE_A3 = 223
;NOTE_B3 = 199
;NOTE_CSHARP4 = 177
;NOTE_D4 = 167
;NOTE_E4 = 149
;NOTE_FSHARP4 = 132
NOTE_A3 = 0
NOTE_B3 = 1
NOTE_CSHARP4 = 2
NOTE_D4 = 3
NOTE_E4 = 4
NOTE_FSHARP4 = 5
; this is Paul Lutus's code from Apple II red book
; X,Y trashed
; duration also trashed
speaker_tone:
ldy #0
speaker_tone_loop:
bit $C030 ; click speaker
speaker_loop:
dey ; y never set?
bne slabel1 ; duration roughly 256*?
dec speaker_duration ; (Duration)
beq done_tone
slabel1:
dex
bne speaker_loop
ldx speaker_frequency ; (Frequency)
jmp speaker_tone_loop
done_tone:
beq play_music_loop
LONG = $80
SHORT = $00
END = $08
PAUSE = $09
music_sequence:
first:; 0000 111X
.byte SHORT|NOTE_A3, SHORT|NOTE_B3, SHORT|NOTE_D4, SHORT|NOTE_B3
.byte LONG|NOTE_FSHARP4, LONG|NOTE_FSHARP4, LONG|NOTE_E4, PAUSE
second:; 0000 1100 0X
.byte SHORT|NOTE_A3, SHORT|NOTE_B3, SHORT|NOTE_D4, SHORT|NOTE_B3
.byte LONG|NOTE_E4, LONG|NOTE_E4, SHORT|NOTE_D4, SHORT|NOTE_CSHARP4
.byte SHORT|NOTE_B3, PAUSE
third:; 00 0010 1001 1XXX
.byte SHORT|NOTE_A3, SHORT|NOTE_B3
.byte SHORT|NOTE_D4, SHORT|NOTE_B3, LONG|NOTE_D4, SHORT|NOTE_E4
.byte LONG|NOTE_CSHARP4, SHORT|NOTE_A3, SHORT|NOTE_A3, LONG|NOTE_E4
.byte LONG|NOTE_D4, PAUSE, END
;first:; 0000 111X
; .byte NOTE_A3, NOTE_B3, NOTE_D4, NOTE_B3
; .byte NOTE_FSHARP4, NOTE_FSHARP4, NOTE_E4, PAUSE
;second:; 0000 1100 0X
; .byte NOTE_A3, NOTE_B3, NOTE_D4, NOTE_B3
; .byte NOTE_E4, NOTE_E4, NOTE_D4, NOTE_CSHARP4
; .byte NOTE_B3, PAUSE
;third:; 00 0010 1001 1XXX
; .byte NOTE_A3, NOTE_B3
; .byte NOTE_D4, NOTE_B3, NOTE_D4, NOTE_E4
; .byte NOTE_CSHARP4, NOTE_A3, NOTE_A3, NOTE_E4
; .byte NOTE_D4, PAUSE, PAUSE, PAUSE
;music_duration:
; .byte $40,$40, $40,$40, $7f,$7f,$7f
; .byte $40,$40, $40,$40, $7f,$7f, $40,$40,$40
; .byte $40,$40, $40,$40, $7F, $40, $7F, $40,$40, $7F,$7F
; .byte $00
;music_frequency:
; .byte NOTE_A3,NOTE_B3,NOTE_D4,NOTE_B3, NOTE_FSHARP4,NOTE_FSHARP4,NOTE_E4
; .byte NOTE_A3,NOTE_B3,NOTE_D4,NOTE_B3, NOTE_E4,NOTE_E4,NOTE_D4,NOTE_CSHARP4,NOTE_B3
; .byte NOTE_A3,NOTE_B3,NOTE_D4,NOTE_B3, NOTE_D4,NOTE_E4,NOTE_CSHARP4,NOTE_A3,NOTE_A3,NOTE_E4,NOTE_D4
; .byte $00
;=========================
; load byte routine
;=========================
load_byte:
inc load_byte_smc+1 ; assume we are always < 256 bytes
; so no need to wrap
load_byte_smc:
lda box_data-1
tay
and #$3f
rts
; 4 6 6 6 6
box_data:
.byte $00,$27,$C0,$67
.byte $0F,$27,$D1,$D6
.byte $0F,$19,$0C,$51
.byte $0F,$1E,$15,$57
.byte $13,$19,$0B,$D0
.byte $1E,$27,$0D,$D6
.byte $16,$1E,$15,$D7
.byte $08,$0E,$D1,$13
.byte $03,$0C,$D2,$95
.byte $00,$02,$11,$95
.byte $01,$09,$10,$92
.byte $13,$27,$54,$54
.byte $0D,$12,$53,$55
.byte $07,$09,$D5,$96
.byte $1A,$21,$0A,$11
.byte $19,$1E,$D1,$94
; .byte $19,$23,$D7,$5A ; erase
; .byte $1E,$24,$16,$1A ; arm up
; .byte $20,$23,$DA,$9D ; arm up
; .byte $1E,$25,$D7,$63 ; erase
.byte $1E,$24,$17,$1A ; arm down
.byte $19,$1E,$D7,$99 ; arm down
.byte $FF
;note_freqs: .byte $98,$87,$79,$72,$66,$5B
note_freqs: .byte 223,199,177,167,149,132
speaker_frequency:
speaker_duration = speaker_frequency+1