;-only necessary for Screenblaster (BlowUp?) [because VsetMode()
; doesn't work when SB installed (except when in st compatible mode)].
;-gives problems in ST- and 4-color modes so just skip it in these modes.
; so don't try to return to the desktop when in 4-color
; with SB installed. (but who uses 4 colors anyway?)
move.w old_mode,d0
btst #7,d0 ;ST Mode?
bne no_setregs ;skip it
and.w #7,d0
cmp.w #1,d0 ;4 colors?
beq no_setregs
lea old_regs,a0
bsr set_regs
no_setregs:
move.w old_mode,-(sp)
move.w #$58,-(sp) ;VsetMode()
trap #14
addq.l #4,sp
move.l old_scrlen,d0
cmp.l #len_of_scr,d0
bgt cont_vid4
move.w #-1,-(sp)
move.l old_physscr,-(sp)
move.l old_logscr,-(sp)
move.w #5,-(sp) ;Setscreen()
trap #14
lea $c(sp),sp
cont_vid4:
bsr rest_palette
rts
key_click_off:
move.b $484,oldconterm
move.b #2,$484 ;conterm: repeat=on
rts
key_click_old:
move.b oldconterm,$484
rts
;ret d0:0=error
check_cookies:
move.l #'_CPU',d0
bsr get_cookie
tst.w d0
beq ret_check_c0
cmp.l #30,d1
blt ret_check_c0
move.l #'_SND',d0
bsr get_cookie
tst.w d0
beq ret_check_c0
and.l #$1c,d1
cmp.l #$1c,d1
blt ret_check_c0
move.w #-1,d0
rts
ret_check_c0: clr.w d0
rts
;d0:cookie
;ret d1:value
;ret d0:found (1) or not (0)
get_cookie:
move.l $5a0,a0
beq ret_getcookie0 ;no cookie jar installed
loop_getcookie:
cmp.l (a0)+,d0
bne wrong_cookie
move.l (a0),d1
move.w #1,d0
rts
wrong_cookie: addq.l #4,a0
tst.l -8(a0)
bne loop_getcookie
ret_getcookie0: clr.w d0
rts
;draw bar for spectrum analyzer
;d0=x, d1=h
draw_bar:
move.l scr,a0
adda.l #272*b_line,a0
lsl.w #3,d0
adda.w d0,a0
moveq #$00000000,d4
move.l #$00003ffc,d5
move.l #$3ffc3ffc,d6
move.l #$3ffc0000,d7
move.l d5,(a0)
move.l d4,4(a0)
sub.w #b_line,a0
subq.w #1,d1
bge cont_db
rts
cont_db:
loop_db: move.l d6,(a0)
move.l d7,4(a0)
move.l d5,-b_line(a0)
move.l d4,4-b_line(a0)
sub.w #b_line*2,a0
dbra d1,loop_db
rts
;not documented!
get_speaker:
move.w #14,-(sp)
move.l #$1c0000,-(sp)
trap #14
addq.l #6,sp
clr.w speaker
btst #6,d0
bne ret_gs
move.w #1,speaker
ret_gs: rts
;not documented!
set_speaker:
move.w speaker,d6
lsl.w #6,d6
bchg #6,d6
move.w #14,-(sp)
move.l #$1c0000,-(sp)
trap #14
addq.l #6,sp
bclr #6,d0
or.w d6,d0
move.w #$8e,-(sp)
move.w d0,-(sp)
move.w #$1c,-(sp)
trap #14
addq.l #6,sp
rts
;d0=x/16, d1=y, d2=num
put_icon:
move.l scr,a1
mulu.w #b_line,d1
adda.l d1,a1
lsl.w #3,d0
adda.w d0,a1
move.l icons,a2
lsl.w #1,d2
lsl.w #8,d2
adda.w d2,a2
move.w #31,d0
loop_pi: move.l (a2)+,(a1)+
move.l (a2)+,(a1)+
move.l (a2)+,(a1)+
move.l (a2)+,(a1)+
adda.w #b_line-16,a1
dbra d0,loop_pi
rts
;draw scope
;don't try too hard understanding this routine!
;(it's optimized 'a little' and doesn't have a lot of comments added)
;d0=start x, a0=buf
put_scope:
move.l scr,a2
move.w d0,d1
and.b #$f0,d1
lsr.w #1,d1
add.w d1,a2
move.w d0,d1
and.w #$f,d1
neg.w d1
add.w #15,d1
moveq #0,d4
bset d1,d4
move.w #253,d1
move.b (a0),d7 ;first data point
ext.w d7
neg.w d7
add.w #394,d7
loop_ps:
addq.w #3,a0
move.b (a0),d2 ;get next data point
ext.w d2
neg.w d2
add.w #394,d2
move.w #-b_line,d6
move.w d7,d3
sub.w d2,d7
bpl cont_ps
neg.w d6
neg.w d7
cont_ps: move.l a2,a1
ext.l d3
lsl.l #6,d3 ;
add.l d3,a1 ;* 320 (=b_line)
lsl.l #2,d3 ;
add.l d3,a1
move.w d4,d5 ;with one bit set
not.w d5
move.w d7,d0
beq cont_ps4
subq.w #1,d7
move.w d7,d0
cont_ps4:
lsr.w #1,d7
sub.w d7,d0
loop_ps2:
and.w d5,(a1)
;and.w d5,2(a1) ;these bitplanes don't change
or.w d4,4(a1)
;and.w d5,6(a1) ;
adda.w d6,a1
dbra d0,loop_ps2
ror.w d4
bpl cont_ps2
addq.w #8,a2
addq.w #8,a1
cont_ps2:
move.w d7,d0
beq cont_ps3
ror.w d5
loop_ps3:
and.w d5,(a1)
;and.w d5,2(a1)
or.w d4,4(a1)
;and.w d5,6(a1)
adda.w d6,a1
dbra d0,loop_ps3
cont_ps3:
move.w d2,d7
dbra d1,loop_ps
move.b 3(a0),d2 ;get last data point
ext.w d2
neg.w d2
add.w #394,d2
move.w #-b_line,d6
move.w d7,d3
sub.w d2,d7
bpl cont_ps5
neg.w d6
neg.w d7
cont_ps5: move.l a2,a1
ext.l d3
lsl.l #6,d3 ;
add.l d3,a1 ;* 320 (=b_line)
lsl.l #2,d3 ;
add.l d3,a1
move.w d4,d5 ;with one bit set
not.w d5
move.w d7,d0
beq cont_ps6
subq.w #1,d7
move.w d7,d0
cont_ps6:
lsr.w #1,d7
sub.w d7,d0
loop_ps4:
and.w d5,(a1)
;and.w d5,2(a1) ;these bitplanes don't change
or.w d4,4(a1)
;and.w d5,6(a1) ;
adda.w d6,a1
dbra d0,loop_ps4
rts
;d0=x, d1=angle
put_vu:
lea vu_x,a0
ext.w d1
move.w (a0,d1*2),d2 ;x
move.w d2,d5 ;dx
add.w d0,d2
lea vu_y,a0
move.w (a0,d1*2),d3 ;y
move.w d3,d4 ;dy
add.w #96,d3
ext.l d5
lsl.l #8,d5 ;dx*256
divs d4,d5 ;dx*256/dy
ext.l d5
ext.l d2
lsl.l #8,d2 ;x*256
move.l scr,a0
move.w d3,d0
mulu.w #b_line,d0
add.l d0,a0 ;addr of 1st line
loop_pvu:
cmp.w #89-2,d3 ;shadow still in range?
bge cont_pvu ;no
move.l a0,a1
move.l d2,d0
sub.l #256*2,d0
lsr.l #8,d0
move.w d0,d1
lsr.w #4,d0
lsl.w #3,d0
add.w d0,a1
and.w #$f,d1
moveq #0,d7
neg.w d1
add.w #15,d1
bset d1,d7
move.w d7,d6
not.w d6
move.w (b_line*2,a1),d0
or.w (b_line*2+2,a1),d0
or.w (b_line*2+4,a1),d0
or.w (b_line*2+6,a1),d0
and.w d7,d0
bne cont_pvu ;not on white background
and.w d6,(b_line*2,a1)
or.w d7,(b_line*2+2,a1)
or.w d7,(b_line*2+4,a1)
or.w d7,(b_line*2+6,a1)
cont_pvu:
move.l a0,a1
move.l d2,d0
lsr.l #8,d0
move.w d0,d1
lsr.w #4,d0
lsl.w #3,d0
add.w d0,a1
and.w #$f,d1
moveq #0,d7
neg.w d1
add.w #15,d1
bset d1,d7
or.w d7,(a1)
or.w d7,2(a1)
or.w d7,4(a1)
or.w d7,6(a1)
add.w #b_line,a0
add.l d5,d2
addq.w #1,d3
cmp.w #89,d3
bne loop_pvu
rts
install_sound: move.w #128,-(SP)
trap #14 ;locksnd()
addq.l #2,SP
tst.w D0
bmi snd_locked
move.w #104,-(SP)
trap #14 ;Dsp_Lock()
addq.l #2,SP
tst.w D0
bmi dsp_locked
move.w #113,-(sp)
trap #14 ;Dsp_RequestUniqueAbility()
addq.l #2,sp
move.w d0,ability
pea ymem
pea xmem
move.w #106,-(sp)
trap #14 ;Dsp_Available()
lea $A(sp),sp
move.l xmem,d0
cmp.l #x,d0
bmi Flush
move.l ymem,d0
cmp.l #y,d0
bpl NoFlush
Flush: move.w #115,-(sp)
trap #14 ;Dsp_FlushSubroutines()
addq.l #2,sp
NoFlush:
move.l ymem,-(sp)
move.l xmem,-(sp)
move.w #107,-(sp)
trap #14 ;Dsp_Reserve()
lea $A(sp),sp
tst.w d0
bne OutOfDSPMem
move.l #end_of_dspbin,d0
sub.l #dsp_bin,d0
divu #3,d0 ;length in dsp-words
move.w ability,-(sp)
move.l d0,-(sp)
pea dsp_bin
move.w #$6d,-(sp)
trap #14 ;Dsp_ExecProg()
lea 12(sp),sp
clr.w D4
clr.w D5
lea old_sndstate,A4
save_snd: move.w #-1,-(SP)
move.w D4,-(SP)
move.w #130,-(SP) ;soundcmd()
trap #14
addq.l #6,SP
move.w D0,(A4,D5)
addq.w #2,D5
addq.w #1,D4
cmp.w #7,D4
bne save_snd
bsr get_speaker
move.w speaker,old_speaker
clr.w speaker
bsr set_speaker
; move.w #1,-(SP)
; move.w #140,-(SP) ;sndstatus(1)
; trap #14
; addq.l #4,SP ;gives problems sometimes, so just leave it out
move.w (A4),-(SP)
clr.w -(SP)
move.w #130,-(SP) ;old left output level
trap #14 ;soundcmd()
addq.l #6,SP
move.w 2(A4),-(SP)
move.w #1,-(SP)
move.w #130,-(SP) ;old right output level
trap #14 ;soundcmd()
addq.l #6,SP
move.w 4(a4),d0
lsr.w #4,d0
move.w d0,lgain
move.w 4(A4),-(SP)
move.w #2,-(SP)
move.w #130,-(SP) ;old left input level
trap #14 ;soundcmd()
addq.l #6,SP
move.w 6(a4),d0
lsr.w #4,d0
move.w d0,rgain
move.w 6(A4),-(SP)
move.w #3,-(SP)
move.w #130,-(SP) ;old right input level
trap #14 ;soundcmd()
addq.l #6,SP
move.w #1,-(SP)
move.w #4,-(SP)
move.w #130,-(SP) ;adder input from ADC
trap #14 ;soundcmd()
addq.l #6,SP
move.w #0,-(SP)
move.w #5,-(SP)
move.w #130,-(SP) ;ADC input microphone
trap #14 ;soundcmd()
addq.l #6,SP
move.w #1,-(sp)
move.w #1,-(sp)
move.w #137,-(sp) ;dsptristate(1,1);
trap #14
addq.l #6,sp
move.w #1,-(SP)
move.w #132,-(SP)
trap #14 ;setmode(1);
addq.l #4,SP
move.w #1,-(SP)
move.w #2,-(SP)
move.w #0,-(SP)
move.w #0,-(SP)
move.w #0,-(SP)
move.w #139,-(SP)
trap #14 ;devconnect(DMAPLAY, 0, CLK_25M, 2, 1)
lea $C(SP),SP ;32780 Hz. My 'Atari Developers Documentation' says 33880 Hz,
;but I think that this is an error. (25175000 Hz/256/(2+1)=32780 Hz)
move.w #1,-(SP)
move.w #2,-(SP)
move.w #0,-(SP)
move.w #0,-(SP)
move.w #1,-(SP)
move.w #139,-(SP)
trap #14 ;devconnect(DSPXMIT, 0, CLK_25M, 2, 1)
lea $C(SP),SP
move.w #1,-(SP)
move.w #2,-(SP)
move.w #0,-(SP)
move.w #0,-(SP)
move.w #2,-(SP)
move.w #139,-(SP)
trap #14 ;devconnect(EXTINP, 0, CLK_25M, 2, 1)
lea $C(SP),SP
move.w #1,-(SP)
move.w #2,-(SP)
move.w #0,-(SP)
move.w #2,-(SP)
move.w #3,-(SP)
move.w #139,-(SP)
trap #14 ;devconnect(ADC, DSPRECV, CLK_25M, 2, 1)
lea $C(SP),SP
clr.w -(SP)
move.w #136,-(SP)
trap #14 ;buffoper(0);
addq.l #4,SP
rts
restore_sound:
move.w old_speaker,speaker
bsr set_speaker
;move.w #1,-(SP)
;move.w #140,-(SP) ;sndstatus(1)
;trap #14
;addq.l #4,SP
move.w #0,-(sp)
move.w #0,-(sp)
move.w #137,-(sp) ;dsptristate(0,0);
trap #14
addq.l #6,sp
clr.w D4
clr.w D5
move.l #old_sndstate,A4
get_snd: move.w (A4,D5),-(SP)
move.w D4,-(SP)
move.w #130,-(SP) ;soundcmd()
trap #14
addq.l #6,SP
addq.w #2,D5
addq.w #1,D4
cmp.w #7,D4
bne get_snd
move.w #105,-(SP)
trap #14 ;Dsp_Unlock()
addq.l #2,SP
move.w #129,-(SP)
trap #14 ;unlocksnd()
addq.l #2,SP
rts
dsp_locked:
move.w #129,-(SP)
trap #14 ;unlocksnd()
addq.l #2,SP
lea dsp_locked_txt,a0
bra error
snd_locked:
lea snd_locked_txt,a0
bra error
outofmem:
lea outofmem_txt,a0
bra error
OutOfDSPMem: move.w #105,-(SP)
trap #14 ;Dsp_Unlock()
addq.l #2,SP
move.w #129,-(SP)
trap #14 ;unlocksnd()
addq.l #2,SP
lea outofmem_txt2,a0
bra error
wrong_machine:
lea wrong_mach_txt,a0
bra error
wrong_scr:
lea wrong_scr_txt,a0
bra error
better_buy_vga:
move.w #0,d0
bsr graf_mouse
lea better_vga_txt,a0
move.w #1,d0
bsr form_alert
rts
exit:
bsr appl_exit
; Kbshift(-1)
move.w #-1,-(sp)
move.w #11,-(sp)
trap #13
addq.l #4,sp
move.w old_capslock,d1
lsl.w #4,d1
bclr #4,d0
or.w d1,d0
; Kbshift()
move.w d0,-(sp)
move.w #11,-(sp)
trap #13
addq.l #4,sp
; Pterm0()
clr.w -(SP)
trap #1
;alert string in a0
error:
move.l a0,a6
move.w #0,d0 ;arrow
bsr graf_mouse
move.l a6,a0
move.w #1,d0
bsr form_alert
bra exit
appl_init: lea contrl,a0
move.w #10,(a0)
move.w #0,2(a0)
move.w #1,4(a0)
move.w #0,6(a0)
move.w #0,8(a0)
move.l #aespb,d1
move.w #200,d0 ;aes
trap #2 ;gem
move.w int_out,d0
rts
appl_exit: lea contrl,a0
move.w #19,(a0)
move.w #0,2(a0)
move.w #1,4(a0)
move.w #0,6(a0)
move.w #0,8(a0)
move.l #aespb,d1
move.w #200,d0
trap #2
move.w int_out,d0
rts
;string in a0
;def_but in d0
form_alert: lea contrl,a1
move.w #52,(a1)
move.w #1,2(a1)
move.w #1,4(a1)
move.w #1,6(a1)
move.w #0,8(a1)
move.l a0,addr_in
move.w d0,int_in
move.l #aespb,d1
move.w #200,d0
trap #2
move.w int_out,d0
rts
;mnumber in d0
graf_mouse: lea contrl,a0
move.w #78,(a0)
move.w #1,2(a0)
move.w #1,4(a0)
move.w #1,6(a0)
move.w #0,8(a0)
move.w d0,int_in
move.l #0,addr_in
move.l #aespb,d1
move.w #200,d0
trap #2
move.w int_out,d0
rts
decode_imgs:
lea mainscrdat,a0
move.l scr2,dest
bsr dec_img
lea iconsdat,a0
move.l icons,dest
bsr dec_img
lea mousedat,a0
move.l mousedata,dest
bsr dec_img
lea helpdat,a0
move.l helpdiag,dest
bsr dec_img
rts
dec_img:
move.w 6(a0),patt_len
moveq #0,d0
move.w 12(a0),d0
lsr.l #3,d0 ;bytes per line per plane
move.l d0,bperlineplane
lsl.l #2,d0 ;*planes
move.l d0,bytesperline
move.w 14(a0),lines
move.w 2(a0),d0 ;header length in words
add.w d0,d0 ;header length in bytes
add.w d0,a0
move.w #0,repeat
move.w lines,d7
subq.w #1,d7
loop_y:
move.w repeat,d0
bne do_repeat
bsr plane
add.l #2,dest
bsr plane
add.l #2,dest
bsr plane
add.l #2,dest
bsr plane
move.l bytesperline,d0
subq.l #6,d0
add.l d0,dest
bra no_repeat
do_repeat:
subq.w #1,d0
move.w d0,repeat
move.l dest,a2
move.l a2,a3
sub.l bytesperline,a3
move.l bytesperline,d0
lsr.l #1,d0
subq.w #1,d0
loop_rep:
move.w (a3)+,(a2)+
dbra d0,loop_rep
move.l bytesperline,d0
add.l d0,dest
no_repeat:
dbra d7,loop_y
rts
plane:
lea linebuf,a1
bsr read_line
move.l dest,a2
lea linebuf,a1
move.w #39,d0
loop_x: move.w (a1)+,(a2)
addq.l #8,a2
dbra d0,loop_x
rts
read_line:
move.b (a0)+,d0
bne no_null
move.b (a0)+,d0
bne pattern
;replication
move.b (a0)+,d0
moveq #0,d0
move.b (a0)+,d0
subq.w #1,d0
move.w d0,repeat
move.l a1,d0
bra read_line
no_null:
cmp.b #$80,d0
bne solid_run
;bit_string
moveq #0,d0
move.b (a0)+,d0
subq.w #1,d0
loop_bs:
move.b (a0)+,(a1)+
dbra d0,loop_bs
bra end_rout
solid_run:
move.b d0,d1
and.b #$80,d1
sne d1
and.w #$7f,d0
subq.w #1,d0
loop_sr:
move.b d1,(a1)+
dbra d0,loop_sr
bra end_rout
pattern:
move.w patt_len,d1
subq.w #1,d1
and.w #$ff,d0
subq.w #1,d0
loop_p1:
move.l a0,a2
move.w d1,d2
loop_p2:
move.b (a2)+,(a1)+
dbra d2,loop_p2
dbra d0,loop_p1
addq.w #1,d1
add.w d1,a0
end_rout:
move.l a1,d0
sub.l #linebuf,d0
cmp.l bperlineplane,d0
blt read_line
rts
init_mouse:
move.w #320,mouse_x
move.w #240,mouse_y
clr.w mbut
move.w #-1,old_mouse_x ;no restore 1st time
clr.w new_scr ;no set screen
clr.w curr_mouse ;full mouse
move.l $ffff9800+11*4,link_col ;color for link buttons
lea mousemask,a0
move.l mousedata,a2
move.w #16*16-1,d0
loop_make_mask:
move.w (a2)+,d1
or.w (a2)+,d1
or.w (a2)+,d1
or.w (a2)+,d1
move.w d1,(a0)+
dbra d0,loop_make_mask
move.w #$22,-(sp) ;Kbdvbase()
trap #14
addq.l #2,sp
move.l d0,a0
move.l 16(a0),old_mousevec
wait_drvstat:
tst.w 36(a0)
bne wait_drvstat
move.l #mousevec,16(a0)
move.l $70,old_vbl_int
move.l #vbl_interrupt,$70
rts
exit_mouse:
move.l old_vbl_int,$70
move.w #$22,-(sp) ;Kbdvbase()
trap #14
addq.l #2,sp
move.l d0,a0
wait_drvstat2:
tst.w 36(a0)
bne wait_drvstat2
move.l old_mousevec,16(a0)
rts
draw_mouse:
move.w mouse_x,d6
move.w mouse_y,d5
move.w d5,old_mouse_y
move.w d6,old_mouse_x
move.l mousedata,a1
move.w curr_mouse,d0
lsr.w #1,d0
lsl.w #7,d0 ;*16*(16/8*2)
add.w d0,a1
move.l a1,a2
move.l scr2,a0
move.l a0,old_mouse_scr
move.w d5,d0 ;my
move.w d0,d2
mulu.w #b_line,d0
add.l d0,a0
move.w d6,d4 ;mx
move.w d4,d0
lsr.w #4,d4 ;in words
lsl.w #3,d4 ;*planes *2
add.w d4,a0
move.w d0,d1
and.b #$f0,d1
sub.w d1,d0
move.w #15,d3
add.w #16-480,d2
bmi cont_m1
sub.w d2,d3
cont_m1:
lea mousemask,a2
move.w curr_mouse,d7
lsr.w #1,d7
lsl.w #5,d7
add.w d7,a2
lea mousesaved,a3
tst.w d0
beq loop_putm_noshift
cmp.w #b_line-8,d4
bge last_word1
loop_putm:
REPT 4
move.w 8(a0),d7
swap d7
move.w (a0)+,d7
rol.l d0,d7
move.w d7,(a3)+
ENDM
sub.w #8,a0
moveq #0,d7
move.w (a2)+,d7
ror.l d0,d7
not.l d7
and.w d7,(a0)
and.w d7,2(a0)
and.w d7,4(a0)
and.w d7,6(a0)
swap d7
and.w d7,8(a0)
and.w d7,10(a0)
and.w d7,12(a0)
and.w d7,14(a0)
REPT 4
moveq #0,d7
move.w (a1)+,d7
ror.l d0,d7
or.w d7,(a0)+
swap d7
or.w d7,6(a0)
ENDM
add.w #b_line-8,a0
dbra d3,loop_putm
bra end_putm
last_word1:
loop_putm2:
REPT 4
moveq #0,d7
move.w (a0)+,d7
rol.l d0,d7
move.w d7,(a3)+
ENDM
sub.w #8,a0
moveq #0,d7
move.w (a2)+,d7
ror.l d0,d7
not.l d7
and.w d7,(a0)
and.w d7,2(a0)
and.w d7,4(a0)
and.w d7,6(a0)
REPT 4
moveq #0,d7
move.w (a1)+,d7
ror.l d0,d7
or.w d7,(a0)+
ENDM
add.w #b_line-8,a0
dbra d3,loop_putm2
bra end_putm
loop_putm_noshift:
move.l (a0),(a3)+
move.l 4(a0),(a3)+
move.w (a2)+,d7
not.w d7
and.w d7,(a0)
and.w d7,2(a0)
and.w d7,4(a0)
and.w d7,6(a0)
move.l (a1)+,d7
or.l d7,(a0)+
move.l (a1)+,d7
or.l d7,(a0)+
add.w #b_line-8,a0
dbra d3,loop_putm_noshift
end_putm:
rts
remove_mouse:
move.w old_mouse_x,d6
move.w old_mouse_y,d5
cmp.w #-1,d6
beq end_remm
move.l old_mouse_scr,a0
move.w d5,d0 ;omy
move.w d0,d2
mulu.w #b_line,d0
add.l d0,a0
move.w d6,d4 ;omx
move.w d4,d0
lsr.w #4,d4
lsl.w #2,d4 ;*planes
add.w d4,d4 ;in bytes
add.w d4,a0
move.w d0,d1
and.w #$fff0,d1
sub.w d1,d0
move.w #15,d3
add.w #16-480,d2
bmi cont_rm1
sub.w d2,d3
cont_rm1:
lea mousesaved,a1
tst.w d0
beq loop_remm_noshift
move.l #$ffff0000,d7 ;mask
ror.l d0,d7
loop_remm:
and.w d7,(a0)
and.w d7,2(a0)
and.w d7,4(a0)
and.w d7,6(a0)
cmp.w #b_line-8,d4
bge cont_rm3
swap d7
and.w d7,8(a0)
and.w d7,10(a0)
and.w d7,12(a0)
and.w d7,14(a0)
swap d7
cont_rm3:
move.w #3,d6
loop_remm2:
moveq #0,d5
move.w (a1)+,d5
ror.l d0,d5
or.w d5,(a0)+
cmp.w #b_line-8,d4
bge cont_rm2
swap d5
or.w d5,6(a0)
cont_rm2:
dbra d6,loop_remm2
add.w #b_line-8,a0
dbra d3,loop_remm
bra end_remm
loop_remm_noshift:
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
add.w #b_line-8,a0
dbra d3,loop_remm_noshift
end_remm:
rts
dc.l 'XBRA'
dc.l 'MOUS'
old_mousevec: ds.l 1
mousevec:
move.w d0,-(sp)
move.b 1(a0),d0
ext.w d0
add.w mouse_x,d0
bge cont_mv1
clr.w d0
cont_mv1: cmp.w #639,d0
ble cont_mv2
move.w #639,d0
cont_mv2: move.w d0,mouse_x
move.b 2(a0),d0
ext.w d0
add.w mouse_y,d0
bge cont_mv3
clr.w d0
cont_mv3: cmp.w #479,d0
ble cont_mv4
move.w #479,d0
cont_mv4: move.w d0,mouse_y
move.b (a0),d0
and.w #3,d0
move.w d0,mbut
move.w (sp)+,d0
rts
dc.l 'XBRA'
dc.l 'MOUS'
old_vbl_int: ds.l 1
vbl_interrupt:
movem.l d0-d7/a0-a3,-(sp)
move.l link_col,$ffff9800+13*4
move.w mouse_x,d6
move.w mouse_y,d5
tst.w mbut ;mousebutton pressed?
bne m_not_same ;don't fade out
cmp.w old_mouse_x,d6 ;
bne m_not_same ;
cmp.w old_mouse_y,d5 ;mouse moved?
bne m_not_same ;don't fade out
add.w #1,mouse_count
move.w mouse_count,d0
cmp.w #100,d0 ;100 vbl's
ble m_same
move.w curr_mouse,d0
cmp.w #30,d0
beq m_same
add.w #1,curr_mouse ;fade out
bra m_same
m_not_same:
clr.w mouse_count ;wait for 100 vbl's again
clr.w curr_mouse ;full pointer again
m_same:
bsr remove_mouse
tst.w new_scr
beq no_new_scr
move.l scr1,A0
move.l scr2,scr1
move.l A0,scr2 ;swap pointers
move.l scr1,scr
move.l scr2,d0
swap d0
move.b d0,$ffff8201
rol.l #8,d0
move.b d0,$ffff8203
rol.l #8,d0
move.b d0,$ffff820d
clr.l new_scr ;not again
no_new_scr:
bsr draw_mouse
movem.l (sp)+,d0-d7/a0-a3
add.l #1,_frclock ;don't forget this!
rte
;d0=x,d1=y,a6=scr
MACRO draw_point
ext.l d1
lsl.l #6,d1 ;
move.l d1,d2 ;* b_line
lsl.l #2,d1 ;
add.l d1,d2 ;
move.w d0,d1
and.w #$f,d1
and.b #$f0,d0
lsr.w #1,d0
ext.l d0
add.l d0,d2
moveq #0,d0
neg.w d1
add.w #15,d1
bset d1,d0
;move.w d0,d1
;not.w d1
;color 10 : green
;and.w d1,(a6,d2.l) ;these bitplanes don't change
or.w d0,2(a6,d2.l)
;and.w d1,4(a6,d2.l)
or.w d0,6(a6,d2.l)
ENDM
;Draw line using Bresenham line plot algorithm:
;
; ..
; ..
; e:=2*deltay-deltax;
; for i:=0 to deltax do begin
; Plot(x,y);
; if e>0 then begin
; y:=y+1;
; e:=e+2*deltay-2*deltax;
; end
; else
; e:=e+2*deltay;
; x:=x+1;
; end;
; ..
; ..
;
;d0=x1,d1=y1,d2=x2,d3=y2
;a6=screen address (used in macro draw_point)
draw_line:
cmp.w d2,d0 ;x2,x1
ble cont_dl1 ;x2>=x1
move.w d2,d7 ;x2
move.w d0,d2
move.w d7,d0
move.w d3,d7 ;y2
move.w d1,d3
move.w d7,d1
cont_dl1:
move.w d2,d6 ;x2
sub.w d0,d6 ;x2-x1=deltax
move.w d3,d7 ;y2
sub.w d1,d7 ;y2-y1=deltay
cmp.w d3,d1 ;y2,y1
ble cont_dl2 ;y2>=y1
neg.w d7 ;deltay=-deltay
cmp.w d7,d6 ;deltay,deltax
bge cont_dl3 ;deltay<=deltax
move.w d0,a0 ;x1
move.w d1,a1 ;y1
move.w d6,d3 ;e=deltax
add.w d3,d3 ;*2
sub.w d7,d3 ;-deltay
move.w d7,d4 ;deltay
add.w d6,d6 ;2*deltax
add.w d7,d7 ;2*deltay
loop_dl1:
move.w a0,d0 ;x
move.w a1,d1 ;y
draw_point
tst.w d3 ;e
ble cont_dl5 ;e<=0
addq.w #1,a0 ;x+=1
add.w d6,d3 ;e=e+(2*deltax-2*deltay)
sub.w d7,d3
bra cont_dl6
cont_dl5: ;e<=0
add.w d6,d3 ;e=e+2*deltax
cont_dl6:
subq.w #1,a1 ;y-=1
dbra d4,loop_dl1
rts
cont_dl3: ;deltay<=deltax
move.w d0,a0 ;x1
move.w d1,a1 ;y1
move.w d7,d3 ;e=deltay
add.w d3,d3 ;*2
sub.w d6,d3 ;-deltax
move.w d6,d4 ;deltax
add.w d6,d6 ;2*deltax
add.w d7,d7 ;2*deltay
loop_dl2:
move.w a0,d0 ;x
move.w a1,d1 ;y
draw_point
tst.w d3 ;e
ble cont_dl7 ;e<=0
subq.w #1,a1 ;y-=1
add.w d7,d3 ;e=e+(2*deltay-2*deltax)
sub.w d6,d3
bra cont_dl8
cont_dl7: ;e<=0
add.w d7,d3 ;e=e+2*deltay
cont_dl8:
addq.w #1,a0 ;x+=1
dbra d4,loop_dl2
rts
cont_dl2: ;y2>=y1
cmp.w d7,d6 ;deltay,deltax
bge cont_dl4 ;deltay<=deltax
move.w d0,a0 ;x1
move.w d1,a1 ;y1
move.w d6,d3 ;e=deltax
add.w d3,d3 ;*2
sub.w d7,d3 ;-deltay
move.w d7,d4 ;deltay
add.w d6,d6 ;2*deltax
add.w d7,d7 ;2*deltay
loop_dl3:
move.w a0,d0 ;x
move.w a1,d1 ;y
draw_point
tst.w d3 ;e
ble cont_dl9 ;e<=0
addq.w #1,a0 ;x+=1
add.w d6,d3 ;e=e+(2*deltax-2*deltay)
sub.w d7,d3
bra cont_dl10
cont_dl9: ;e<=0
add.w d6,d3 ;e=e+2*deltax
cont_dl10:
addq.w #1,a1 ;y+=1
dbra d4,loop_dl3
rts
cont_dl4: ;deltay<=deltax
move.w d0,a0 ;x1
move.w d1,a1 ;y1
move.w d7,d3 ;e=deltay
add.w d3,d3 ;*2
sub.w d6,d3 ;-deltax
move.w d6,d4 ;deltax
add.w d6,d6 ;2*deltax
add.w d7,d7 ;2*deltay
loop_dl4:
move.w a0,d0 ;x
move.w a1,d1 ;y
draw_point
tst.w d3 ;e
ble cont_dl11 ;e<=0
addq.w #1,a1 ;y+=1
add.w d7,d3 ;e=e+(2*deltay-2*deltax)
sub.w d6,d3
bra cont_dl12
cont_dl11: ;e<=0
add.w d7,d3 ;e=e+2*deltay
cont_dl12:
addq.w #1,a0 ;x+=1
dbra d4,loop_dl4
rts
data
wrong_scr_txt: dc.b '[3][Sorry...|Music Analyzer cannot|run on a monochrome monitor][Exit]',0
snd_locked_txt: dc.b '[3][Sound System locked !][Exit]',0
dsp_locked_txt: dc.b '[3][DSP locked !][Exit]',0
outofmem_txt: dc.b '[3][Out of memory !][Exit]',0
outofmem_txt2: dc.b '[3][Out of DSP memory !][Exit]',0
wrong_mach_txt: dc.b '[3][Sorry...|Music Analyzer can only run|on an Atari 680x0 (x>=3)|machine with DSP, Codec and|Connection Matrix (a Falcon!)][Exit]',0
better_vga_txt: dc.b '[1][If you want this program|to look even better|(or just wanna read the|texts), buy yourself a|VGA monitor !][ ... ]',0