dsr_shape: update some routines used when debugging shapes

This commit is contained in:
Vince Weaver 2020-06-13 23:09:09 -04:00
parent f0a232f1a2
commit 3e7be76227
2 changed files with 20 additions and 282 deletions

View File

@ -21,6 +21,9 @@ int main(int argc, char **argv) {
int h,l;
int num_shapes=0,offset;
int a,b,c;
short offsets[256];
/* applesoft indexes from 1 not 0 */
int shape_num=1;
l=fgetc(stdin);
h=fgetc(stdin);
@ -39,10 +42,21 @@ int main(int argc, char **argv) {
for(i=0;i<num_shapes;i++) {
l=fgetc(stdin);
h=fgetc(stdin);
printf("SHAPE %d offset = %d\n",i,(h*256)+l);
printf("SHAPE %d offset = %d ($%02X%02X)\n",i,
(h*256)+l,h,l);
offsets[i]=(h*256)+l;
offset+=2;
}
/* skip to proper offset */
while(offset<offsets[0]) {
offset++;
ch=fgetc(stdin);
if (ch<0) return -1;
}
printf("Shape %d\n",shape_num);
while(1) {
ch=fgetc(stdin);
if (ch<0) break;
@ -51,9 +65,13 @@ int main(int argc, char **argv) {
b=(ch>>3)&0x7;
c=(ch>>6)&0x3;
printf("%d:\t%x ",offset,ch);
printf("$%X:\t%x ",offset,ch);
if ((c==0) && (b==0) && (a==0)) {
printf("END!\n");
shape_num++;
if (shape_num<num_shapes) {
printf("\nShape %d\n",shape_num);
}
} else{
printf("\tA: %s ",name[a]);
}

View File

@ -1,280 +0,0 @@
; 248 bytes
; zero page locations
HGR_SHAPE = $1A
SEEDL = $4E
FRAME = $A4
OUR_ROT = $A5
RND_EXP = $C9
HGR_PAGE = $E6
HGR_SCALE = $E7
HGR_ROTATION = $F9
SCALE = $FC
XPOS = $FD
XPOSH = $FE
YPOS = $FF
; soft switches
; Soft Switches
KEYPRESS = $C000
KEYRESET = $C010
SPEAKER = $C030
PAGE0 = $C054
PAGE1 = $C055
; ROM calls
RND = $EFAE
HGR2 = $F3D8
HCLR = $F3F2
HCLR_COLOR = $F3F4
HPOSN = $F411
XDRAW0 = $F65D
WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us
dsr_demo:
;=========================================
; SETUP
;=========================================
lda #$20 ; 2 ; set HGR page0
sta HGR_PAGE ; 2
sta XPOS ; 2 ; setup XPOS for future
lda #$ff ; 2
jsr HCLR_COLOR ; 3 ; clear HGR page0 to white
jsr HGR2 ; 3 ; set/clear HGR page1 to black
; Hi-res graphics, no text at bottom
; Y=0, A=$60 after this call
sty XPOSH ; 2
sty FRAME ; 2
sty OUR_ROT ; 2
iny ; 1 ; set shape table scale to 1
sty HGR_SCALE ; 2
;=========================
; draw crowd
;=========================
; XPOS already 32 from earlier
lda #180 ; 2
sta YPOS ; 2
crowd_loop:
jsr xdraw ; 3 ; xdraw on page1
lsr HGR_PAGE ; 2 ; switch to page0 ($40 -> $20)
jsr xdraw ; 3 ; xdraw on page 0
asl HGR_PAGE ; 2 ; switch back to page1 $20 -> $40
; clc ; carry should always be 0 from asl
lda XPOS ; 2
adc #16 ; 2
sta XPOS ; 2
cmp #240 ; 2
bcc crowd_loop ; 2
; get ready for DSR loop
ldx #<shape_dsr ; 2 ; point to dSr shape
stx shape_smc+1 ; 3 ; update self-modify code
;====================================
; 52 bytes to init/draw crowd
;=========================================
; OFFSCREEN RESET
;=========================================
reset_loop:
lda #10 ; 2 ; set initial x,y
sta XPOS ; 2
sta YPOS ; 2
inc HGR_SCALE ; 2 ; increment scale to 2
;=========================================
; MAIN LOOP
;=========================================
main_loop:
inc OUR_ROT ; 2
inc OUR_ROT ; 2
; increment FRAME
inc FRAME ; 2
lda FRAME ; 2
and #$1f ; 2
beq long_frame ; 2
jsr draw_beep ; 3
done_frame:
;========================
; move dSr
;========================
lda YPOS
adc #2
sta YPOS
lda XPOS
adc #5
sta XPOS
cmp #250
bcs reset_loop
bcc main_loop
;===========================
; long frame
;===========================
long_frame:
bit PAGE0 ; 3 ; switch to page0
lsr HGR_PAGE ; 2 ; switch draw target to page0
asl HGR_SCALE ; 2 ; make twice as big
ldy #235 ; 2 ; smc on tone
sty tone_smc+1 ; 3
jsr draw_beep ; 3 ; draw and beep
bit PAGE1 ; 3 ; display page back to page1
lsr HGR_SCALE ; 2 ; switch scale back
asl HGR_PAGE ; 2 ; switch draw page to page1
bpl done_frame ; 2 ; return (can make 2 if can guarantee)
; a flag value?
;=======================
; xdraw
;=======================
xdraw:
ldy XPOSH ; setup X and Y co-ords
ldx XPOS
lda YPOS
jsr HPOSN ; X= (y,x) Y=(a)
shape_smc:
ldx #<shape_person ; point to our shape
ldy #>shape_person
rot_smc:
lda OUR_ROT ; set rotation
jmp XDRAW0 ; XDRAW 1 AT X,Y
; Both A and X are 0 at exit
;==========================
; draw/beep/undraw
;==========================
draw_beep:
jsr xdraw ; draw
jsr beep ; make noise/delay
ldy #24
sty tone_smc+1
done_forever:
lda FRAME
beq done_forever
jmp xdraw ; draw
shape_person:
; Person, shoulders up
;.byte $01,$00,$04,$00,
.byte $2d,$25,$3c,$24
.byte $2c,$2c,$35,$37,$6f,$25,$16,$3f
.byte $77,$2d,$1e,$37,$2d,$2d,$15,$3f
.byte $3f,$3f,$3f,$3f,$07,$00
shape_arm:
;.byte $49,$49,$49,$24
;.byte $24,$24,$ac,$36,$36,$36,$00
shape_dsr:
.byte $2d,$36,$ff,$3f
.byte $24,$ad,$22,$24,$94,$21,$2c,$4d
.byte $91,$3f,$36,$00
;===========================
; BEEP
;===========================
beep:
lda FRAME
and #$1f
cmp #$1f
beq nobeep
and #$3
beq actual_beep
nobeep:
lda #100
jmp WAIT
actual_beep:
; BEEP
; repeat 30 times
lda #30 ; 2
tone1_loop:
ldy #21 ; 2
jsr delay_tone ; 3
ldy #24 ; 2
jsr delay_tone ; 3
tone_smc:
ldy #21 ; 2
jsr delay_tone ; 3
sec ; 1
sbc #1 ; 2
bne tone1_loop ; 2
rts ; 1
; Try X=6 Y=21 cycles=757
; Try X=6 Y=24 cycles=865
; Try X=7 Y=235 cycles=9636
delay_tone:
loopC: ldx #6 ; 2
loopD: dex ; 1
bne loopD ; 2
dey ; 1
bne loopC ; 2
bit SPEAKER ; 3 ; click speaker
rts ; 1