-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboot.a
204 lines (179 loc) · 7.21 KB
/
boot.a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
; ACME 0.96.4
; boot0 (T0/S0) / boot1 (FLOAD) / boot2 (TITLE/MAIN)
;
; MAD EFFECT 2
; FRENCH TOUCH - 10/2019
;
; ----------------
; release specific revisions:
; 0.10 - Add IntL/IntH setup during BOOT/Refresh DETECTION
; 0.08 - LOAD Picture Title before MAIN
; ---------------
; general revisions:
; 0.02 - Add "KO"
;
!cpu 6502
!convtab "a2txt.bin" ; incorporation table caractère APPLE II (normal) générale
!sl "lbl_boot.txt"
; =============================================================================
; PAGE ZERO
; -------------------------------------
; USED IN ALL PARTS
bRefresh = $01 ; byte REFRESH RATE ($56/50Hz | $06/60Hz)
bSLOT = $02 ; numero SLOT * 0x10
IntL = $03 ; L value for INT delay
IntH = $04 ; H value for INT delay
; FAST LOAD
PISDEP = $0A ; PISTE DE DEPART
SECDEP = $0B ; SECTEUR DE DEPART
BUFFER = $0C ; Buffer LOW+HIGH ; + $0D
TOTSEC = $0E ; TOTAL DES SECTEURS A CHARGER
CURTRK1 = $0F ; piste de départ DRIVE 1 - A INITIALISER A ZERO pour le premier appel !
; -------------------------------------
; PART SPECIFIC
; Temp
OUT2 = $12 ; +$13
Temp = $FF
; =============================================================================
; CONSTANTES SYSTEME
VERTBLANK = $C019 ;
; -------------------------------------
; CONSTANTES
MAIN = $D000
FLOAD = $FC00
; -------------------------------------
*= $800 ; ORG = $800
!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)
; $801/$802/$803
JMP INIT ;
; BOOT 1 (FLOAD)
DEC OffHi ;
LOAD
LDA OffHi
CMP #(>FLOAD-1) ; on est au bout ?
BEQ +
STA $27
LDA nSector ; n Secteur
STA $3D
MODSLOT JMP $C65C ; lecture par la routine en ROM carte Disk II
; le retour se fait par le JMP $801 en sortie de cette routine
; attention utilisation de $26,$27,$2B,$3C,$3D,$40,$41
+ ; LOAD PIC
LDX #$00
STX SECDEP ; secteur
STX CURTRK1
STX BUFFER ; buffer low = $00
LDX #01
STX PISDEP ; piste
LDA #$40
STA BUFFER+1
LDA #32
STA TOTSEC
JSR FLOAD
BIT $C057
BIT $C052
BIT $C054
;BIT $C050
; BOOT 2 (LOAD MAIN)
LDX #03
STX PISDEP ; piste
LDA #>MAIN ;
STA BUFFER+1 ; buffer high = $D00
LDA #17
STA TOTSEC
JSR FLOAD ; chargement
JMP MAIN ; saut Boot 2. Voilà c'est fini !
INIT STX bSLOT ; on sauvegarde le numero du SLOT*0x10
; ---------
; modif adresse routine ROM DISK II suivant slot
TXA
LSR
LSR
LSR
LSR ; $x0 -> $0x
ORA #$C0 ; $0x -> $Cx
STA MODSLOT+2 ; sauve
JSR $FC58 ; HOME (ROM)
; DETECTION A2
LDA $FBB3
CMP #$06 ; IIe/IIc/IIGS = 06
BEQ +
- JMP BADGUY ; sinon II ($38) ou II+ ($EA) => bad guy1
+ ; IIc ?
LDA $FBC0 ; détection IIc
BEQ - ; BADGUY ; 0 = IIc => bad guy2
; IIgs ou IIe ?
SEC
JSR $FE1F ; TEST GS
BCC BADGUY ; si Carry not set IIGS => bad guy3
; DETECTION MB (->OUT2)
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
- 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) ?
BEQ +
DEC bdet+1 ; on décrémente le "slot" pour tester le suivant
BNE bdet ; on boucle de 7 à 1
JMP BADGUY ; on est arrivé au SLOT0 donc pas de MB!
+ DEX
BNE - ; boucle détection (on teste 2 fois)
; DETECTION VBL (->bRefresh)
LDA #$7F ; IIe
- CMP VERTBLANK
BPL - ; attend fin vbl courant
- CMP VERTBLANK
BMI - ; attend fin display courant
-- INC COUNTREF ; 6 ; on incrémente le compteur
LDX #$09 ;
- DEX ;
BNE - ; = 46 cycles
; 6 + 46 + 4 + 3 + 4 + 3 = 65 !
LDA COUNTREF ; 4
LDA #$7F ; 3
CMP VERTBLANK ; 4
BPL -- ; 3 => on boucle tant qu'on est en VBL
LDA COUNTREF
CMP #72 ; >= 72 alors 50 HZ (120*65 cycles de VBL)
BCS +
LDA #06 ; 60HZ (VBL = 70x65 cycles)
LDX #$84 ; 2
LDY #$42 ; NTSC 1 Frame Delay (-2)
;BNE BADGUY ; badguy si 60Hz (à commenter si NTSC OK)
BNE ++ ; always
+ LDA #56 ; 50HZ (VBL = 120x65 cycles)
LDX #$36 ; PAL 1 Frame Delay (-2)
LDY #$4F
++ STA bRefresh
STX IntL
STY IntH
LDA $C083
LDA $C083 ; write/read to RAM bank2 (Langage Card)
LDA #$CE ; on écrit DEC nSector en $801
STA $801 ; pour que le JMP $801 en fin de routine
LDA #<nSector ; en $C605
STA $802 ; fasse une boucle avec le code en $801
LDA #>nSector ;
STA $803
LDX bSLOT ; on récupère le numero du SLOT*$10
JMP LOAD ; chargement FLOAD
BADGUY LDA #$CB
STA $400
LDA #$CF
STA $401
- BNE - ; always -> boucle infinie bad guy
OffHi !byte 0xFF ; offset dernier secteur pour lecture BOOT1 (FLOAD)
nSector !byte 0x04 ; n du dernier sector à lire (ordre inverse) pour BOOT1 (FLOAD)
COUNTREF !byte 0x00 ; compteur routine detect refresh
EOF