Code : Tout sélectionner
/*--------------------------------------------------------------*
* Compilé avec C6809 v0.83 *
*--------------------------------------------------------------*
* Fichier source : elvisliv.ass
* Fichier destination : ELVISLIV.BIN
* Contenu :
* Main 0:ELVISLIV.ASM 3270
* Include 0:INTRO.ASM 3224
* Include 0:DISK.ASM 4279
* Include 0:EXO.ASM 3291
*--------------------------------------------------------------*/
Macro Pass
Pass1
Pass2
2 ***************************************
3 * Compo pour la ForEver Party 14
4 * Theme: Elvis Lives!
5 *
6 * Idee: slide show
7 * Categorie: demo
8 * Auteur: Samuel Devulder, Mars 2013
9 ***************************************
10
11 9700 org $9700
12
13 0000 DBGD7 set 0
14 0000 DBGEXO set 0
15
16 ***************************************
17 * boucle:
18 * REPEAT
19 * ....
20 * WHILE condition
21 ***************************************
22 REPEAT macro
23 loop set *
24 endm
25 WHILE macro
26 b\0 loop
27 endm
28
29 ***************************************
30 * variable dans code auto-modifiable
31 *
32 * VAR1 opcode,val,label ;8 bits
33 * VAR2 opcode,val,label ;16 bits
34 ***************************************
35 VAR1 macro
36 \0 \1
37 \2 set *-1
38 endm
39 VAR2 macro
40 \0 \1
41 \2 set *-2
42 endm
43
44 6027 TIMEPT equ $6027
45 6019 STATUS equ $6019
46
47 ***************************************
48 * Alignement sur une page
49 ***************************************
50 DPALGN macro
51 ALIGNX set *-ALIGNX
52 ifne \0
53 org ((\0+255)<-8<8)+(*-\0)
54 else
55 org (*+255)<-8<8
56 endc
57 ALIGNX set *-ALIGNX
58 endm
59 0000 ALIGNX set 0
60
61
(62) Unused Symbol
62 9700 INI
63 4+1 9700 32 8C FC ini leas *-1,pcr
64 8 9703 BD 97AD jsr initmr
65 8 9706 BD 9800 jsr intro
66 8 9709 BD 970E lp jsr alldrv
67 3 970C 20 FB bra lp
68 **************************************
69 * Scan tous les lecteur et appelle
70 * allcat
71 **************************************
72 60 setdp $60
73 5+3 970E 34 0E alldrv pshs dp,d
74 3 9710 CC 0060 ldd #$60
75 6 9713 1F 9B tfr b,dp
23 9715 loop set *
77 4 9715 97 49 sta <DKDRV
78 6 9717 0F EE clr <DKFAT+1
79 6 9719 0F EA clr <DKCAT+1
80 2 971B C6 10 ldb #$10 ; et pas 10
81 4 971D D7 48 stb <DKOPC
82 8 971F BD E004 jsr DKCOM
83 2 9722 C6 01 ldb #1
84 4 9724 D7 48 stb <DKOPC
85 8 9726 BD E004 jsr DKCOM
86 3 9729 25 0D bcs nxtdrv
87 6 972B 0F EE clr <DKFAT+1
88 6 972D 0F EA clr <DKCAT+1
89 2 972F C6 10 ldb #$10
90 4 9731 D7 48 stb <DKOPC
91 8 9733 BD E004 jsr DKCOM
92 7 9736 8D 07 bsr allcat
93 2 9738 4C nxtdrv inca
94 2 9739 81 04 cmpa #4
26 3 973B 26 D8 bne loop
96 5+5 973D 35 8E puls dp,d,pc
97 ***************************************
98 * Appelle "affiche" sur tous les
99 * fichiers du catalogue du disk
100 * courant.
101 ***************************************
102 5+4 973F 34 16 allcat pshs d,x
103 2 9741 86 03 lda #3
23 9743 loop set *
105 4 9743 97 4C sta <DKSEC
106 3 9745 8E 0014 ldx #20
107 5 9748 9F 4A stx <DKTRK
108 3 974A 8E 9E90 ldx #iocat
109 5 974D 9F 4F stx <DKBUF
110 2 974F C6 02 ldb #2
111 4 9751 D7 48 stb <DKOPC
112 8 9753 BD E004 jsr DKCOM
113 3 9756 25 53 bcs endcat
114 4+0 9758 E6 84 allfil ldb ,x
115 3 975A 27 42 beq nxtfil
116 2 975C C1 FF cmpb #-1
117 3 975E 27 4B beq endcat
118 4+1 9760 E6 08 ldb 8,x
119 2 9762 C4 DF andb #255-32 ; toupper
120 2 9764 C1 58 cmpb #$58 ; X
121 3 9766 26 36 bne nxtfil
122 4+1 9768 E6 09 ldb 9,x
123 2 976A C4 DF andb #255-32 ; toupper
124 2 976C C1 4D cmpb #$4D ; M
125 3 976E 26 2E bne nxtfil
126 4+1 9770 E6 0A ldb 10,x
127 2 9772 C4 DF andb #255-32 ; toupper
128 2 9774 C1 50 cmpb #$50 ; P
129 3 9776 26 26 bne nxtfil
(130) Unused Symbol
130 5+1 9778 34 02 CALL pshs a
131 2 977A 4F clra
132 2 977B 5F clrb
133 6 977C FD 97D2 std timer ; timer=0
134 8 977F BD 98F5 jsr affiche
135
136 * attente
137 8 9782 BD E806 wait jsr $E806
138 3 9785 24 0C bcc notkbd
139 2 9787 C1 03 cmpb #3
140 3 9789 26 04 bne notbrk
141 3+3 978B 6E 9F FFFE jmp [$FFFE]
142 2 978F C1 20 notbrk cmpb #32
143 3 9791 27 09 beq timout
144 6 9793 FC 97D2 notkbd ldd timer
145 5 9796 1083 0096 cmpd #150 ; 15 secs
146 3 979A 25 E6 blo wait
147 5+1 979C 35 02 timout puls a
148 4+1 979E 30 88 20 nxtfil leax 32,x
149 4 97A1 8C 9F90 cmpx #iocat+256
150 3 97A4 26 B2 bne allfil
151 2 97A6 4C inca
152 2 97A7 81 11 cmpa #17
26 3 97A9 26 98 bNE loop
154 5+6 97AB 35 96 endcat puls d,x,pc
155
156 **************************************
157 * interruption timer
158 E7C5 TCR equ $E7C5 ; reg cont timer
159 E7C6 TMSB equ $E7C6 ; compteur timer
160 3 97AD CC 97C6 initmr ldd #tmrint
161 5 97B0 DD 27 std TIMEPT
162 4 97B2 96 19 lda STATUS
163 2 97B4 8A 20 ora #32
164 4 97B6 97 19 sta STATUS
165 3 97B8 CC 30D3 ldd #12499 ; init timer
166 6 97BB FD E7C6 std TMSB
167 2 97BE 86 46 lda #$46
168 5 97C0 B7 E7C5 sta TCR
169 2 97C3 1C AF andcc #255-$50
170 5 97C5 39 rts
171 6 97C6 FC 97D2 tmrint ldd timer
172 4 97C9 C3 0001 addd #1
173 6 97CC FD 97D2 std timer
174 4 97CF 7E E830 jmp $E830
175 97D2 0000 timer fdb 0
176 00 setdp 0
177
194 includ INTRO
51 97D4 ALIGNX set *-ALIGNX
52 ifne 0
53 org ((0+255)<-8<8)+(*-0)
54 else
55 9800 org (*+255)<-8<8
56 endc
57 002C ALIGNX set *-ALIGNX
196 ***************************************
197 * Intro
198 ***************************************
199 3 9800 8E 9833 intro ldx #intdat ; ecran noir
23 9803 loop set *
201 4+2 9803 E6 80 ldb ,x+
202 8 9805 BD E803 jsr $E803
26 3 9808 26 F9 bne loop
204 7 980A 7F 6049 clr DKDRV ; drive 0
205 2 980D C6 30 ldb #48 ; charge les intro>>
206 4+1 980F E7 04 stb 4,x
207 8 9811 BD 99A5 jsr d7open
208 3 9814 CE 9F90 ldu #RAMA
209 8 9817 BD 9B00 jsr decomp
210 2 981A 5C incb
211 4+1 981B E7 04 stb 4,x
212 8 981D BD 99A5 jsr d7open
213 3 9820 CE BED0 ldu #RAMB
214 8 9823 BD 9B00 jsr decomp
215
216 3 9826 CE 9F90 ldu #RAMA
217 8 9829 BD 984C jsr appear
218 3 982C CE BED0 ldu #RAMB
219 8 982F BD 984C jsr appear
220 5 9832 39 rts
221 9833 1B 40 intdat fcb $1B,$40 ; forme=7
222 9835 1B 50 fcb $1B,$50 ; fond=0
223 9837 1B 60 fcb $1B,$60 ; tour=0
224 9839 14 fcb $14 ; curseur off
225 983A 0C fcb $c ; cls
226 983B 1B 47 fcb $1B,$47 ; forme=7
227 983D 0C fcb $c
228 983E 1B 68 fcb $1B,$68 ; ecriture forme s>>
229 9840 00 fcb 0
230 9841 49 4E 54 52 fcc /INTRO XXX/
9845 4F 20 20 20
9849 58 58 58
231 ***************************************
232 * fait apparaitre progressivement
233 * l'image point<E9>e par U dans la ram
234 * video
235 ***************************************
236 2 984C 86 3F appear lda #63
23 984E loop set *
238 7 984E 8D 6D bsr dith
239 7 9850 8D 1D bsr disp
240 2 9852 4A deca
26 3 9853 2C F9 bge loop
242 5+3 9855 34 14 pshs x,b ; pause
243 2 9857 C6 04 ldb #4
244 3 9859 8E 0000 ldx #0
23 985C loop set *
246 4+1 985C 30 1F leax -1,x
26 3 985E 26 FC bne loop
248 2 9860 5A decb
26 3 9861 26 F9 bne loop
250 5+3 9863 35 14 puls x,b
251 2 9865 86 3F lda #63
23 9867 loop set *
253 7 9867 8D 54 bsr dith
254 7 9869 8D 04 bsr disp
255 2 986B 4A deca
26 3 986C 2C F9 bge loop
257 5 986E 39 rts
258
259 5+8 986F 34 76 disp pshs d,x,y,u
260 2 9871 C6 07 ldb #7
261 5 9873 F0 98E9 subb dith3a+1
262 3 9876 8E 98B5 ldx #mask
263 3 9879 3A abx
264 2 987A 86 28 lda #40
265 11 987C 3D mul
266 4+4 987D 33 CB leau d,u
267 2 987F 8B 40 adda #$40
268 6 9881 1F 02 tfr d,y
269 4+0 9883 A6 84 lda ,x
270 5 9885 B7 9896 sta disp5+3
271 5 9888 B7 9898 sta disp5+5
272 4+1 988B 30 A8 28 leax 40,y
273 6 988E BF 989C stx disp6+1
274 4+0 9891 30 A4 leax ,y
275 5+2 9893 37 06 disp5 pulu d
276 2 9895 84 00 anda #0
277 2 9897 C4 00 andb #0
278 5+3 9899 ED 81 std ,x++
279 4 989B 8C 0000 disp6 cmpx #0
280 3 989E 26 F3 bne disp5
281 4+4 98A0 33 C9 0118 leau 40*7,u
282 4+4 98A4 30 89 0140 leax 40*8,x
283 6 98A8 BF 989C stx disp6+1
284 4+1 98AB 30 88 D8 leax -40,x
285 4 98AE 8C 5F40 cmpx #$5F40
286 3 98B1 23 E0 bls disp5
287 5+10 98B3 35 F6 puls d,x,y,u,pc
288
289 98B5 00 00 00 00 mask fcb 0,0,0,0,0,0,0,0
98B9 00 00 00 00
290
291 5+6 98BD 34 56 dith pshs d,x,u
292 3 98BF 8E 98E9 ldx #dith3a+1
293 3 98C2 CE 98B5 ldu #mask
294 2 98C5 5F clrb
295 2 98C6 48 lsla
296 2 98C7 84 AA anda #$AA
297 4+0 98C9 A8 E4 eora ,s
298 2 98CB 44 lsra
299 2 98CC 59 rolb
300 6+0 98CD 6F 84 clr ,x
301 2 98CF 44 lsra
302 6+0 98D0 69 84 rol ,x
303 2 98D2 44 lsra
304 2 98D3 59 rolb
305 2 98D4 44 lsra
306 6+0 98D5 69 84 rol ,x
307 2 98D7 44 lsra
308 2 98D8 59 rolb
309 2 98D9 44 lsra
310 6+0 98DA 69 84 rol ,x
311 6+1 98DC 6F 04 clr 4,x
312 2 98DE 43 coma
313 6+1 98DF 69 04 dith2 rol 4,x
314 2 98E1 5A decb
315 3 98E2 2C FB bge dith2
316 2 98E4 C6 07 ldb #7
317 4+0 98E6 A6 C4 dith3 lda ,u
318 2 98E8 C1 00 dith3a cmpb #00
319 3 98EA 26 02 bne dith4
320 2 98EC 88 01 eora #1
321 4+2 98EE A7 C0 dith4 sta ,u+
322 2 98F0 5A decb
323 3 98F1 2C F3 bge dith3
324 5+8 98F3 35 D6 puls d,x,u,pc
325 ***************************************
326 * Affiche le fichier pointe par X
327 ***************************************
328 98F5 affiche
329 5+8 98F5 34 76 pshs d,x,y,u
330
331 8 98F7 BD 99A5 jsr d7open
332
333 3 98FA CE 9F90 ldu #RAMA
334 8 98FD BD 9B00 jsr decomp
335 3 9900 CE BED0 ldu #RAMB
336 8 9903 BD 9B00 jsr decomp
337
338 5 9906 B6 E7C3 lda $E7C3
339 2 9909 8A 01 ora #1
340 5 990B B7 E7C3 sta $E7C3
341
342 3 990E 8E 0000 ldx #$0000
23 9911 loop set *
344 7 9911 8D 1C bsr cpyline
345 4+4 9913 30 89 0140 leax 8*40,x
346 4 9917 8C 1F40 cmpx #$1F40
26 3 991A 25 F5 blo loop
348 4 991C 108E 03E8 ldy #1000
349 4+1 9920 31 3F leay -1,y
350 3 9922 26 FC bne *-2
351 4+4 9924 30 89 E0E8 leax -(200-1)*40,x
352 4 9928 8C 0140 cmpx #8*40
26 3 992B 26 E4 bne loop
354
355 5+10 992D 35 F6 puls d,x,y,u,pc
356
357 992F cpyline
358 5+10 992F 34 7F pshs dp,d,x,y,u,cc
359 2 9931 1A 50 orcc #$50
360 99 setdp cpylin<-8
361 2 9933 C6 99 ldb #cpylin<-8
362 6 9935 1F 9B tfr b,dp
363 4+4 9937 33 89 9F90 leau RAMA,x
364 4+4 993B 30 89 4000 leax $4000,x
365 7 993F 8D 0E bsr cpylin
366 4+4 9941 33 C9 1F40 leau RAMB-RAMA,u
367 7 9945 7A E7C3 dec $E7C3
368 7 9948 8D 05 bsr cpylin
369 7 994A 7C E7C3 inc $E7C3
370 5+12 994D 35 FF puls dp,d,x,y,u,cc,pc
371 5+4 994F 34 50 cpylin pshs x,u
372 6 9951 10DF A1 sts <BAKSP
373 5 9954 9F 5B stx <VIDPTR1
374
375 * clrb
376 * decb
377 * bne *-1
378
379 5+8 9956 37 76 pulu d,x,y,s
380 5 9958 DF 64 stu <RAMPTR1
40 3 995A CE 0000 ldu #0
41 995B VIDPTR1 set *-2
382 4+1 995D 33 48 leau 8,u
383 5 995F DF 6B stu <VIDPTR2
384 5+8 9961 36 76 pshu d,x,y,s
385
40 3 9963 CE 0000 ldu #0
41 9964 RAMPTR1 set *-2
387 5+8 9966 37 76 pulu d,x,y,s
388 5 9968 DF 74 stu <RAMPTR2
40 3 996A CE 0000 ldu #0
41 996B VIDPTR2 set *-2
390 4+1 996D 33 48 leau 8,u
391 5 996F DF 7B stu <VIDPTR3
392 5+8 9971 36 76 pshu d,x,y,s
393
40 3 9973 CE 0000 ldu #0
41 9974 RAMPTR2 set *-2
395 5+8 9976 37 76 pulu d,x,y,s
396 5 9978 DF 84 stu <RAMPTR3
40 3 997A CE 0000 ldu #0
41 997B VIDPTR3 set *-2
398 4+1 997D 33 48 leau 8,u
399 5 997F DF 8B stu <VIDPTR4
400 5+8 9981 36 76 pshu d,x,y,s
401
40 3 9983 CE 0000 ldu #0
41 9984 RAMPTR3 set *-2
403 5+8 9986 37 76 pulu d,x,y,s
404 5 9988 DF 94 stu <RAMPTR4
40 3 998A CE 0000 ldu #0
41 998B VIDPTR4 set *-2
406 4+1 998D 33 48 leau 8,u
407 5 998F DF 99 stu <VIDPTR5
408 5+8 9991 36 76 pshu d,x,y,s
409
40 3 9993 CE 0000 ldu #0
41 9994 RAMPTR4 set *-2
411 5+8 9996 37 76 pulu d,x,y,s
40 3 9998 CE 0000 ldu #0
41 9999 VIDPTR5 set *-2
413 4+1 999B 33 48 leau 8,u
414 5+8 999D 36 76 pshu d,x,y,s
415
40 4 999F 10CE 0000 lds #0
41 99A1 BAKSP set *-2
417 5+6 99A3 35 D0 puls x,u,pc
418 00 setdp 0
419 includ DISK
420 6048 DKOPC equ $6048 ;operation d7
421 6049 DKDRV equ $6049 ;lecteur
422 604A DKTRK equ $604A ;piste (2 ocets)
423 604B DKTRKL equ DKTRK+1
424 604C DKSEC equ $604C ;secteur
425 604E DKSTA equ $604E ;status d7
426 604F DKBUF equ $604F ;buf i/o
427 60E9 DKCAT equ $60E9 ;prt catalogue
428 60E7 DKNAM equ $60E7 ;nom fichier
429 60EB DKTYP equ $60EB ;type fichier (2oct>>
430 60ED DKFAT equ $60ED ;ptr fat
431 60F0 DKMOD equ $60F0 ;mode d'acces
432 60F3 DKFIN equ $60F3 ;dernier bloc
433 60F6 DKBLK equ $60F6 ;1er bloc fichier
434 60F7 DKTDS equ $60F7 ;nb octets dern sec>>
435 60F9 DKIFA equ $60F9 ;secteur fat fichie>>
436 E00D LECFA equ $E00D ;lecture fat
437 E010 RECFI equ $E010 ;recherche fichier
438 E01F CONVB equ $E01F ;converison bloc
439 E004 DKCOM equ $E004 ;$E82A ;commande >>
440
441 **************************************
442 * Ouverture d'un fichier D7
443 * U = nom fichier (1+8+3)
444 * Sortie: Z=0 si erreur
445 **************************************
446 60 setdp $60
447 5+5 99A5 34 1E d7open pshs d,x,dp
448 7 99A7 8D 2C bsr page0
449
450 * ldb ,x+ ; lecteur
451 * subb #'0
452 * stb <DKDRV
453 5 99A9 9F E7 stx <DKNAM ; nom
454
455 3 99AB CC 9C90 ldd #iofat ; fat
456 5 99AE DD ED std <DKFAT
457 2 99B0 4C inca ; iocat
458 5 99B1 DD E9 std <DKCAT
459
460 3 99B3 CC 0200 ldd #$0200
461 5 99B6 DD EB std <DKTYP ; binaire
462 4 99B8 D7 4E stb <DKSTA ; clr err
463 * recherche fat
464 8 99BA BD E00D jsr LECFA
465 8 99BD BD 9A41 jsr d7chk
466
467 * recherche fichier
468 2 99C0 86 01 lda #1
469 4 99C2 97 F0 sta <DKMOD ; acces lecture
470 8 99C4 BD E010 jsr RECFI ; rech. fichier
471 4 99C7 D6 F9 ldb <DKIFA
472 2 99C9 C0 01 subb #1 ; C=1 si 60F9=0
473 7 99CB 8D 74 bsr d7chk
474
475 3 99CD CC 9A49 ldd #load0
476 6 99D0 FD 9A47 std d7redir
477 5+7 99D3 35 9E puls d,x,dp,pc
478 2 99D5 C6 60 page0 ldb #$60
479 6 99D7 1F 9B tfr b,dp
480 5 99D9 39 rts
481 ***************************************
482 * Fait clignoter le tour en attente
483 * de ctrl-c.
484 ***************************************
485 7 99DA 8D F9 guru bsr page0
486 3 99DC CE E803 ldu #$E803 ; affiche
487 3 99DF 8E 9AC1 ldx #errtxt ; guru meditation
488 7 99E2 8D 40 bsr puts
489 4 99E4 96 4E lda <DKSTA
490 7 99E6 8D 43 bsr putx
491 7 99E8 8D 3A bsr puts
492 4+0 99EA A6 E4 lda ,s
493 7 99EC 8D 3D bsr putx
494 4+1 99EE A6 61 lda 1,s
495 7 99F0 8D 39 bsr putx
496 4 99F2 D6 49 ldb <DKDRV
497 4+1 99F4 EB 01 addb 1,x
498 4+1 99F6 E7 01 stb 1,x
499 7 99F8 8D 2A bsr puts
500 2 99FA 86 0B lda #11
501 5 99FC 9E E7 ldx <DKNAM
23 99FE loop set *
503 4+2 99FE E6 80 ldb ,x+
504 7+0 9A00 AD C4 jsr ,u
505 2 9A02 4A deca
26 3 9A03 26 F9 bne loop
507 2 9A05 86 61 lda #$61
508 2 9A07 C6 1B clign ldb #$1B
509 7+0 9A09 AD C4 jsr ,u
510 6 9A0B 1F 89 tfr a,b
511 2 9A0D 88 01 eora #1
512 7+0 9A0F AD C4 jsr ,u
513 3 9A11 8E 07D0 ldx #2000
23 9A14 loop set *
515 7+1 9A14 AD 43 jsr 3,u
516 2 9A16 C1 03 cmpb #3
517 3 9A18 27 06 beq reset
518 4+1 9A1A 30 1F leax -1,x
26 3 9A1C 26 F6 bne loop
520 3 9A1E 20 E7 bra clign
521 3+3 9A20 6E 9F FFFE reset jmp [$FFFE]
522 9A24 puts set *
23 9A24 loop set *
524 4+2 9A24 E6 80 ldb ,x+
525 7+0 9A26 AD C4 jsr ,u
26 3 9A28 26 FA bne loop
527 5 9A2A 39 rts
528 4+2 9A2B A7 E2 putx sta ,-s
529 2 9A2D 44 lsra
530 2 9A2E 44 lsra
531 2 9A2F 44 lsra
532 2 9A30 44 lsra
533 7 9A31 8D 04 bsr hex
534 2 9A33 86 0F lda #15
535 4+2 9A35 A4 E0 anda ,s+
536 2 9A37 8B 90 hex adda #$90
537 2 9A39 19 daa
538 2 9A3A 89 40 adca #$40
539 2 9A3C 19 daa
540 6 9A3D 1F 89 tfr a,b
541 3+0 9A3F 6E C4 jmp ,u
542 3 9A41 25 97 d7chk bcs guru ; erreur?
543 5 9A43 39 rts ; non => retour
544 **************************************
545 * Lecture d'un bit
546 * Retour: C = 0 ou 1
547 * Z = 0 si erreur
548 * (positionne ici pour avoir des
549 * sauts courts)
550 **************************************
551 * Tous les regs sont sauves car les
552 * differentes versions de rom
553 * n'ecrasent pas les memes regs.
554 5+9 9A44 34 7D d7read pshs b,x,y,u,dp,cc
40 4 9A46 7E 99DA jmp guru
41 9A47 d7redir set *-2
556
557 * chargement 1er bloc
558 ** Que vaut A ?
559 * Convertit numero de bloc
560 7 9A49 8D 8A load0 bsr page0
561 8 9A4B BD E01F jsr CONVB ; convertit bloc
562 4 9A4E D7 4B stb <DKTRKL ; init piste
563 5 9A50 9E ED ldx <DKFAT ; ptr FAT
564 4 9A52 D6 F6 ldb <DKBLK ; bloc courant
565 2 9A54 5C incb ; bloc
566 4+1 9A55 E6 85 ldb b,x ; suivant
567 4 9A57 D7 F6 stb <DKBLK ; sauve bloc
568 2 9A59 C1 C0 cmpb #$C0 ; si dernier bloc,
569 3 9A5B 22 02 bhi load1 ; recupere taille
570 2 9A5D C6 08 ldb #8 ; 8 sect a charger
571 2 9A5F C4 0F load1 andb #15 ; isole taille bloc>>
572 4 9A61 97 4C sta <DKSEC ; sauv 1er bloc
573 4 9A63 DB 4C addb <DKSEC ; ajoute depart blo>>
574 2 9A65 5A decb ; ajuste dern bloc
575 4 9A66 D7 F3 stb <DKFIN ; sauv dern bloc
576 * charge les secteurs
577 8 9A68 BD E004 load2 jsr DKCOM
578 7 9A6B 8D D4 bsr d7chk
579 4 9A6D 96 4C lda <DKSEC ; si sect pas
580 4 9A6F 91 F3 cmpa <DKFIN ; secteur max,
581 3 9A71 26 0A bne load3 ; passe
582 4 9A73 96 F6 lda <DKBLK ; si dernier
583 2 9A75 81 C0 cmpa #$C0 ; secteur du
584 3 9A77 22 0A bhi load4 ; fichier,sort
585 7 9A79 8D 16 bsr transf
586 3 9A7B 20 CC bra load0
587 7 9A7D 8D 12 load3 bsr transf
588 6 9A7F 0C 4C inc <DKSEC ; secteur +1
589 3 9A81 20 E5 bra load2
590 * chargement dernier secteur et sortie
591 5 9A83 DC F7 load4 ldd <DKTDS ; taille dern sect
592 3 9A85 27 02 beq load5 ; si 0, sort
593 7 9A87 8D 0D bsr tfr0
594 3 9A89 8E 99DA load5 ldx #guru
595 6 9A8C BF 9A47 stx d7redir
596 5+11 9A8F 35 FD puls b,x,y,u,dp,cc,pc
597 * transfert des donnees
598 4 9A91 D6 58 transf ldb $6058 ; densite
599 2 9A93 53 comb
600 2 9A94 CA 80 orb #$80
601 5 9A96 9E 4F tfr0 ldx <DKBUF ; ptr buf sect
602 6 9A98 BF 9AB4 stx tfrptr
603 3 9A9B 3A abx
604 6 9A9C BF 9AB7 stx tfrmax
605 5+2 9A9F 35 10 puls x
606 6 9AA1 BF 9ABF stx tfrrts
607 3 9AA4 8E 9AB3 ldx #tfr2
608 6 9AA7 BF 9A47 stx d7redir
609 3+0 9AAA 6E 84 jmp ,x
610 9AAC tfr1 set *
611 4+2 9AAC A6 80 lda ,x+
612 6 9AAE BF 9AB4 stx tfrptr
613
614 ifne DBGD7
615 pshs d,u
616 ldu #$E803
617 jsr putx
618 ldb #32
619 jsr ,u
620 VAR2 ldd,#0,CPT
621 addd #1
622 std CPT
623 jsr putx
624 lda CPT+1
625 jsr putx
626 ldb #32
627 jsr ,u
628 puls d,u
629 endc
630
631 5+11 9AB1 35 FD puls b,x,y,u,dp,cc,pc
632 9AB3 tfr2 set *
40 3 9AB3 8E 0000 ldx #0
41 9AB4 tfrptr set *-2
40 4 9AB6 8C 0000 cmpx #0
41 9AB7 tfrmax set *-2
635 3 9AB9 26 F1 bne tfr1
636 * bls tfr1
637 8 9ABB BD 99D5 jsr page0
40 4 9ABE 7E 99DA jmp guru
41 9ABF tfrrts set *-2
639 9AC1 07 errtxt fcb $7
640 9AC2 1B 41 fcb $1B,$41 ; forme=1
641 9AC4 47 75 72 75 fcc /Guru Meditation #/
9AC8 20 4D 65 64
9ACC 69 74 61 74
9AD0 69 6F 6E 20
9AD4 23
642 9AD5 00 fcb 0
643 9AD6 20 24 fcc / $/
644 9AD8 00 fcb 0
645 9AD9 20 30 3A fcc / 0:/
646 9ADC 00 fcb 0
647 00 setdp 0
648 includ EXO
649 * Values used in the switch (index)
650 9ADD 04 02 04 tab1 fcb 4,2,4
651 9AE0 10 30 20 fcb 16,48,32
652
653 ifne DBGEXO
654 get4 pshs d,u,cc
655 ldu #$E803
656 jsr putx
657 lda 2,s
658 jsr putx
659 ldb #32
660 jsr ,u
661 lda bitbuf
662 jsr putx
663 ldb #32
664 jsr ,u
665 puls d,u,cc,pc
666 endc
667
51 9AB7 ALIGNX set *-ALIGNX
52 ifne 0
53 org ((0+255)<-8<8)+(*-0)
54 else
55 9B00 org (*+255)<-8<8
56 endc
57 0049 ALIGNX set *-ALIGNX
669 ***************************************
670 * Decompresse le fichier XMP dans
671 * la mémoire pointee par U
672 ***************************************
673 5+9 9B00 34 7E decomp pshs d,u,x,y,dp
674 9B setdp *<-8
675 2 9B02 C6 9B ldb #*<-8
676 6 9B04 1F 9B tfr b,dp
677
678 3 9B06 CE 9BF4 ldu #biba
679
680 * jsr d7read
681 * stb <bitbuf
682 2 9B09 5F clrb
683 4 9B0A D7 B9 stb <bitbuf
684 2 9B0C 4F nxt clra
685 5+2 9B0D 34 06 pshs a,b
686 2 9B0F C5 0F bitb #$0f
687 3 9B11 26 03 bne skp
688 3 9B13 8E 0001 ldx #1
689 2 9B16 C6 04 skp ldb #4
690 7 9B18 9D B4 jsr <getbits
691 4+2 9B1A E7 C0 stb ,u+
692 2 9B1C 53 comb
693 6+0 9B1D 69 E4 roll rol ,s
694 2 9B1F 49 rola
695 2 9B20 5C incb
696 3 9B21 2B FA bmi roll
697 4+0 9B23 E6 E4 ldb ,s
698 5+3 9B25 AF C1 stx ,u++
699 4+4 9B27 30 8B leax d,x
700 5+2 9B29 35 06 puls a,b
701 2 9B2B 5C incb
702 2 9B2C C1 34 cmpb #52
703 3 9B2E 26 DC bne nxt
704
705 ***************************************
706 * decompression
707 ***************************************
(708)0:EXO.ASM Unused Symbol
708 5+1 9B30 EE 67 go ldu 7,s
709 5 9B32 DF D3 stu <STARTu
710 5 9B34 DF E0 stu <STARTx
711 4+4 9B36 33 C9 1F40 leau 8000,u
712 5 9B3A DF 9C stu <STOPx
713 4+1 9B3C 33 C8 27 leau 39,u
714 2 9B3F C6 01 mloop ldb #1
715 7 9B41 9D B4 jsr <getbits
716 3 9B43 26 15 bne cpy
717 4 9B45 D7 50 stb <idx
718 9B47 8C fcb $8c
719 6 9B48 0C 50 rbl inc <idx
720 2 9B4A 5C incb
721 7 9B4B 9D B4 jsr <getbits
722 3 9B4D 27 F9 beq rbl
723
36 2 9B4F C6 00 ldb #0
37 9B50 idx set *-1
725 2 9B51 C1 10 cmpb #$10
726 3 9B53 27 14 beq fin
727 3 9B55 25 14 blo coffs
728 2 9B57 5A decb
729 7 9B58 9D B4 jsr <getbits
730 ***************************************
731 * Copy litteral
732 ***************************************
733 6 9B5A 1F 02 cpy tfr d,y
734 8 9B5C BD 9A44 cpyl jsr d7read
735 7 9B5F 9D CE jsr <dec_u
736 4+0 9B61 A7 C4 sta ,u
737 4+1 9B63 31 3F leay -1,y
738 3 9B65 26 F5 bne cpyl
739 3 9B67 20 D6 bra mloop
740 5+11 9B69 35 FE fin puls d,u,x,y,dp,pc
741 ***************************************
742 * Compte length
743 ***************************************
744 7 9B6B 9D E9 coffs jsr <cook
745 5+2 9B6D 34 06 pshs d
746 3 9B6F 8E 9ADD ldx #tab1
747 5 9B72 1083 0003 cmpd #$03
748 3 9B76 24 01 bhs scof
749 3 9B78 3A abx
750 7 9B79 9D B2 scof jsr <getbix
751 4+1 9B7B EB 03 addb 3,x
752 7 9B7D 9D E9 jsr <cook
753 5 9B7F DD 88 std <offs
754 5+2 9B81 35 20 puls y
755
756 ***************************************
757 * Copy non litteral
758 ***************************************
(759)0:EXO.ASM Unused Symbol
759 7 9B83 9D CE cpy1 jsr <dec_u
760 4+0 9B85 30 C4 leax ,u
40 3 9B87 CC 0000 ldd #0
41 9B88 offs set *-2
762 ***************************************
763 * X=X+D en mode colonne
764 ***************************************
23 9B8A loop set *
766 4+1 9B8A 30 01 leax 1,x
767 4 9B8C 83 00C8 subd #200
26 3 9B8F 24 F9 bhs loop
769 4+1 9B91 30 1F leax -1,x
770 4 9B93 C3 00C8 addd #200
771 2 9B96 86 28 lda #40
772 11 9B98 3D mul
773 4+4 9B99 30 8B leax d,x
40 4 9B9B 8C 0000 cmpx #0
41 9B9C STOPx set *-2
775 3 9B9E 25 04 blo cpy2
776 4+4 9BA0 30 89 E0C1 leax 1-8000,x
777 4+0 9BA4 A6 84 cpy2 lda ,x
778 4+0 9BA6 A7 C4 sta ,u
779 4+1 9BA8 31 3F leay -1,y
780 3 9BAA 27 93 beq mloop
781 7 9BAC 9D CE jsr <dec_u
782 7 9BAE 9D DC jsr <dec_x
783 3 9BB0 20 F2 bra cpy2
784 ***************************************
785 * getbits : get 0 to 16 bits from
786 * input stream
787 * Input : B = bit count, U points
788 * to input buffer
789 * Output : D = bits
790 * Modifies : D.
791 ***************************************
792 4+0 9BB2 E6 84 getbix ldb ,x
793 9BB4 getbits
794 6+2 9BB4 6F E2 clr ,-s
795 6+2 9BB6 6F E2 clr ,-s
36 2 9BB8 86 00 lda #0
37 9BB9 bitbuf set *-1
797 3 9BBA 20 0A bra get3
798 8 9BBC BD 9A44 get1 jsr d7read
799 2 9BBF 46 get2 rora
800 3 9BC0 27 FA beq get1
801 6+1 9BC2 69 61 rol 1,s
802 6+0 9BC4 69 E4 rol ,s
803 2 9BC6 5A get3 decb
804 3 9BC7 2A F6 bpl get2
805 4 9BC9 97 B9 sta bitbuf
806 5+3 9BCB EC E1 ldd ,s++
807 ifne DBGEXO
808 jsr get4
809 endc
810 5 9BCD 39 rts
811 ***************************************
812 * U=U-1 en mode colonne
813 ***************************************
814 4+1 9BCE 33 C8 D8 dec_u leau -40,u
40 5 9BD1 1183 0000 cmpu #0
41 9BD3 STARTu set *-2
816 3 9BD5 24 04 bhs dec_u1
817 4+4 9BD7 33 C9 1F3F leau 8000-1,u
818 5 9BDB 39 dec_u1 rts
819 ***************************************
820 * X=X-1 en mode colonne
821 ***************************************
822 4+1 9BDC 30 88 D8 dec_x leax -40,x
40 4 9BDF 8C 0000 cmpx #0
41 9BE0 STARTx set *-2
824 3 9BE2 24 04 bhs dec_x1
825 4+4 9BE4 30 89 1F3F leax 8000-1,x
826 5 9BE8 39 dec_x1 rts
827 ***************************************
828 * cook : computes base[index] + readb>>
829 * Input : B = index
830 * Output : D = base[index] + readbits(&>>
831 * Modifies : D,X.
832 ***************************************
833 3 9BE9 8E 9BF4 cook ldx #biba
834 3 9BEC 3A abx
835 2 9BED 58 aslb
836 3 9BEE 3A abx
837 7 9BEF 9D B2 jsr <getbix
838 6+1 9BF1 E3 01 addd 1,x
839 5 9BF3 39 rts
840 00 setdp 0
181 **************************************
182 * buffers
183 **************************************
184 9BF4 biba rmb 156
185 9C90 iofat rmb 256 ; fat
(186) Unused Symbol
186 9D90 iobuf rmb 256 ; buffer io
187 9E90 iocat rmb 256 ; catalogue
188
189 9F90 RAMA rmb 8000
190 BED0 RAMB rmb 8000
191
(192) Unused Symbol
192 DE10 LAST set *
193 9700 end ini
000006 Total Errors
Unused Symbol 62 INI
Unused Symbol 130 CALL pshs a
Unused Symbol 186 iobuf rmb 256 ; buffer io
Unused Symbol 192 LAST set *
Unused Symbol 708 go ldu 7,s
Unused Symbol 759 cpy1 jsr <dec_u
000138 Total Symbols
1x Label 98F5 affiche
4x Set 0049 ALIGNX
1x Label 973F allcat
1x Label 970E alldrv
1x Label 9758 allfil
2x Label 984C appear
1x Set 99A1 BAKSP
2x Label 9BF4 biba
2x Set 9BB9 bitbuf
0x Label 9778 CALL
1x Label 9A07 clign
1x Label 9B6B coffs
1x Equ E01F CONVB
2x Label 9BE9 cook
1x Label 9B5A cpy
0x Label 9B83 cpy1
2x Label 9BA4 cpy2
1x Label 9B5C cpyl
4x Label 994F cpylin
1x Label 992F cpyline
3x Label 9A41 d7chk
3x Label 99A5 d7open
2x Label 9A44 d7read
3x Set 9A47 d7redir
1x Set 0000 DBGD7
2x Set 0000 DBGEXO
4x Label 9B00 decomp
3x Label 9BCE dec_u
1x Label 9BDB dec_u1
1x Label 9BDC dec_x
1x Label 9BE8 dec_x1
2x Label 986F disp
4x Label 9893 disp5
2x Label 989B disp6
2x Label 98BD dith
1x Label 98DF dith2
1x Label 98E6 dith3
2x Label 98E8 dith3a
1x Label 98EE dith4
3x Equ 60F6 DKBLK
2x Equ 604F DKBUF
3x Equ 60E9 DKCAT
5x Equ E004 DKCOM
3x Equ 6049 DKDRV
4x Equ 60ED DKFAT
2x Equ 60F3 DKFIN
1x Equ 60F9 DKIFA
1x Equ 60F0 DKMOD
2x Equ 60E7 DKNAM
4x Equ 6048 DKOPC
5x Equ 604C DKSEC
2x Equ 604E DKSTA
1x Equ 60F7 DKTDS
2x Equ 604A DKTRK
1x Equ 604B DKTRKL
1x Equ 60EB DKTYP
2x Macro 0005 DPALGN
2x Label 97AB endcat
1x Label 9AC1 errtxt
1x Label 9B69 fin
1x Label 9BBC get1
1x Label 9BBF get2
1x Label 9BC6 get3
4x Label 9BB4 getbits
2x Label 9BB2 getbix
0x Label 9B30 go
4x Label 99DA guru
1x Label 9A37 hex
2x Set 9B50 idx
0x Label 9700 INI
1x Label 9700 ini
1x Label 97AD initmr
1x Label 9833 intdat
1x Label 9800 intro
0x Label 9D90 iobuf
2x Label 9E90 iocat
1x Label 9C90 iofat
0x Set DE10 LAST
1x Equ E00D LECFA
2x Label 9A49 load0
1x Label 9A5F load1
1x Label 9A68 load2
1x Label 9A7D load3
1x Label 9A83 load4
1x Label 9A89 load5
13x Set 9B8A loop
1x Label 9709 lp
2x Label 98B5 mask
2x Label 9B3F mloop
1x Label 978F notbrk
1x Label 9793 notkbd
1x Label 9B0C nxt
1x Label 9738 nxtdrv
4x Label 979E nxtfil
1x Set 9B88 offs
4x Label 99D5 page0
3x Set 9A24 puts
3x Label 9A2B putx
5x Label 9F90 RAMA
4x Label BED0 RAMB
1x Set 9964 RAMPTR1
1x Set 9974 RAMPTR2
1x Set 9984 RAMPTR3
1x Set 9994 RAMPTR4
1x Label 9B48 rbl
1x Equ E010 RECFI
11x Macro 0001 REPEAT
1x Label 9A20 reset
1x Label 9B1D roll
1x Label 9B79 scof
1x Label 9B16 skp
1x Set 9BD3 STARTu
1x Set 9BE0 STARTx
2x Equ 6019 STATUS
1x Set 9B9C STOPx
1x Label 9ADD tab1
1x Equ E7C5 TCR
1x Label 9A96 tfr0
1x Set 9AAC tfr1
1x Set 9AB3 tfr2
1x Set 9AB7 tfrmax
2x Set 9AB4 tfrptr
1x Set 9ABF tfrrts
1x Equ 6027 TIMEPT
4x Label 97D2 timer
1x Label 979C timout
1x Label 97C6 tmrint
1x Equ E7C6 TMSB
2x Label 9A91 transf
2x Macro 0003 VAR1
18x Macro 0004 VAR2
1x Set 995B VIDPTR1
1x Set 996B VIDPTR2
1x Set 997B VIDPTR3
1x Set 998B VIDPTR4
1x Set 9999 VIDPTR5
1x Label 9782 wait
13x Macro 0002 WHILE
Ca utilise le timer comme base de temps constant, le clavier, et la lecture sur disk. Tout ce qui a posé problème dans l'ancienne conversion
Bon, voyons les invariants du programmes... La detection d'erreur se fait systématiquement (*) avec un "jsr d7chk". Si C=1 on saute alors à la routine "guru" ($99DA) qui affiche un message d'erreur (hélas perturbé par les couleurs de l'image
), sinon on retourne à l'appellant. L'avantage de cette approche, est qu'on a sur la pile l'adresse qui suit le jsr, et donc on peut savoir d'où l'on vient. C'est fait pour faciliter le débugage.
Très bien, sauf que si je mets un point d'arret sur "guru", je me retrouve avec un SP=$96D3
qui indique qu'on vient de $8800.. Sauf que le code se trouve de $9700 à $DE10. En $8800 il n'y a *rien*
Hum ya un truc totalement anormal là. il est impossible d'atterrir en guru comme ca... C'est le systématiquement ci-dessus (*) qui est faux. En effet, à la fermeture d'un fichier, les accès à d7read (lecture donnée) sont redirigés vers "guru" sans jsr. On est dans cette situation: on a appelé un d7read() hors contexte (après avoir fermé un fichier et avant d'avoir ouvert un autre.) C'est un invariant du programme qui est brisé.
Reste à trouver où il se brise à présent.
C'est la routine de décompression EXOmizer (copie d'un literal) qui est appelé après la fin de fichier. Cela se produit durant la lecture du fichier "xIMG26 xmp" (on devine le nom sur l'écran aussi), qui pour je ne sais pas encore quelle raison (fichier tronqué sur la diskette?), fait planter le programme. Est-ce juste propre à la version SD ou est-ce que cela se fait aussi en FD. Il faudra que je vérifie.
[EDIT] bon je viens de vérifier avec la version SAP/FD de logicielsmoto.com et dcmoto.free.fr. Ca passe sans soucis. Comment la conversion FD->SD peut avoir tronqué un fichier ? Est-ce que la FAT serait perturbée, ou est-ce le fait qu'avec les fichier SD on a 4 diskettes au lieu d'une qui change tout ? Ou alors le fichier n'est pas tronqué et c'est autre chose... Bon il faudra y passer plus de temps.