antoine-source/picknpile/SOURCES.IIGS/GAMESYS.SRC

1 line
47 KiB
Plaintext

************************************************************************
* *
* GAME SYSTEM *
* ----------- *
* *
* (c) Atreid Concept SA Version 0.5 22/12/90 *
************************************************************************
************************************************************************
GSInit anop ;Temp2= ptr image font
jsr Nombre16Init
jsr Random
; jsr SoundInit
rts
GSTemp1 ds 4
GSTemp2 ds 4
GSTemp3 ds 4
GSTemp4 ds 4
GSTemp5 ds 4
;--------------------------
;init de 'Nombre16'
Nombre16Init anop
ldx #0 ;on construit une routine pour
txy ;faire la copie de l'image
stz Temp ;source vers l'ecran
Nb16CopyLoop anop
lda #$bf ; LDA >$bbnnnn,x
sta Nb16doCopy,x
lda Temp2+1 ; bb
sta Nb16doCopy+2,x
lda Temp2 ; nnnn
clc
adc Temp
sta Nb16doCopy+1,x
inx
inx
inx
inx
lda #$99 ; STA nnnn,y
sta Nb16doCopy,x
lda #$2000 ; nnnn
clc
adc Temp
sta Nb16doCopy+1,x
inx
inx
inx
inc Temp
inc Temp
iny
cpy #4
bne Nb16CopyLoop
ldy #0
lda Temp
clc
adc #160-8
sta Temp
cmp #2560
bne Nb16CopyLoop
rts
;--------------------------
;init de 'Sound'
SoundInit anop
sei
sep #$20
longa off
lda >$e100ca ;acces aux registres
and #$0f
sta >$e0c03c
lda #$e1 ;registre $e1
sta >$e0c03e ;SoundAdrL
lda #$40 ;32 oscillateurs * 2
sta >$e0c03d ;SoundData
rep #$30
longa on
cli
rts
************************************************************************
PaintRect anop ;GSTemp1 = coor. x
anop ;GSTemp1+2= coor. y
anop ;GSTemp2 = dep relatif x
anop ;GSTemp2+2= dep relatif y
anop ;GSTemp3 = couleur
lda GSTemp2
lsr a ;un octect = 2 pts
sta GSTemp2
lda GSTemp1
lsr a ;un octect = 2 pts
ldy GSTemp1+2
PRLoop anop
cpy #0
beq PR2
dey
clc
adc #160
bra PRLoop
PR2 anop
clc
adc #$2000
sta PR4+1
ldx #0
txy
PR3 anop
lda GSTemp3
PR4 sta >$e12000,x
inx
inx
cpx GSTemp2
blt PR3
lda PR4+1
clc
adc #160
sta PR4+1
ldx #0
iny
cpy GSTemp2+2
blt PR3
rts
************************************************************************
ErrTexte8 anop ;a= C string ptr
anop ;x= position x
anop ;y= position y
stz GSTemp1 ;Invert ($1e)
stz GSTemp2 ;Underline ($1f)
pha
txa
clc
lsr a
ErrT8L1 anop ;calcul de l'offset ecran
cpy #0
beq ErrT8L2
clc
adc #160
dey
bra ErrT8L1
ErrT8L2 anop
sta GSTemp3 ;offset
sta GSTemp4
phd
tsc
tcd
ldy #0
ErrT8L3 anop
lda (3),y
and #$ff
cmp #0
beq ErrT8L4
phy
jsr ErrT8Aff
ply
iny
bra ErrT8L3
ErrT8L4 anop
pld
pla
rts
ErrT8Aff anop
cmp #$20
bge ErrT8Aff0
brl ErrT8Spe
ErrT8Aff0 anop
sec
sbc #$20 ;premier caractere est 'espace'
stz GSTemp5
ErrT8Aff1 anop
sec
sbc #40 ;40 caracteres par lignes
bcc ErrT8Aff2
pha
lda GSTemp5
clc
adc #8*160 ;ligne suivante
sta GSTemp5
pla
bra ErrT8Aff1
ErrT8Aff2 anop
adc #40 ;40 caracteres par lignes
asl a
asl a ;4 octets de large par caractere
clc
adc GSTemp5
tay ;offset source
ldx GSTemp3
lda #0
ErrT8Aff3 anop
pha
lda ErrFont8,y
eor GSTemp1
sta >$e12000,x
lda ErrFont8+2,y
eor GSTemp1
sta >$e12000+2,x
tya
clc
adc #160
tay
txa
clc
adc #160
tax
pla
inc a
cmp #8
bne ErrT8Aff3
lda GSTemp2
beq ErrT8Aff4 ;souligner ?
lda GSTemp3
clc
adc #7*160
lda GSTemp1
eor #$ffff
sta >$e12000,x
sta >$e12000+2,x
ErrT8Aff4 anop
lda GSTemp3
clc
adc #4
sta GSTemp3
rts
ErrT8Spe anop
cmp #$08 ;fleche gauche
beq ErrT8Left
cmp #$09 ;tab
beq ErrT8Tab
cmp #$0a ;fleche bas
beq ErrT8Down
cmp #$0b ;fleche haut
beq ErrT8Up
cmp #$0d ;return
beq ErrT8CR
cmp #$15 ;fleche droite
beq ErrT8Right
cmp #$1f ;toggle underline
beq ErrT8Under
cmp #$1e ;toggle invert
beq ErrT8Invert
rts
ErrT8Left anop
lda GSTemp3
sec
sbc #4
sta GSTemp3
rts
ErrT8Tab anop
lda GSTemp3
clc
adc #40 ;+10 caracteres
sta GSTemp3
rts
ErrT8Down anop
lda GSTemp3
clc
adc #8*160
sta GSTemp3
rts
ErrT8Up anop
lda GSTemp3
sec
sbc #8*160
sta GSTemp3
rts
ErrT8CR anop
lda GSTemp4
clc
adc #8*160
sta GSTemp3
sta GSTemp4
rts
ErrT8Right anop
lda GSTemp3
clc
adc #4
sta GSTemp3
rts
ErrT8Under anop
lda GSTemp2
eor #$8000
sta GSTemp2
rts
ErrT8Invert anop
lda GSTemp1
eor #$ffff
sta GSTemp1
rts
copy GSFont.Src
************************************************************************
TransTSB16 anop ;GSTemp1= adresse dest
PushLong GSTemp1
phd
tsc
tcd
stz GSTemp2
stz GSTemp3
ldx #0
ldy #0
TSBRoutLoop anop
lda #$04 ;TSB nn
sta [3],y
iny
lda GSTemp3 ;nn
inc GSTemp3
inc GSTemp3
sta [3],y
iny
NextTSB anop
lda GSTemp3
cmp #166 ;Ligne + nb oct/ligne
beq NextT1
cmp #6 ;nb octets/ligne
bne NextT2
lda GSTemp3
clc
adc #160-6 ;Ligne - nb oct/ligne
sta GSTemp3
bra NextT2
NextT1 anop
stz GSTemp3
lda #$7b ;TDC
sta [3],y
iny
lda #$69 ;ADC #nnnn
sta [3],y
iny
lda #320 ;nnnn A 2 Lignes
sta [3],y
iny
iny
lda #$5b ;TCD
sta [3],y
iny
lda #$98 ;TYA
sta [3],y
iny
NextT2 anop
inx
inx
cpx #66 ;Nb octetsA 6octets*11lignes
bne TSBRoutLoop
RoutLoop2 lda #$6b ;RTL
sta [3],y
iny
pld
pla
pla
rts
************************************************************************
Linear16 anop ;GSTemp1= adresse source
anop ;GSTemp2= adresse dest
PushLong GSTemp1
PushLong GSTemp2
phd
tsc
tcd
ldy #0
ldx #0
Linear16Loop anop
lda [7],y
phy
txy
sta [3],y
ply
iny
iny
inx
inx
lda [7],y
phy
txy
sta [3],y
ply
iny
iny
inx
inx
lda [7],y
phy
txy
sta [3],y
ply
iny
iny
inx
inx
lda [7],y
phy
txy
sta [3],y
ply
inx
inx
tya
clc
adc #160-6 ;16 points par ligne
tay
cpx #16*8 ;16 lignes * 8 octets
blt Linear16Loop
pld
pla
pla
pla
pla
rts
************************************************************************
ZPBank anop ;a=0/1 zp-s bank $0/1
plx
cmp #0
beq ZPBank0
tsc
sta ZPBankStack
sep #$30
longa off
lda >$e0C068
sta ZPBankStat
ora #$34
sta >$e0C068
rep #$30
longa on
lda #$9df0
tcs ;fixe la stack apres les SCBs
phx
rts
ZPBank0 anop
longa off
sep #$30
lda ZPBankStat
sta >$e0C068
rep #$30
longa on
lda ZPBankStack
tcs
phx
rts
ZPBankStat ds 1
ZPBankStack ds 2
************************************************************************
CursorCSet16 anop ;a= adresse data curseur (16*16)
anop ;y=$0101/$e1e1 bank dest
anop ;x= adresse memoire destination
sty GSTemp5
sta CursorRoutLoop+1
phx
phd
tsc
tcd
jsr CursorLoop0
pld
pla
rts
CursorLoop0 anop
ldy #0
ldx #0
stz GSTemp4
stz GSTemp3
stz GSTemp1
lda #$8b ;PHB
sta (3),y
iny
lda #$a9 ; LDA #nnnn
sta (3),y
iny
lda GSTemp5 ;nnnn
sta (3),y
iny
iny
lda #$48 ;PHA
sta (3),y
iny
lda #$ab ;PLB
sta (3),y
iny
lda #$ab ;PLB
sta (3),y
iny
CursorRoutLoop lda NextWord2,x
sta GSTemp2
jsr TestTrans
bcs doTrans20
bra doCopy2
NextWord2 anop
inc GSTemp1
lda GSTemp1
cmp #4 ;Nb word/ligne
bne CursorNW2
stz GSTemp1
lda GSTemp3
clc
adc #152 ;160 - 8 (nb oct/ligne)
sta GSTemp3
CursorNW2 anop
inx
inx
cpx #128 ;Nb octetsA 8octets*16lignes
bne CursorRoutLoop
brl TransLoop22
doCopy2 anop
lda GSTemp2
cmp GSTemp4
beq SameSTY2
lda #$a9 ;LDA #nnnn
sta (3),y
iny
lda GSTemp2 ;nnnn
sta (3),y
iny
iny
sta GSTemp4
SameSTY2 anop
lda #$9d ;STA nnnn,x
sta (3),y
iny
lda GSTemp3
inc GSTemp3
inc GSTemp3
sta (3),y ;nnnn
iny
iny
brl NextWord2
doTrans20 anop
phx
stz GSTemp4
lda #$000f
tax
and GSTemp2
jsr ModTemp4
lda #$00f0
tax
and GSTemp2
jsr ModTemp4
lda #$0f00
tax
and GSTemp2
jsr ModTemp4
lda #$f000
tax
and GSTemp2
jsr ModTemp4
lda GSTemp4
bne doTrans22
inc GSTemp3
inc GSTemp3
plx
brl NextWord2
doTrans22 anop
lda #$bd ;LDA nnnn,x
sta (3),y
iny
lda GSTemp3
sta (3),y
iny
iny
lda #$29 ;AND #nnnn
sta (3),y
iny
lda GSTemp4 ;nnnn
eor #$ffff
sta (3),y
iny
iny
lda #$09 ;ORA #nnnn
sta (3),y
iny
lda GSTemp2 ;nnnn
sta (3),y
iny
iny
lda #$9d ;STA nnnn,x
sta (3),y
iny
lda GSTemp3 ;nnnn
inc GSTemp3
inc GSTemp3
sta (3),y
iny
iny
stz GSTemp4
plx
brl NextWord2
TransLoop22 anop
lda #$ab ;PLB
sta (3),y
iny
lda #$6b ;RTL
sta (3),y
iny
rts
ModTemp4 anop
cmp #0
beq MT4End
txa
ora GSTemp4
sta GSTemp4
MT4End rts
TestTrans anop
and #$000f
beq TransOk
lda GSTemp2
and #$00f0
beq TransOk
lda GSTemp2
and #$0f00
beq TransOk
lda GSTemp2
and #$f000
beq TransOk
clc
rts
TransOk sec
rts
************************************************************************
WaitUser anop ;--> a= caractere tape
anop ; 0 si clic ou fire
sep #$30
longa off
longi off
lda #0
lda >$e0c024
sta >$e0c010 ;echantillonne clavier
WULoop anop
rep #$30
longa on
longi on
lda #150
jsr WaitSpot
jsr WaitVBL
longa off
longi off
sep #$30
lda >$e0C000 ;teste touche
bmi WUDone1
lda >$e0C061 ;teste fire 0
bmi WUDone
lda >$e0C062 ;teste fire 1
bmi WUDone
lda >$e0C027 ;teste clic souris
bpl WULoop
and #%00000010
bne WULoop2
lda >$e0C024
lda >$e0C024
bmi WULoop
bra WUDone
WULoop2 anop
lda >$e0C024
bra WULoop
WUDone anop
lda #0
WUDone1 anop
rep #$30
longa on
longi on
and #$7f
rts
***********************************************************************
Fade anop ;a=1 fade in a=0 fade out
anop ;Source bank $01, dest bank $e1
cmp #0
bne FadeIn
brl FadeOut
FadeIn anop
ldx #0
Shadow1 anop
lda >$012000,x
sta >$e12000,x
inx
inx
cpx #32256 ;copie image + SCBs
bne Shadow1
ldy #16
ldx #0
FadeInLoop anop
lda >$019e00,x
sta Temp4+2
lda >$e19e00,x
sta Temp4
cmp Temp4+2
beq FILNoChange
lda Temp4
and #$0f00
sta Temp
lda Temp4
and #$00f0
sta Temp2
lda Temp4
and #$000f
sta Temp3
lda Temp4+2
and #$0f00
cmp Temp
beq FIL1
lda Temp
clc
adc #$0100
sta Temp
FIL1 anop
lda Temp4+2
and #$00f0
cmp Temp2
beq FIL2
lda Temp2
clc
adc #$0010
sta Temp2
FIL2 anop
lda Temp4+2
and #$000f
cmp Temp3
beq FIL3
lda Temp3
clc
adc #$0001
sta Temp3
FIL3 anop
lda Temp
ora Temp2
ora Temp3
sta >$e19e00,x
FILNoChange anop
dey
bne FILNextVBL
jsr NextVBL
FILNextVBL anop
inx
inx
cpx #64 ;fade sur 2 palettes
beq FIL4
brl FadeInLoop
FIL4 anop
ldx #0
dey
beq FIL5
brl FadeInLoop
FIL5 anop
rts
NextVBL anop
phx
lda #150
jsr WaitSpot
jsr WaitVBL
plx
ldy #16
rts
FadeOut anop
ldy #16
ldx #0
FadeOutLoop anop
lda >$e19e00,x
cmp #0
beq FOLNoChange
lda >$e19e00,x
and #$0f00
sta Temp
lda >$e19e00,x
and #$00f0
sta Temp2
lda >$e19e00,x
and #$000f
sta Temp3
lda Temp
beq FOL1
lda Temp
sec
sbc #$0100
sta Temp
FOL1 anop
lda Temp2
beq FOL2
lda Temp2
sec
sbc #$0010
sta Temp2
FOL2 anop
lda Temp3
beq FOL3
lda Temp3
sec
sbc #$0001
sta Temp3
FOL3 anop
lda Temp
ora Temp2
ora Temp3
sta >$e19e00,x
FOLNoChange anop
dey
bne FOLNextVBL
jsr NextVBL
FOLNextVBL anop
inx
inx
cpx #64 ;fade sur 2 palettes
bne FadeOutLoop
ldx #0
dey
bne FadeOutLoop
rts
************************************************************************
Decompacte anop ;Temp= handle
anop ;Temp2= ptr dest
PushLong Temp
phd ;on dereference le handle
tsc
tcd
ldy #0
lda [3],y
sta Temp3
ldy #2
lda [3],y
sta Temp3+2
pld
pla
pla
PushLong #0
PushLong Temp
_GetHandleSize ;Taille du handle ?
PullLong Temp4
lda #32768
sta UnPackAreaSz
PushWord #0
PushLong Temp3
PushWord Temp4
PushLong #Temp2
PushLong #UnpackAreaSz
_UnPackBytes
pla
rts
UnPackAreaSz dc i2'32768'
************************************************************************
WaitVBL anop
lda >$e0C019
and #%0000000010000000
beq WaitVBL
rts
************************************************************************
Texte16 anop ;a= ptr str
anop ;x= coordonnee x
anop ;y= coordonnee y
anop ;CarPtr= ptr image source
pha
txa
lsr a
sta Temp2
lda CarPtr
sta Temp
lda CarPtr+2
sta Temp+2
lda #0
MemY anop
clc
adc #160
dey
bne MemY
clc
adc Temp2
sta Temp2 ;offset sur l'ecran
pla
sta T16length+1
inc a
sta T16Read+1
T16length lda T16length
and #$ff
sta Temp3
bne T16NotZero
rts ;si len$(str)=0 on s'en va
T16NotZero anop
ldx #0
T16Read lda T16Read,x
and #$ff
cmp #128
bge T16Aff0
sta Temp4
ldy #0
T16Trans anop
lda T16Car,y
and #$ff
cmp Temp4
beq T16Aff
iny
cpy T16NbCar
bne T16Trans
bra T16Aff
T16Aff0 anop
and #$7f
tay
T16Aff anop
phx
tya
ldx #0
sec
T16Aff2 anop
sbc #20
inx
bcs T16Aff2
adc #20
asl a
asl a
asl a
T16Aff3 anop
dex
cpx #0
beq T16Aff4
clc
adc #16*160
bra T16Aff3
T16Aff4 anop
jsr Sprite16
lda Temp2
clc
adc #8
sta Temp2
plx
inx
cpx Temp3
bne T16Read
rts
T16Car dc c'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
dc c'.:!?#0123456789 '
T16CarEnd anop
T16NbCar dc i2'T16CarEnd-T16Car'
************************************************************************
Nombre16 anop ;a= ptr str
anop ;x= coordonnee x
anop ;y= coordonnee y
anop ;CarPtr= ptr image source
pha
txa
lsr a
sta Temp2
lda #0
Nb16MemY anop
clc
adc #160
dey
bne Nb16MemY
clc
adc Temp2
sta Temp2 ;offset sur l'ecran
pla
sta Nb16Length+1
inc a
sta Nb16Read+1
stz Temp4
Nb16Length lda Nb16Length
and #$ff
sta Temp3
dec Temp3
ldx #0
Nb16Read lda Nb16Read,x
and #$ff
cmp #32 ;espace
bne Nb16a
lda #48 ;chiffre 0
Nb16a anop
cmp #76
bge Nb16b
clc
adc #66-48 ;0 dans image - 0 ascii
Nb16b anop
phx
jsr Nb16affiche
plx
lda Temp4 ;espace pour caractere suivant
clc
adc #8
sta Temp4
inx
cpx Temp3
blt Nb16Read
rts
Nb16Affiche anop
ldx #0
sec
Nb16Aff2 anop
sbc #20
inx
bcs Nb16Aff2
adc #20
asl a
asl a
asl a
Nb16Aff3 anop
dex
cpx #0
beq Nb16Aff4
clc
adc #16*160
bra Nb16Aff3
Nb16Aff4 anop
tax
lda Temp2 ;offset ecran source
clc
adc Temp4
tay ;offset ecran dest
Nb16Copy anop ;routine de copie des objets
lda #$0101
pha
plb
plb
Nb16doCopy ds 4*(4+3)*16
phk
plb
rts
************************************************************************
HexStr anop ;Temp= valeur 32 bits
anop ;Temp2= ptr de string
anop ;a= nb caractere de la str
ldx Temp2
sta Temp3
inc Temp3
inx
stx HexSClr+1
tax
lda #48 ;chiffre 0 en ascii
HexSClr sta HexSClr,x
dex
bne HexSClr
PushLong Temp
PushLong Temp2
PushWord Temp3
PushWord #0
_Long2Dec
lda ScoreStr
and #$ff00
ora Temp3
sta ScoreStr
rts
************************************************************************
Sprite16 anop ;Temp= ptr image source
anop ;Temp2= offset ecran dest
anop ;a= offset ecran source
ldx Temp+1
stx Sp16Read+2
clc
adc Temp
sta Sp16Read+1
lda #$2000
clc
adc Temp2
sta SP16Write+1
sep #$20
longa off
lda #$e1 ;page video
pha
plb
ldx #0
txy
Sp16Read lda >Sp16Read,x
beq Sp16Next
Sp16Write sta Sp16Write,x
Sp16Next inx
iny
cpy #8
bne Sp16Read
ldy #0
rep #$30
longa on
txa
clc
adc #160-8
tax
sep #$20
longa off
cpx #16*160
bne Sp16Read
rep #$30
longa on
phk
plb
rts
************************************************************************
CopyZone anop ;Temp = coor. x
anop ;Temp+2 = coor. y
anop ;Temp2 = dep relatif x
anop ;Temp2+2= dep relatif y
lda Temp2
lsr a ;un octect = 2 pts
sta Temp2
lda Temp
lsr a ;un octect = 2 pts
ldy Temp+2
CZLoop anop
cpy #0
beq CZ2
dey
clc
adc #160
bra CZLoop
CZ2 anop
clc
adc #$2000
sta CZ3+1
sta CZ4+1
ldx #0
txy
CZ3 lda >$012000,x
CZ4 sta >$e12000,x
inx
inx
cpx Temp2
blt CZ3
lda CZ3+1
clc
adc #160
sta CZ3+1
sta CZ4+1
ldx #0
iny
cpy Temp2+2
blt CZ3
rts
************************************************************************
WaitSpot anop ;a= ligne
lsr a
longa off
sep #$30
sta WS1+1
WaitS anop
lda >$e0C02e
and #$7f
WS1 cmp #0
blt WaitS
cmp #100
bge WaitS
longa on
rep #$30
rts
************************************************************************
Random anop ;--> a= rnd(256)
lda >$e0c02e
xba
clc
adc VBLCounter0
sta VBLCounter0
and #$ff
rts
************************************************************************
Pause anop ;a = temps de pause (1/60 sec)
pha
jsr WaitVBL ;on force l'attente a 1/60s
PauseVBL anop
lda >$e0C019
and #%0000000010000000
bne PauseVBL
pla
dec a
bne Pause
rts
************************************************************************
ReadMouse anop ;a --> 0 A pas d'info souris
anop ;a --> $8000
anop ;==> Mx--> coor X My--> coor Y
anop ; MBut--> bouton
lda Mx
sta Mx2
lda My
sta My2
lda MBut
sta MBut2
longa off
longi off
sep #$30
lda >$e0C027
bpl RMDonebis
and #2
beq DoXY
lda >$e0C024
RMDonebis lda #0 ;pas d'info souris
brl RMDone
DoXY lda >$e0C024
tax
lda >$e0c024
sta Temp
longa on
longi on
rep #$30
txa
and #$ff
tax
and #%01000000
bne XPos
txa
and #%00111111
clc
adc Mx
sta Mx
bra NowDoY
XPos anop
txa
ldx Mx
and #%00111111
eor #%00111111
inc a
sta Mx
txa
sec
sbc Mx
sta Mx
NowDoY lda Temp
and #$FF
tax
and #%01000000
bne YPos
txa
and #%00111111
clc
adc My
sta My
bra XYDone
YPos anop
txa
and #%00111111
eor #%00111111
inc a
ldx My
sta My
txa
sec
sbc My
sta My
XYDone anop
stz MBut
lda Temp
and #$80
bne RMDoUp
lda #$8000
sta MBut
RMDoUp anop
lda Mx
cmp #$f000
bge doXMin
cmp #309 ;max x
bge doXMax
bra ClampY
doXMin stz Mx
bra ClampY
doXMax lda #308 ;clamp x
sta Mx
ClampY anop
lda My
cmp #$f000
bge doYMin
cmp #128 ;max y
bge doYMax
bra RMDone2
doYMin stz My
bra RMDone2
doYMax lda #127 ;clamp y
sta My
RMDone2 anop
lda Mx
cmp Mx2
bne RMDone1
lda My
cmp My2
bne RMDone1
lda MBut
cmp MBut2
bne RMDone1
lda #0
bra RMDone
RMDone1 lda #$8000
RMDone rep #$30
rts
Mx ds 2
Mx2 ds 2
My ds 2
My2 ds 2
MBut ds 2
MBut2 ds 2
************************************************************************
Shadow anop ;a = 1 A shadow on
anop ;a = 0 A shadow off
eor #1
asl a
asl a
asl a
ora #%00010001
sep #$30
sta >$e0C035 ;shadowing video du bank $01
rep #$30
rts
************************************************************************
Sound anop ;a = frequence du son
anop ;x = Ptr bloc info son
anop ;==> Bloc info son (words)A
anop ; _ Volume ($0 - $ff)
anop ; _ Page adresse dans DOC ($0 - $ff)
anop ; _ Longueur du son
anop ; _ Controle du son
sei
sta GSTemp2
phx
phd ;on lit les infos son
tsc
tcd
sep #$20
longa off
lda >$e100ca ;volume systeme
and #$0f ;acces aux registres du DOC
sta >$e0c03c
lda SoundCh ;Reg frequence (bas)
sta >$e0c03e
lda GSTemp2 ;Frequence
sta >$e0c03d
lda SoundCh ;Reg frequence (haut)
clc
adc #$20
sta >$e0c03e
lda GSTemp2+1 ;Frequence
sta >$e0c03d
lda SoundCh
clc
adc #$40 ;Reg Volume
sta >$e0c03e
ldy #0
lda (3),y ;Lecture Volume
sta >$e0c03d
lda SoundCh
clc
adc #$80 ;Reg adresse Ram DOC
sta >$e0c03e
ldy #2
lda (3),y ;Lecture adresse
sta >$e0c03d
lda SoundCh
clc
adc #$C0 ;Reg taille du son
sta >$e0c03e
ldy #4
lda (3),y ;Lecture taille du son
sta >$e0c03d
lda SoundCh
clc
adc #$A0 ;Reg controle du son
sta >$e0c03e
ldy #6
lda (3),y ;Lecture controle
sta >$e0c03d ;Le son est joue !
lda SoundCh
inc a
and #$f ;16 oscillos !
sta SoundCh
rep #$30
longa on
pld
pla
cli
rts
SoundCh ds 2
************************************************************************
ClearDOC anop
sei
sep #$20
longa off
lda >$e100ca ;volume systeme
and #$0f ;acces a la ram DOC
ora #%01100000 ;auto inc des pointeurs
sta >$e0c03c
lda #0
sta >$e0c03e ;adresse basse
sta >$e0c03f ;adresse haute dans le DOC
ldy #0
lda #0
ClearDOCLoop anop
sta >$e0c03d ;sound doc
iny
bne ClearDOCLoop
rep #$30
longa on
cli
rts
************************************************************************
SoundLoad anop ;Temp = handle du son
anop ;Temp2 = ptr bloc info son
sei
PushLong #0
PushLong Temp
_GetHandleSize ;taille du son en octets
PullLong Temp3
PushLong Temp
PushLong Temp2
phd
tsc
tcd
ldy #0
lda [7],y ;dereference de Temp
tax
ldy #2
lda [7],y
stx <7
sta <9
sep #$20
longa off
ldy #0
lda #$ff ;on fixe le volume a 255
sta [3],y
ldx #7
lda Temp3+1 ;nombre de pages mem du son
bmi SoundDOCok0 ;size = 32 ko si son > 32 ko
ldx #0
SoundDOCLoop0 anop
cmp SoundSzTable,x ;table des tailles possibles
blt SoundDOCok0
inx
bra SoundDOCLoop0
SoundDOCok0 anop
stx Temp
txa ;taille en pages (puissance de 2)
asl a
asl a
asl a
ora Temp ;resolution
ldy #4
sta [3],y
lda >$e100ca ;volume systeme
and #$0f ;acces a la ram DOC
ora #%01000000
sta >$e0c03c
stz Temp2
FindDOCadr anop
lda Temp2
sta >$e0c03f ;adr haute
lda #0
sta >$e0c03e ;adr basse
lda >$e0c03d ;une lecture pour rien
ldy #0
FindDOCadr2 anop
lda >$e0c03d ;lecture du DOC
bne FindDOCadr3
rep #$30
lda >$e0c03e
inc a ;incrementation manuelle !
sta >$e0c03e
sep #$20
iny
cpy Temp3 ;longueur du son (octets)
blt FindDOCadr2
bra FindDOCadr5
FindDOCadr3 anop
ldx Temp
lda SoundSzTable,x
clc
adc Temp2
sta Temp2
bcc FindDOCadr ;si le DOC est pleinA page 0!
FindDOCadr5 anop
lda Temp2 ;adresse du son dans le DOC
ldy #2
sta [3],y
ldy #6
lda #%00000010 ;Controle de l'oscillo
sta [3],y ;--> droite, pas int, one-shot
lda >$e100ca ;volume systeme
and #$0f ;acces a la ram DOC
ora #%01100000 ;auto inc des pointeurs
sta >$e0c03c
lda #0
sta >$e0c03e ;adresse basse
ldy #2
lda [3],y ;lecture page mem
sta >$e0c03f ;adresse haute dans le DOC
ldy #0
LoadDOCLoop anop
lda [7],y
bne LoadDOCL2
lda #1
LoadDOCL2 anop
sta >$e0c03d ;sound doc
iny
cpy Temp3 ;nb octets du son
bne LoadDOCLoop
lda #0
sta >$e0c03d ;sound doc
sta >$e0c03d
sta >$e0c03d
sta >$e0c03d
sta >$e0c03d
sta >$e0c03d
sta >$e0c03d
sta >$e0c03d
rep #$30
longa on
pld
pla ;on enleve les ptrs !
pla
pla
pla
cli
rts
SoundSzTable dc i1'1'
dc i1'2'
dc i1'4'
dc i1'8'
dc i1'16'
dc i1'32'
dc i1'64'
dc i1'128'
************************************************************************
ReadJoy anop ;mx / my
anop ;==> a=0 : pas de deplacement
lda Mx
sta Mx2
lda My
sta My2
sei
stz Paddle0
stz Paddle1
stz Paddle2
stz Paddle3
sep #$30
longa off
longi off
ldy #$30 ;Sampling value
lda >$e0c036 ;Force GS Speed to 1Mhz
pha
and #$7f
sta >$e0c036
lda >$e0c070 ;Prepare to read paddles
nop
APaddle0 lda >$e0c064 ;paddle 0
bmi AIncPaddle0
bra APaddle1
AIncPaddle0 inc Paddle0
APaddle1 lda >$e0c065 ;paddle 1
bmi AIncPaddle1
bra APaddle2
AIncPaddle1 inc Paddle1
APaddle2 lda >$e0c066 ;paddle 2
bmi AIncPaddle2
bra APaddle3
AIncPaddle2 inc Paddle2
APaddle3 lda >$e0c067 ;paddle 3
bmi AIncPaddle3
bra AContinue
AIncPaddle3 inc Paddle3
AContinue bra Adey
Adey dey
bne APaddle0
pla
sta >$e0c036 ;Restore GS speed
cli
rep #$30
longa on
longi on
lda Paddle0
and #$ff ;resultat
cmp #$18
bge AdcX
sta Temp
lda #$18
sec
sbc Temp
clc
lsr a
lsr a
lsr a
sta Temp
lda Mx
sec
sbc Temp
cmp #$f000
blt ReadXEnd0
lda #0
bra ReadXEnd0
AdcX anop
sec
sbc #$18
clc
lsr a
lsr a
lsr a
clc
adc Mx
cmp #309
blt ReadXEnd0
lda #308
ReadXEnd0 anop
sta Mx
ReadXEnd anop
lda Paddle1
and #$ff ;resultat
cmp #$18
bge AdcY
sta Temp
lda #$18
sec
sbc Temp
clc
lsr a
lsr a
lsr a
sta Temp
lda My
sec
sbc Temp
cmp #$f000
blt ReadYEnd0
lda #0
bra ReadYEnd0
AdcY anop
sec
sbc #$18
clc
lsr a
lsr a
lsr a
adc My
cmp #128
blt ReadYEnd0
lda #127
ReadYEnd0 anop
sta My
ReadYEnd anop
lda >$e0c061
and #%0000000010000000
beq RNotFire
lda #1
sta MBut
bra RDepTest
RNotFire anop
stz MBut
RDepTest anop
lda Mx
cmp Mx2
bne RDepTestF
lda My
cmp My2
bne RDepTestF
lda #0
rts
RDepTestF anop
lda #$80
rts
Paddle0 ds 2
Paddle1 ds 2
Paddle2 ds 2
Paddle3 ds 2