plasmag: still trying to find a good plasma
this one is from French Touch, let's see if I can get it compiling
This commit is contained in:
parent
cb9795c6e4
commit
c3b9e1a713
|
@ -0,0 +1 @@
|
|||
Frenchtouch released this GPLv3
|
|
@ -0,0 +1,31 @@
|
|||
include ../../../Makefile.inc
|
||||
|
||||
DOS33 = ../../../utils/dos33fs-utils/dos33
|
||||
TOKENIZE = ../../../utils/asoft_basic-utils/tokenize_asoft
|
||||
LINKERSCRIPTS = ../../../linker_scripts
|
||||
EMPTYDISK = ../../../empty_disk/empty.dsk
|
||||
|
||||
all: plasmag.dsk
|
||||
|
||||
plasmag.dsk: HELLO PLASMAG
|
||||
cp $(EMPTYDISK) plasmag.dsk
|
||||
$(DOS33) -y plasmag.dsk SAVE A HELLO
|
||||
$(DOS33) -y plasmag.dsk BSAVE -a 0x4000 PLASMAG
|
||||
|
||||
###
|
||||
|
||||
HELLO: hello.bas
|
||||
$(TOKENIZE) < hello.bas > HELLO
|
||||
|
||||
###
|
||||
|
||||
PLASMAG: plasmag.o
|
||||
ld65 -o PLASMAG plasmag.o -C $(LINKERSCRIPTS)/apple2_4000.inc
|
||||
|
||||
plasmag.o: plasmag.s
|
||||
ca65 -o plasmag.o plasmag.s -l plasmag.lst
|
||||
|
||||
###
|
||||
|
||||
clean:
|
||||
rm -f *~ *.o *.lst PLASMAG HELLO
|
|
@ -0,0 +1,161 @@
|
|||
;@com.wudsn.ide.asm.hardware=APPLE2
|
||||
; ACME 0.90
|
||||
; PLASMAGORIA
|
||||
; boot0 (T0/S0)
|
||||
; version 0.3
|
||||
|
||||
; + interruption spécial GS (réactive language card + jmp to player)
|
||||
; #SLOT variable pour MB
|
||||
; - bug IIGS (=> fixe pas IIc)
|
||||
|
||||
!convtab "a2txt.bin" ; incorporation table caractère APPLE II (normal) générale
|
||||
!sl "bootlabel.a"
|
||||
|
||||
*= $800 ; ORG = $800
|
||||
|
||||
; CONSTANTE
|
||||
DEBUT2 = $F106
|
||||
RoutINTGS = $4000
|
||||
|
||||
; variable PAGE ZERO
|
||||
bMocking = $08 ; Mockingboard (00 - NOP / 01 - OK)
|
||||
bIIc = $09 ; byte IIc (00 = //c | other = pas //c !)
|
||||
bMachine = $0A ; byte MACHINE ($7F/IIE | $FF/GS)
|
||||
|
||||
OUT2 = $22 ; +$21
|
||||
|
||||
Temp = $FF
|
||||
; variables
|
||||
|
||||
OffMin = $F0
|
||||
|
||||
!byte 01 ; premier octet réservé : nb de secteur à charger lors du boot 0
|
||||
|
||||
START
|
||||
!zone
|
||||
|
||||
; quand on arrive là, le drive tourne, x = 60 (si slot 6)
|
||||
|
||||
JMP .Init
|
||||
|
||||
DEC OffHi ;
|
||||
.boucle
|
||||
LDA OffHi
|
||||
CMP #OffMin ; on est au bout ?
|
||||
BEQ .FIN
|
||||
STA $27
|
||||
LDY nbSector ; nb Secteur
|
||||
LDA TableInter,Y
|
||||
STA $3D
|
||||
JMP $C65C ; lecture par la routine en ROM carte Disk II (slot 6 only)
|
||||
; le retour se fait par le JMP $801 en sortie de cette routine
|
||||
.FIN
|
||||
JMP $F100 ; saut Boot 2 (MAIN). Voilà c'est fini !
|
||||
|
||||
.Init JSR $FC58 ; HOME
|
||||
LDA $C051 ; Text
|
||||
LDA $C054 ; page 1
|
||||
LDA $C052 ; Mixed Off
|
||||
LDA $C057 ; hires
|
||||
|
||||
LDA $C083
|
||||
LDA $C083 ; write/read to RAM bank2 (Langage Card)
|
||||
|
||||
LDA #$CE ; on écrit DEC nbSector en $801
|
||||
STA $801 ; pour que le JMP $801 en fin de routine
|
||||
LDA #<nbSector ; (en $C605)
|
||||
STA $802 ; fasse une boucle avec le code en $801
|
||||
LDA #>nbSector ;
|
||||
STA $803
|
||||
JMP .boucle
|
||||
|
||||
TableInter ; interleaving
|
||||
!byte 0x00,0x0D,0x0B,0x09,0x07,0x05,0x03,0x01,0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x0F
|
||||
OffHi
|
||||
!byte 0xFF ; offset pour lecture secteur
|
||||
nbSector
|
||||
!byte 0x0F ; nb de sector à lire
|
||||
|
||||
; code executé APRES le saut au BOOT 2 (depuis main)
|
||||
; (routine devant être exécutée en dehors de MAIN car utilisation de la ROM A2)
|
||||
EXECFROMBOOT2
|
||||
|
||||
; détection APPLE II GS/IIE/IIc
|
||||
LDA $C082 ; ROM utilisable entre $D000/$FFFF
|
||||
|
||||
; IIc ?
|
||||
LDX $FBC0 ; détection IIc
|
||||
BNE .tgs ; 0 = IIc / Other = pas IIc
|
||||
; si IIc , on continue mais pas de son Mockingboard
|
||||
STX bIIc ; 0 = IIc / Other = pas IIc
|
||||
JMP .end ; boucle = FIN !
|
||||
|
||||
; IIgs ou IIe ?
|
||||
.tgs STX bIIc ; pas IIc
|
||||
SEC
|
||||
JSR $FE1F ; TEST GS
|
||||
BCS .tIIe ; si Carry, IIE
|
||||
|
||||
; IIGS
|
||||
; on prépare bordure,fond,speed et INT !
|
||||
LDA #$FF
|
||||
STA bMachine ; positionnement type Machine GS
|
||||
|
||||
LDA $C036
|
||||
AND #$7F
|
||||
STA $C036 ; VITESSE LENTE
|
||||
|
||||
LDA $C034 ;
|
||||
AND #$F0
|
||||
STA $C034 ; BORDURE NOIRE
|
||||
|
||||
LDA $C022
|
||||
AND #$F0 ; bit 0-3 à 0 = background noir
|
||||
ORA #$F0 ; bit 7-4 à 1 = text blanc
|
||||
STA $C022 ; background noir/text blanc
|
||||
|
||||
; mise en place vecteur interruption GS
|
||||
LDA #<RoutINTGS
|
||||
STA $3FE
|
||||
LDA #>RoutINTGS
|
||||
STA $3FF
|
||||
|
||||
JMP .tmb
|
||||
|
||||
.tIIe ; IIE
|
||||
LDA #$7F ; Apple IIe
|
||||
sta bMachine ; positionnement type Machine IIe
|
||||
|
||||
; test MB
|
||||
.tmb
|
||||
; MB / SLOT #?
|
||||
LDA #00
|
||||
STA OUT2
|
||||
.bdet LDA #$07 ; on commence en $C7 jusqu'en $C1
|
||||
ORA #$C0 ; -> $Cx
|
||||
STA OUT2+1
|
||||
LDY #04 ; $CX04
|
||||
LDX #02 ; 2 vérifs
|
||||
|
||||
.bt LDA (OUT2),Y ; timer 6522 (Low Order Counter) - attention compte à rebour !
|
||||
STA Temp ; 3 cycles
|
||||
LDA (OUT2),Y ; + 5 cycles = 8 cycles entre les deux accès au timer
|
||||
SEC ;
|
||||
SBC Temp ;
|
||||
CMP #$F8 ; -8 (compte à rebour) ?
|
||||
BNE .Ko
|
||||
DEX
|
||||
BNE .bt ; boucle détection
|
||||
INX ; Mocking OK (X=1)
|
||||
|
||||
.end ; GOOD GUY final !
|
||||
STX bMocking ; save Mockingboard Info (note : si IIc, X = 0)
|
||||
LDA $C083 ;
|
||||
LDA $C083 ; RAM utilisable entre $D000/$FFFF (bank2)
|
||||
JMP DEBUT2 ; retour dans main
|
||||
|
||||
; bad guy slot #
|
||||
.Ko DEC .bdet+1 ; on décrémente le "slot"
|
||||
BNE .bdet ; on boucle de 7 à 1
|
||||
LDX #00
|
||||
JMP .end ; on continue !
|
|
@ -0,0 +1,778 @@
|
|||
; PLASMAGORIA code from French Touch
|
||||
; version 0.09
|
||||
|
||||
; !convtab "a2txt.bin" ;
|
||||
; !sl "mainlabel.a"
|
||||
|
||||
; INCLUDE
|
||||
|
||||
; *= $F100 ; ORG = $F100 (RAM Langage Card)
|
||||
|
||||
; PSEUDO CATALOG Track/SectorDebut-Track/SectorFin (inclus)
|
||||
|
||||
; T00/S00 : BOOT0 ($800) x1
|
||||
; T00/S01-S09 : MAIN ($F100) x8
|
||||
; T00/S0A-S0F : FLOAD ($FA00) x6
|
||||
|
||||
; T01/S00 - T03/Sxx : ROUTINES ($4000) x??
|
||||
|
||||
; T04/S00 - T04/S06 : ZIC ($8000) x07
|
||||
|
||||
|
||||
; CONSTANTES SYSTEME ===================
|
||||
VERTBLANK = $C019 ;
|
||||
|
||||
; CONSTANTES PROGRAMME =================
|
||||
DATADECOMP = $200 ; AUX
|
||||
|
||||
; SOUS-ROUTINES BOOT0
|
||||
EXECFROMBOOT2 = $857 ; sous routine de détection type APPLE II (utilise ROM)
|
||||
|
||||
; SOUS-ROUTINES PROGRAMMES EXTERNES
|
||||
HYPLOD = $FA00 ; routine Fast Load
|
||||
|
||||
PLASMA_DEBUT = $4009
|
||||
|
||||
;======PARAMETRES DU FAST LOAD
|
||||
;-PARAMETRES D'ENTREE
|
||||
PISDEP = $300 ;PISTE DE DEPART
|
||||
SECDEP = $301 ;SECTEUR DE DEPART
|
||||
BUFFER = $302 ;ADRESSE OU L'ON CHARGE
|
||||
TOTSEC = $304 ;TOTAL DES SECTEURS A CHARGER
|
||||
|
||||
DRVNUM = $305 ;1 OU 2
|
||||
ERRMAX = $306 ;MAXIMUM D'ERREURS TOLEREES SUR UN SECTEUR AVANT DE RENDRE LA MAIN
|
||||
DLFLAG = $307 ;1=DELAI AVANT DE LIRE ;0=NON
|
||||
|
||||
;-PARAMETRES ENTREE/SORTIE
|
||||
ICURTRK1 = $310 ;2*PISTE INITIALE DU DRIVE1 A GARNIR POUR LE 1ER APPEL
|
||||
ICURTRK2 = $311 ;2*PISTE INITIALE DU DRIVE2 "
|
||||
|
||||
bAFFICHE = $312
|
||||
BUFFERAFFH= $313 ; adresse du buffer d'affichage
|
||||
BUFFERAFFL= $314 ; haut et bas
|
||||
CARAFF = $315 ; caractère à afficher
|
||||
|
||||
; PAGE ZERO ===========================
|
||||
; adresses fixes
|
||||
;
|
||||
; system
|
||||
bMocking = $08 ; Mockingboard (00 - NOP / 01 - OK)
|
||||
bIIc = $09 ; byte IIc (00 = //c | other = pas //c !)
|
||||
bMachine = $0A ; byte MACHINE ($7F/IIE | $FF/GS)
|
||||
bRefresh = $0B ; byte type NTSC/60Hz - PAL/50Hz (00 = 50HZ | 01 = 60 HZ)
|
||||
|
||||
bitsixset = $0C ; utiliser pour un SLV (set overflow) = $60
|
||||
vblflag = $0D ; utilisée par interruption VBL sur //c
|
||||
|
||||
; general
|
||||
|
||||
;
|
||||
OUT1 = $20 ; +$21
|
||||
OUT2 = $22 ; +$23
|
||||
; -------------------------------------
|
||||
; adresses réutilisées suivant les parties
|
||||
;
|
||||
; decompression LZ4
|
||||
Tmp = $F6
|
||||
token = $F7
|
||||
dest = $F8 ; + $F9
|
||||
src1 = $FA ; + $FB
|
||||
src2 = $FC ; + $FD
|
||||
lenL = $FE
|
||||
lenH = $FF
|
||||
;
|
||||
|
||||
; player YM
|
||||
TempP = $F8
|
||||
|
||||
Beat = $FA
|
||||
Mark = $FB
|
||||
Marker = $FC ; +$FD
|
||||
Mem = $FE ; +$FF
|
||||
|
||||
; -------------------------------------
|
||||
; ======== DEBUT PROGRAMME =========
|
||||
START:
|
||||
JMP EXECFROMBOOT2
|
||||
|
||||
VBLANK:
|
||||
JMP VBLANK_GSE
|
||||
|
||||
DEBUT2:
|
||||
;!zone
|
||||
; ========= DETECT REFRESH ===========
|
||||
DETECTREFRESH:
|
||||
;!zone
|
||||
|
||||
LDA bIIc
|
||||
BEQ DR_LOAD ; si c'est un IIc, on passe à la suite (chargement), le DETECT REFRESH ne marchera de toute façon pas.
|
||||
|
||||
; detection refresh rate (PAL/NTSC)
|
||||
LDA bMachine ;
|
||||
DR_lp1:
|
||||
CMP VERTBLANK
|
||||
Bpl DR_lp1 ; on attend la fin du VBL courant
|
||||
|
||||
LDA bMachine ; 3
|
||||
DR_lp2:
|
||||
CMP VERTBLANK ; 4
|
||||
Bmi DR_lp2 ; 2 => on attend la fin du display courant/début du VBL
|
||||
|
||||
; début VBL
|
||||
|
||||
DR_BP:
|
||||
INC COUNTREF ; 6 ; on incrémente le compteur
|
||||
|
||||
LDX #$09 ;
|
||||
DR_WL1:
|
||||
DEX ;
|
||||
BNE DR_WL1 ; = 46 cycles
|
||||
; + 6 + 3 + 3 + 4 + 3 = 65 !
|
||||
|
||||
LDA bMachine ; 3
|
||||
|
||||
LDA bMachine ; 3
|
||||
CMP VERTBLANK ; 4
|
||||
Bpl DR_BP ; 3 => on boucle tant qu'on est en VBL
|
||||
|
||||
LDA COUNTREF
|
||||
CMP #72 ; >= 72 alors 50 HZ (120*65 cycles de VBL)
|
||||
BCS DR_GO3
|
||||
|
||||
LDA #01 ; 60HZ (VBL = 70x65 cycles)
|
||||
JMP DR_GO4
|
||||
|
||||
DR_GO3:
|
||||
LDA #00 ; 50HZ (VBL = 120x65 cycles)
|
||||
DR_GO4:
|
||||
STA bRefresh
|
||||
|
||||
DR_LOAD:
|
||||
; === CHARGEMENTS =====
|
||||
; initialisation HyperLoad + divers !
|
||||
LDX #00
|
||||
STX ICURTRK1
|
||||
STX bAFFICHE ; on désactive l'affichage lors du chargement (pour l'instant)
|
||||
STX SECDEP ; secteur 00
|
||||
STX BUFFER ; buffer low
|
||||
INX ; 1
|
||||
STX DRVNUM
|
||||
STX DLFLAG
|
||||
STX OUT1
|
||||
|
||||
; chargement ROUTINES
|
||||
STX PISDEP ; piste 01
|
||||
LDA #$40 ; buffer high -> $4000
|
||||
STA BUFFER+1
|
||||
LDA #45 ; nb secteurs
|
||||
STA TOTSEC
|
||||
JSR HYPLOD ; chargement !
|
||||
|
||||
; chargement ZIC
|
||||
LDA #04
|
||||
STA PISDEP ; piste 04
|
||||
LDA #$00
|
||||
STA BUFFER
|
||||
STA SECDEP
|
||||
LDA #$80 ; buffer high -> $8000
|
||||
STA BUFFER+1
|
||||
LDA #7 ; nb secteurs
|
||||
STA TOTSEC
|
||||
JSR HYPLOD ; chargement !
|
||||
|
||||
; =============================
|
||||
LDA bIIc
|
||||
BNE DR_SUITE ; si c'est pas un IIc, on passe à la suite
|
||||
|
||||
; ====== IIC ONLY =============
|
||||
; si c'est un IIc mise en place de l'interruption !
|
||||
LDA #00
|
||||
STA vblflag ; initialisation vblflag pour l'interruption
|
||||
LDA #<VBLANKIIc ; on fixe la routine d'appel au VBLANK
|
||||
STA VBLANK+1 ; sur la routine
|
||||
LDA #>VBLANKIIc ; //c
|
||||
STA VBLANK+2
|
||||
|
||||
sei ; disable interrupts
|
||||
|
||||
lda #<VBLI ; on fixe le vecteur de l'interruption
|
||||
STA $FFFE ; du IIc (VBL)
|
||||
lda #>VBLI ; pour pointer
|
||||
STA $FFFF ; sur notre routine VBLI
|
||||
|
||||
; on active la première interruption pour VBL
|
||||
sta $c079 ; enable IOU access
|
||||
sta $c05b ; enable VBL int (CLI)
|
||||
sta $c078 ; disable IOU access
|
||||
JMP DR_SUITE2
|
||||
; =============================
|
||||
|
||||
DR_SUITE:
|
||||
LDA bMocking
|
||||
BEQ DR_SUITE2 ; s'il n'y a pas de MOCKINGBOARD détectée
|
||||
|
||||
; == PREPARATION MOCKINGBOARD =
|
||||
|
||||
LDA bMachine ; si IIGS
|
||||
BMI DR_INITMB
|
||||
|
||||
; mise en place vecteur IIe
|
||||
; (vecteur GS déjà mis en place dans BOOT)
|
||||
LDA #<INTPLAYERYM
|
||||
STA $FFFE
|
||||
LDA #>INTPLAYERYM
|
||||
STA $FFFF
|
||||
|
||||
DR_INITMB:
|
||||
; init MB (OUT1/OUT2)
|
||||
LDA #$FF
|
||||
LDY #$03
|
||||
STA (OUT2),Y ; STA $C403 ; DDRA1
|
||||
LDY #$83
|
||||
STA (OUT2),Y ; STA $C483 ; DDRA2
|
||||
LDA #$07
|
||||
LDY #$02
|
||||
STA (OUT2),Y ; STA $C402 ; DDRB1
|
||||
LDY #$82
|
||||
STA (OUT2),Y ; STA $C482 ; DDRB2
|
||||
|
||||
; nécessaire ?
|
||||
LDA #$00 ; Set fct "Reset"
|
||||
LDY #$00
|
||||
STA (OUT2),Y ; STA $C400
|
||||
LDY #$80
|
||||
STA (OUT2),Y ; STA $C480
|
||||
LDA #$04 ; Set fct "Inactive"
|
||||
LDY #$00
|
||||
STA (OUT2),Y ; STA $C400
|
||||
LDY #$80
|
||||
STA (OUT2),Y ; STA $C480
|
||||
; ---
|
||||
; nettoyage TIMER
|
||||
|
||||
; ---
|
||||
|
||||
LDA OUT2+1
|
||||
STA OUT1+1 ;
|
||||
STA OFFBIT+2 ; fixe BIT $Cx04 (réinit interruption)
|
||||
; =============================
|
||||
|
||||
DR_SUITE2:
|
||||
; =============================================================================
|
||||
; AFFICHAGE TITRE
|
||||
|
||||
JSR VBLANK
|
||||
LDX #39
|
||||
bAffTitle:
|
||||
LDA Title01,X
|
||||
STA $580,X
|
||||
LDA Title02,X
|
||||
STA $600,X
|
||||
LDA Title03,X
|
||||
STA $680,X
|
||||
LDA Title04,X
|
||||
STA $700,X
|
||||
LDA Title05,X
|
||||
STA $780,X
|
||||
LDA Title06,X
|
||||
STA $428,X
|
||||
LDA Title07,X
|
||||
STA $4A8,X
|
||||
LDA Title08,X
|
||||
STA $528,X
|
||||
LDA Title09,X
|
||||
STA $5A8,X
|
||||
LDA Title10,X
|
||||
STA $628,X
|
||||
LDA Title11,X
|
||||
STA $6A8,X
|
||||
LDA Title12,X
|
||||
STA $728,X
|
||||
LDA Title13,X
|
||||
STA $7A8,X
|
||||
LDA Title14,X
|
||||
STA $450,X
|
||||
LDA Title15,X
|
||||
STA $4D0,X
|
||||
LDA Title16,X
|
||||
STA $550,X
|
||||
LDA Title17,X
|
||||
STA $5D0,X
|
||||
DEX
|
||||
BPL bAffTitle
|
||||
|
||||
; --------------------------------------------------------
|
||||
; effacement PAGE1 HGR
|
||||
; X = $FF
|
||||
INX ; => x =0
|
||||
TXA ; A = 00 (noir en HGR)
|
||||
LDY #32
|
||||
bCleanHGR:
|
||||
offHGR:
|
||||
STA $2000,X
|
||||
DEX
|
||||
BNE bCleanHGR
|
||||
INC offHGR+2
|
||||
DEY
|
||||
BNE bCleanHGR
|
||||
|
||||
; copie P1->P2
|
||||
LDX #00
|
||||
bMoveP1_P2:
|
||||
LDA $400,X
|
||||
STA $800,X
|
||||
LDA $500,X
|
||||
STA $900,X
|
||||
LDA $600,X
|
||||
STA $A00,X
|
||||
LDA $700,X
|
||||
STA $B00,X
|
||||
DEX
|
||||
BNE bMoveP1_P2
|
||||
; =============================================================================
|
||||
; DECOMPRESSION
|
||||
; =============================================================================
|
||||
|
||||
JSR DECOMP
|
||||
STA $C004 ; restore write MAIN Memory
|
||||
|
||||
|
||||
; =============================================================================
|
||||
; INIT INTERRUPTION + DATA
|
||||
; =============================================================================
|
||||
; mise en place de l'interruption
|
||||
SEI ; inhib
|
||||
|
||||
; préparation interruption - TIMER 1 6522
|
||||
LDA #%01000000 ; continuous interrupt / PB7 disabled
|
||||
LDY #$0B
|
||||
STA (OUT2),Y ; STA $C40B ; Auxiliary Control Register
|
||||
|
||||
LDA #%11000000 ;
|
||||
LDY #$0D
|
||||
STA (OUT2),Y ; STA $C40D ; interrupt flag register (Time Out of Timer 1/Int)
|
||||
INY
|
||||
STA (OUT2),Y ; STA $C40E ; interrupt Enable register (Timer 1 + Set)
|
||||
|
||||
; TIMER : 50 Hz = 20 ms = 20 000 microsecond = 20 000 tick environ (1 Mhz d'holorge) = $4E20
|
||||
; calcul fin :
|
||||
; 50 Hz = 20 ms
|
||||
; 1.0205 Mhz = 1020500 cycles par seconde soit 1020.5 cycles par ms
|
||||
; pour 20ms, il faut donc 1020.5*20 = 20410 cycles soit : $4FBA
|
||||
LDA #$BA
|
||||
LDY #04
|
||||
STA (OUT2),Y ; STA $C404 ; T1C-Lower
|
||||
LDA #$4F
|
||||
INY
|
||||
STA (OUT2),Y ; STA $C405 ; T1C-High
|
||||
|
||||
|
||||
; --- initialisation Tables Offsets Data Registres, Offsets Loop, et Table Compression (MAIN)
|
||||
LDX #13 ; registers (0-13)
|
||||
|
||||
; initialisation offset Registre (AUX) + Marker
|
||||
|
||||
STA $C003 ; READ AUX MEMORY
|
||||
; Offsets Registres
|
||||
LDX #14 ; registers [0-13 + marker (14)]
|
||||
|
||||
b2:
|
||||
LDA TableOffsetDataB,X
|
||||
STA Mem
|
||||
CLC
|
||||
ADC #02
|
||||
STA TableOffsetDataB,X
|
||||
LDA TableOffsetDataH,X
|
||||
STA Mem+1
|
||||
ADC #00
|
||||
STA TableOffsetDataH,X
|
||||
LDY #00
|
||||
LDA (Mem),Y
|
||||
STA TableCompteur,X
|
||||
INY
|
||||
LDA (Mem),Y
|
||||
STA TableData,X
|
||||
g2:
|
||||
DEX
|
||||
BPL b2
|
||||
; ----------------------
|
||||
|
||||
STA $C002 ; READ MAIN MEMORY
|
||||
; ---
|
||||
|
||||
; =============================================================================
|
||||
; BOUCLE PRINCIPALE PLAYING
|
||||
; =============================================================================
|
||||
|
||||
JMP PLASMA_DEBUT
|
||||
|
||||
; =============================================================================
|
||||
|
||||
; =============================================================================
|
||||
; SOUS ROUTINES
|
||||
; =============================================================================
|
||||
; -------------------------------------
|
||||
DECOMP:
|
||||
|
||||
; routine de décompression LZ4
|
||||
; code: XXL and FOX (from Atari Scene)
|
||||
; modified: FT
|
||||
;
|
||||
; dans A - partie haute adresse data compressées
|
||||
|
||||
; init
|
||||
|
||||
LDA #$80
|
||||
STA src2+1
|
||||
LDA #$00 ; commence en $00
|
||||
STA src2
|
||||
LDA #<DATADECOMP
|
||||
STA dest
|
||||
LDA #>DATADECOMP
|
||||
STA dest+1
|
||||
|
||||
LDY #0
|
||||
STY lenH
|
||||
STY lenL
|
||||
|
||||
; init mémoire
|
||||
|
||||
STA $C000 ; 80STOREOFF
|
||||
STA $C002 ; read MAIN Memory
|
||||
STA $C005 ; write AUX Memory
|
||||
STA $C008 ; zero Page = Main
|
||||
|
||||
; -------------------------------------
|
||||
; décomp LZ4 routine
|
||||
; -------------------------------------
|
||||
BP:
|
||||
jsr GET_BYTE
|
||||
sta token
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
beq read_offset ; there is no literal
|
||||
cmp #$0f
|
||||
jsr getLength
|
||||
|
||||
b_literals:
|
||||
jsr GET_BYTE
|
||||
jsr store
|
||||
bne b_literals
|
||||
|
||||
read_offset:
|
||||
jsr GET_BYTE ; offset L
|
||||
tax
|
||||
sec
|
||||
eor #$ff
|
||||
adc dest
|
||||
sta src1
|
||||
txa
|
||||
php
|
||||
jsr GET_BYTE ; offset H
|
||||
plp
|
||||
bne not_done
|
||||
tax
|
||||
beq unlz4_done ; sortie routine !
|
||||
not_done:
|
||||
eor #$ff
|
||||
adc dest+1 ; calcul offset H (absolu)
|
||||
STA src1+1 ; sauvegarde de l'offset après correction hors page $C0 : $C0->$D0 / $D0->$E0
|
||||
LDY #00 ; remise à 0 de Y
|
||||
; c=1
|
||||
lda token
|
||||
and #$0f
|
||||
adc #$03 ; 3+1=4
|
||||
cmp #$13
|
||||
jsr getLength
|
||||
|
||||
b1:
|
||||
STA $C003 ; read AUX Memory
|
||||
lda (src1),Y
|
||||
STA $C002 ; read MAIN Memory
|
||||
INC src1
|
||||
BNE s1
|
||||
TAX
|
||||
INC src1+1
|
||||
LDA src1+1
|
||||
CMP #$C0
|
||||
BEQ sss1
|
||||
ss1:
|
||||
TXA
|
||||
s1:
|
||||
jsr store
|
||||
bne b1
|
||||
jmp BP
|
||||
sss1:
|
||||
LDA #$D0
|
||||
STA src1+1
|
||||
JMP ss1
|
||||
|
||||
store:
|
||||
sta (dest),Y
|
||||
INC dest
|
||||
BEQ s2
|
||||
|
||||
dec lenL
|
||||
beq s2b
|
||||
unlz4_done:
|
||||
rts
|
||||
s2b:
|
||||
dec lenH
|
||||
rts
|
||||
s2:
|
||||
INC dest+1
|
||||
LDA dest+1
|
||||
CMP #$C0
|
||||
BEQ sss2
|
||||
ss2:
|
||||
dec lenL
|
||||
beq s2b
|
||||
rts
|
||||
sss2:
|
||||
LDA #$D0
|
||||
STA dest+1
|
||||
JMP ss2
|
||||
|
||||
|
||||
getLength_next:
|
||||
jsr GET_BYTE
|
||||
tax
|
||||
clc
|
||||
adc lenL
|
||||
bcc s3
|
||||
inc lenH
|
||||
s3:
|
||||
inx
|
||||
|
||||
getLength:
|
||||
sta lenL
|
||||
beq getLength_next
|
||||
tax
|
||||
beq s4
|
||||
inc lenH
|
||||
s4:
|
||||
rts
|
||||
|
||||
GET_BYTE:
|
||||
LDA (src2),Y
|
||||
INC src2
|
||||
BEQ s5
|
||||
RTS
|
||||
|
||||
s5:
|
||||
INC src2+1
|
||||
RTS
|
||||
|
||||
; =============================================================================
|
||||
; =============================================================================
|
||||
INTPLAYERYM: ; interruption toutes les 20ms (50Hz)
|
||||
|
||||
;
|
||||
PHP ; on sauve les flags
|
||||
PHA ; on sauve A
|
||||
TXA ; on sauve
|
||||
PHA ; X
|
||||
TYA ; on sauve
|
||||
PHA ; Y
|
||||
|
||||
|
||||
LDA OUT1 ; permutation g/d
|
||||
EOR #$80
|
||||
STA OUT1
|
||||
LDA OUT2
|
||||
EOR #$80
|
||||
STA OUT2
|
||||
|
||||
STA $C003 ; read AUX Memory
|
||||
LDY #00
|
||||
|
||||
; remplissage REGISTRES (les 13 premiers)
|
||||
LDX #00
|
||||
|
||||
YM_br1:
|
||||
TXA
|
||||
STA (OUT1),Y ; ORA1 (data)
|
||||
LDA #$07 ; Set fct "Set PSG Reg #"
|
||||
STA (OUT2),Y ; ORB1 (fct)
|
||||
LDA #$04 ; Set fct "Inactive"
|
||||
STA (OUT2),Y ; ORB1 (fct)
|
||||
|
||||
LDA TableData,X
|
||||
STA (OUT1),Y ; ORA1 (data)
|
||||
LDA #$06 ; Set fct "Write DATA"
|
||||
STA (OUT2),Y ; ORB1 (fct)
|
||||
LDA #$04 ; Set fct "Inactive"
|
||||
STA (OUT2),Y ; ORB1 (fct)
|
||||
INX
|
||||
CPX #13
|
||||
BNE YM_br1
|
||||
|
||||
; Registre R13
|
||||
; x = 13
|
||||
LDA TableData,X
|
||||
CMP #$FF ; spécification YM format / shunte si = $FF
|
||||
BEQ YM_shunteR13
|
||||
STA TempP
|
||||
|
||||
TXA
|
||||
STA (OUT1),Y ; ORA1 (data)
|
||||
LDA #$07 ; Set fct "Set PSG Reg #"
|
||||
STA (OUT2),Y ; ORB1 (fct)
|
||||
LDA #$04 ; Set fct "Inactive"
|
||||
STA (OUT2),Y ; ORB1 (fct)
|
||||
|
||||
LDA TempP
|
||||
STA (OUT1),Y ; ORA1 (data)
|
||||
LDA #$06 ; Set fct "Write DATA"
|
||||
STA (OUT2),Y ; ORB1 (fct)
|
||||
LDA #$04 ; Set fct "Inactive"
|
||||
STA (OUT2),Y ; ORB1 (fct)
|
||||
|
||||
YM_shunteR13:
|
||||
; lecture info MARKER Tempo
|
||||
INX
|
||||
; x = 14
|
||||
LDA TableData,X
|
||||
BEQ YM_suite
|
||||
BPL YM_setMark ; si 0x01
|
||||
INC Beat ; si 0x80 (ou 0x81)
|
||||
LSR
|
||||
BCC YM_suite ; si pas 0x81
|
||||
YM_setMark:
|
||||
INC Mark ; si 0x01 (ou 0x81)
|
||||
|
||||
YM_suite:
|
||||
;
|
||||
LDX #14
|
||||
YM_b2:
|
||||
DEC TableCompteur,X
|
||||
BEQ YM_g1
|
||||
YM_g2:
|
||||
DEX
|
||||
BPL YM_b2
|
||||
|
||||
OFFBIT:
|
||||
BIT $C404 ; Clears interrupt (T1CL) pour pouvoir être de nouveau réutilisé!
|
||||
|
||||
YM_finInterrupt:
|
||||
PLA
|
||||
TAY ; on récup Y
|
||||
PLA
|
||||
TAX ; on récup X
|
||||
PLA ; on récup A
|
||||
PLP
|
||||
STA $C002 ; read MAIN Memory
|
||||
RTI ; sortie 1
|
||||
|
||||
YM_g1:
|
||||
LDA TableOffsetDataB,X
|
||||
STA Mem
|
||||
CLC
|
||||
ADC #02
|
||||
STA TableOffsetDataB,X
|
||||
LDA TableOffsetDataH,X
|
||||
STA Mem+1
|
||||
ADC #00
|
||||
STA TableOffsetDataH,X
|
||||
LDY #00
|
||||
LDA (Mem),Y
|
||||
BEQ YM_endframes
|
||||
STA TableCompteur,X
|
||||
INY
|
||||
LDA (Mem),Y
|
||||
STA TableData,X
|
||||
JMP YM_g2
|
||||
|
||||
YM_endframes:
|
||||
; on coupe le son
|
||||
|
||||
LDA #01 ; FIN !
|
||||
STA Mark
|
||||
|
||||
|
||||
JMP YM_finInterrupt
|
||||
|
||||
; ==============================================================================
|
||||
; SOUS ROUTINES
|
||||
; ==============================================================================
|
||||
VBLI: ; routine executé lors de l'interruption VBL de la Mouse Rom d'un IIc
|
||||
|
||||
; on réactive l'interruption
|
||||
sta $c079 ; enable IOU access
|
||||
sta $c05b ; enable VBL int
|
||||
sta $c078 ; disable IOU access
|
||||
; on fixe le flag
|
||||
LDA #$80
|
||||
STA vblflag ; set hibit
|
||||
RTI
|
||||
; =============================================================================
|
||||
VBLANKIIc: ; code from Prince Of Persia Source (Jordan Mechner - 1989)
|
||||
|
||||
cli ; enable interrupts
|
||||
|
||||
VB_l1:
|
||||
bit vblflag
|
||||
bpl VB_l1 ; wait for vblflag = 1
|
||||
lsr vblflag ;...& set vblflag = 0
|
||||
|
||||
sei
|
||||
rts
|
||||
; =============================================================================
|
||||
VBLANK_GSE:
|
||||
|
||||
LDA bMachine
|
||||
VG_LVBL1:
|
||||
CMP VERTBLANK
|
||||
BPL VG_LVBL1 ; attend fin vbl courant
|
||||
|
||||
;LDA bMachine
|
||||
VG_LVBL2:
|
||||
CMP VERTBLANK
|
||||
BMI VG_LVBL2 ; attend fin display
|
||||
; début VBL
|
||||
RTS
|
||||
; ============================================================================
|
||||
; offset début data 14 registres + marker
|
||||
TableOffsetDataB: .byte $00,$F3,$F8,$4F,$98,$7B,$A4,$97,$B0,$C3,$34,$CB,$0E,$37,$A4 ; <- marker
|
||||
TableOffsetDataH: .byte $02,$1F,$24,$33,$33,$54,$54,$58,$5C,$63,$6B,$71,$72,$72,$72
|
||||
|
||||
TableCompteur:
|
||||
;!fill 15,00
|
||||
.byte $00,$00,$00,$00,$00,$00,$00,$00
|
||||
.byte $00,$00,$00,$00,$00,$00,$00
|
||||
|
||||
TableData:
|
||||
;!fill 15,00
|
||||
.byte $00,$00,$00,$00,$00,$00,$00,$00
|
||||
.byte $00,$00,$00,$00,$00,$00,$00
|
||||
COUNTREF: .byte 0
|
||||
; ============================================================================
|
||||
; attention à l'alignement
|
||||
;..............0000000000111111111122222222223333333333
|
||||
;..............0123456789012345678901234567890123456789
|
||||
Title01: .byte " _____ ____ ___ ____ __ __ __ "
|
||||
Title02: .byte "| | \ / _| \ / | | | "
|
||||
Title03: .byte "| __| D )/ <_| _ | / /| | | "
|
||||
;!align 255,0
|
||||
.align 256
|
||||
Title04: .byte "| |_ | /| _| | |/ / | _ | "
|
||||
Title05: .byte "| _>| \| <_| | / \_| | | "
|
||||
Title06: .byte "| | | . \ | | \ | | | "
|
||||
Title07: .byte "|__| |__|\_|_____|__|__|\____|__|__| "
|
||||
Title08: .byte " __ __ ___ _____ ____ __ "
|
||||
Title09: .byte " /__)/__)(_ ( (_ /| )/ ( "
|
||||
.align 256
|
||||
;!align 255,0
|
||||
Title10: .byte " / / ( (____)(__/ |/( __) "
|
||||
Title11: .byte " ______ ___ __ __ __ __ __ "
|
||||
Title12: .byte " | |/ \| | | / | | |"
|
||||
Title13: .byte " | | | | | / /| | |"
|
||||
Title14: .byte " |_| |_| O | | |/ / | _ |"
|
||||
Title15: .byte " | | | | : / \_| | |"
|
||||
.align 256
|
||||
;!align 255,0
|
||||
Title16: .byte " | | | | \ | | |"
|
||||
Title17: .byte " |__| \___/ \__,_|\____|__|__|"
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,103 @@
|
|||
;; HARDWARE LOCATIONS
|
||||
|
||||
KEYPRESS = $C000
|
||||
KEYRESET = $C010
|
||||
|
||||
;; SOFT SWITCHES
|
||||
CLR80COL = $C000 ; PAGE0/PAGE1 normal
|
||||
SET80COL = $C001 ; PAGE0/PAGE1 switches PAGE0 in Aux instead
|
||||
EIGHTYCOLOFF = $C00C
|
||||
EIGHTYCOLON = $C00D
|
||||
TBCOLOR = $C022 ; IIgs text foreground / background colors
|
||||
NEWVIDEO = $C029 ; IIgs graphics modes
|
||||
SPEAKER = $C030
|
||||
CLOCKCTL = $C034 ; bits 0-3 are IIgs border color
|
||||
SET_GR = $C050
|
||||
SET_TEXT = $C051
|
||||
FULLGR = $C052
|
||||
TEXTGR = $C053
|
||||
PAGE0 = $C054
|
||||
PAGE1 = $C055
|
||||
LORES = $C056 ; Enable LORES graphics
|
||||
HIRES = $C057 ; Enable HIRES graphics
|
||||
AN3 = $C05E ; Annunciator 3
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
PADDLE_BUTTON0 = $C061
|
||||
PADDLE_BUTTON1 = $C062
|
||||
PADDL0 = $C064
|
||||
PTRIG = $C070
|
||||
|
||||
;; BASIC ROUTINES
|
||||
|
||||
NORMAL = $F273
|
||||
|
||||
;; MONITOR 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
|
||||
VLINE = $F828 ;; VLINE A,$2D at Y
|
||||
CLRSCR = $F832 ;; Clear low-res screen
|
||||
CLRTOP = $F836 ;; clear only top of low-res screen
|
||||
GBASCALC= $F847 ;; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear)
|
||||
SETCOL = $F864 ;; COLOR=A
|
||||
ROM_TEXT2COPY = $F962 ;; iigs
|
||||
SETTXT = $FB36
|
||||
SETGR = $FB40
|
||||
TABV = $FB5B ;; VTAB to A
|
||||
ROM_MACHINEID = $FBB3 ;; iigs
|
||||
BELL = $FBDD ;; ring the bell
|
||||
BASCALC = $FBC1 ;;
|
||||
VTAB = $FC22 ;; VTAB to CV
|
||||
HOME = $FC58 ;; Clear the text screen
|
||||
WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us
|
||||
CROUT1 = $FD8B
|
||||
SETINV = $FE80 ;; INVERSE
|
||||
SETNORM = $FE84 ;; NORMAL
|
||||
COUT = $FDED ;; output A to screen
|
||||
COUT1 = $FDF0 ;; output A to screen
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
COLOR_BLACK = 0
|
||||
COLOR_RED = 1
|
||||
COLOR_DARKBLUE = 2
|
||||
COLOR_PURPLE = 3
|
||||
COLOR_DARKGREEN = 4
|
||||
COLOR_GREY = 5
|
||||
COLOR_MEDIUMBLUE = 6
|
||||
COLOR_LIGHTBLUE = 7
|
||||
COLOR_BROWN = 8
|
||||
COLOR_ORANGE = 9
|
||||
COLOR_GREY2 = 10
|
||||
COLOR_PINK = 11
|
||||
COLOR_LIGHTGREEN = 12
|
||||
COLOR_YELLOW = 13
|
||||
COLOR_AQUA = 14
|
||||
COLOR_WHITE = 15
|
||||
|
||||
COLOR_BOTH_BLACK = $00
|
||||
COLOR_BOTH_RED = $11
|
||||
COLOR_BOTH_DARKBLUE = $22
|
||||
COLOR_BOTH_DARKGREEN = $44
|
||||
COLOR_BOTH_GREY = $55
|
||||
COLOR_BOTH_MEDIUMBLUE = $66
|
||||
COLOR_BOTH_LIGHTBLUE = $77
|
||||
COLOR_BOTH_BROWN = $88
|
||||
COLOR_BOTH_ORANGE = $99
|
||||
COLOR_BOTH_PINK = $BB
|
||||
COLOR_BOTH_LIGHTGREEN = $CC
|
||||
COLOR_BOTH_YELLOW = $DD
|
||||
COLOR_BOTH_AQUA = $EE
|
||||
COLOR_BOTH_WHITE = $FF
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
5 HOME
|
||||
10 PRINT CHR$(4)"BRUN PLASMAG"
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue