Files
micro-sparta-dos/msdos.lst
T
2024-05-02 09:44:37 +02:00

2130 lines
88 KiB
Plaintext

mads 2.1.6 build 65 (4 Jun 23)
Source: msdos.asm
1 ;MICRO SPARTA DOS 4.7
2
3 ; w wersji 4.7 dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami
4 ; "prawo"/"lewo" albo "gora"/"dol" ... ... ale to b.trudne
5 ; ze wzgledu na mozliwosc roznej liczby plikow (stron) w zaleznosci czy wyswietlamy
6 ; dlugie nazwy czy nie - nie da sie tego latwo zliczyc
7
8 ; dodany "Backspace" jako powrot do katalogu wyzej.
9
10 ; w wersji 4.6c zmieniony sposob rozpoznawania wielkosci sektora, dodane czytanie
11 ; bloku PERCOM przy zmianie dysku...
12 ; UWAGA! Bufor na pierwszy sektor ma dalej 128b, bezposrednio za nim jest bufor na sektor
13 ; mapy, ktory moze byc zamazywany w chwili odczytu pierwszego sektora bez problemow.
14
15
16 ; w wersji 4.6b poprawione dwa male bugi i dodane kulturalne wyjscie do DOS (Shift+Esc) ...
17 ; ..... moznaby w tym momencie sprawdzac czy jest w ogole DOS w pamieci, bo bez DOS bedzie SelfTest
18
19 ; w wersji 4.6 wyeliminowane chwilowe przelaczanie na domyslne kolory, różne poprawki procedur,
20 ; żeby więcej gier się uruchamiało (zmiany w resecie i zmiennych systemowych)
21
22 ; w wersji 4.5 obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera
23 ; wyswietlanie "numeru" napedu w zaleznosci jak sie go wybierze (Dn: lub n: - cyfra lub litera)
24
25 ; w wersji 4.4 (niepublikowanej) poprawiony blad. Nie moze byc dwa razy po sobie znacznika dziury w skompresowanej mapie
26 ; czyli dziura max 127 sektorow a nie jak porzednio 254
27 ; dodatkowo zapamietanie (na czas resetu przed czyszczeniem pamieci)
28 ; stanu aktywnych urzadzen PBI i odtworzenie go po resecie (dzieki Drac030)
29
30 ; stan urzadzen na szynie PBI
31 = 0247 PDVMASK = $0247
32
33 ; nowa koncepcja zrobiona:
34
35 ; 1. wywalić turbo 'top-drive'
36
37 ; 2. przerobić loader i menu na obsługę sektorów dow. długości
38
39 ; 3. przepisac czytanie tablicy sektorów indeksowych z loadera do menu:
40 ; a. w menu odczytywane są wszystkie sektory tablicy indeksowej
41 ; b. budowana jest "skompresowana" tablica offsetów w stosunku do pierwszego sektora na nast. zasadzie:
42 ; mamy nast. znaczniki : (nowa koncepcja)
43 ; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) . Opłaci się używać do max 255 sektorów do przeskoczenia.
44 ; 0xxxxxxx -- (0xxxxxxx = ile kolejnych sektorów wczytać)
45 ; 00000000 -- następne 2 bajty to numer kolejnego sektora do odczytania
46 ;
47
48 ; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo
49
50
51 ;START ADDR = 1FFD
52 ;END ADDR = 28C9
53 ;.OPT noList
54 = 000A acktimeout = $a
55 = 0002 readtimeout = 2
56
57
58 = 0318 STACKP = $0318
59 = 0042 CRITIC = $42
60 = 02BD DRETRY = $02BD
61 = 030F CASFLG = $030F
62 = 029C CRETRY = $029C
63
64
65 = 0002 CASINI = $02
66 = 0008 WARMST = $08
67 = 0009 BOOT = $09
68 = 000A DOSVEC = $0a
69 = 000C DOSINI = $0c
70 = 000E APPMHI = $0e
71
72 = 0010 IRQENS = $10
73
74
75 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane)
76
77 ; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku
78 = 0024 InBlockAddr = $24 ; word
79 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci)
80 = 0026 ToBlockEnd = $26 ; word
81 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH
82 = 0028 ToFileEndL = $28
83 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku
84
85 = 0030 CheckSUM = $30
86 = 0031 SecLenUS = $31
87 = 0032 SecBuffer = $32
88 = 0034 CRETRYZ = $34
89 = 0035 TransmitError =$35
90 = 0036 Looperka = $36
91 = 0037 StackCopy = $37
92
93
94 = 0058 SAVMSC = $58
95 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego
96 ; katalog
97 = 00CA CurrentDirBuf = $CA
98 ; adres konca tego bufora (2 bajty)
99 = 00CC CurrentDirBufEnd = $CC
100 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji
101 ; o obrabianym pliku (skok co $17)
102 = 00D0 CurrentFileInfoBuff = $D0
103 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty)
104 = 00D2 DirMapSect = $D2
105 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu
106 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji
107 ; ma byc wyswietlany katalog od poczatku
108 = 00D6 LastFilesPageFlag = $D6
109 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony
110 ; zawiera liczbe widocznych na ekranie plikow (1 bajt)
111 = 00D9 NamesOnScreen = $D9
112 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna
113 ; wczesniej byl 1 bajt w $D6
114 = 00E2 InMapPointer = $E2
115 ; zmienna tymczasowa na ZP (2 bajty)
116 = 00E4 TempZP = $E4
117
118 = 020A VSERIN = $020a
119 = 02C5 COLPF1S = $02c5
120 = 02C6 COLPF2S = $02c6
121 = 02C8 COLBAKS = $02c8
122
123 = 0244 COLDST = $0244
124 = 02E5 MEMTOP = $02e5
125 = 02E7 MEMLO = $02e7
126
127 = 02FC KBCODES = $02fc
128
129 = 0300 DDEVIC = $0300
130 = 0301 DUNIT = $0301
131 = 0302 DCOMND = $0302
132 = 0304 DBUFA = $0304
133 = 0308 DBYT = $0308
134 = 030A DAUX1 = $030a
135 = 030B DAUX2 = $030b
136
137 = 0342 ICCMD = $0342
138 = 0344 ICBUFA = $0344
139 ;ICBUFA+1 = $0345
140 = 0348 ICBUFL = $0348
141 ;ICBUFL+1 = $0349
142 = 034A ICAX1 = $034a
143 = 034B ICAX2 = $034b
144
145 = 03FA GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta
146
147 = D204 AUDF3 = $d204
148 = D206 AUDF4 = $d206
149 = D207 AUDC4 = $d207
150 = D208 AUDCTL = $d208
151 = D20A SKSTRES = $d20a
152 = D20D SEROUT = $D20d
153 = D20D SERIN = $D20d
154 = D20E IRQEN = $D20e
155 = D20E IRQST = $D20e
156
157
158 = D20F SKSTAT = $d20f
159 = D20F SKCTL = $d20f
160
161
162 = D303 PBCTL = $d303
163 = D301 PORTB = $d301
164
165 = D40B VCOUNT = $D40B
166
167 = E456 JCIOMAIN = $e456
168 = E459 JSIOINT = $e459
169 = E471 JTESTROM = $e471
170 = E474 JRESETWM = $e474
171 = E477 JRESETCD = $e477
172
173 org $1FFD
174
175 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura
176 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!!
177 = 084B FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu
178 = 084B TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora)
179
180 START
181 FFFF> 1FFD-2D5F> 4C 9E + JMP FirstRun ;1FFD 4C 70 21
182
183
184 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu
185 ; do wczytania !!!!!!
186
187 2000 movedproc
188 0700 .local loader, $0700
189
190 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000
191 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych
192 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO
193 0700 ToFileEndH
194 0700 00 00 .WO $0000
195 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym
196 0702 8A TXA
197 0703 48 PHA
198 0704 A5 28 LDA ToFileEndL
199 0706 48 PHA
200 0707 A5 3D LDA CompressedMapPos
201 0709 48 PHA
202 070A A5 3E LDA CompressedMapPos+1
203 070C 48 PHA
204 070D 20 97 07 JSR GoInitAddr
205 0710 68 PLA
206 0711 85 3E STA CompressedMapPos+1
207 0713 68 PLA
208 0714 85 3D STA CompressedMapPos
209 0716 68 PLA
210 0717 85 28 STA ToFileEndL
211 0719 68 PLA
212 071A AA TAX
213 071B FileNextBlock ; wczytanie kolejnego bloku binarnego
214 071B 20 8C 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku)
215 071E 25 24 AND InBlockAddr
216 0720 C9 FF CMP #$FF ; jesli oba sa $FF to.....
217 0722 D0 03 BNE FileNoFFFFHead
218 0724 20 8C 07 JSR FileGetBlockStart ; pobranie jeszcze raz
219 0727 FileNoFFFFHead
220 0727 20 CA 07 JSR FileGetByte ; Pobranie adresu konca ladowanego bloku
221 072A E5 24 SBC InBlockAddr ; i wyliczenie jego dlugosci
222 072C 49 FF EOR #$FF ; UWAGA! Dlugosc jest zEORowana z $FFFF
223 072E 85 26 STA ToBlockEnd ; czyli odjeta od $10000
224 0730 08 PHP ; odliczanie ilosci pobranych bajtow jest wiec potem robione
225 0731 20 CA 07 JSR FileGetByte ; przez dodawanie i sprawdzanie czy nie ZERO
226 0734 28 PLP
227 0735 E5 25 SBC InBlockAddr+1
228 0737 49 FF EOR #$FF
229 0739 85 27 STA ToBlockEnd+1
230 073B 38 SEC
231 073C WhatIsIt
232 073C B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y
233 ; ktory tylko wylacza skok !!!
234 073E CE 3C 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!!
235 0741 A5 24 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ
236 0743 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu
237 0746 A5 25 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem
238 0748 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak).
239 074B FileNoFirstBlock
240 074B A9 EB LDA #<Jrts ; do adresu inicjacji wpisanie adresu rozkazu RTS
241 074D 8D E2 02 STA $02E2 ; bo po kazdym bloku odbywa sie tam skok
242 0750 A9 07 LDA #>Jrts ; jesli nie jest to blok z adresem inicjacji
243 0752 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie
244 0755 A0 00 LDY #$00
245 0757 BlockReadLoop ;; petla odczytujaca z pliku blok binarny
246 0757 E6 28 INC ToFileEndL ;; zwiekszenie licznika bajtow w calym pliku i jesli ZERO
247 0759 F0 27 BEQ GoCheckEOF ;; skok do procedury sprawdzajacej dwa starsze jego bajty
248 075B EC B3 07 CPX SecLen ;; sprawdzenie czy juz caly sektor przepisany jesli tak
249 075E D0 08 bne NoNextSector1 ; --
250 0760 AD 4A 08 lda InSectorCountH ; -- obsluga sektorow ponad 256b
251 0763 CD B4 07 cmp SecLen+1 ; --
252 0766 F0 1F BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora
253 0768 NoNextSector1
254 = 076A FileSecBuffHaddr1 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!!
255 0768 BD 4B 08 LDA FileSecBuff,X
256 076B E8 INX
257 076C D0 03 bne InBlockReadLoop ; --
258 076E 20 E1 07 jsr IncrementationXH ; -- obsluga sektorow ponad 256b (ten trik dziala bo tam juz byl RTS :) )
259 0771 InBlockReadLoop
260 0771 91 24 STA (InBlockAddr),Y
261 0773 C8 INY
262 0774 D0 02 BNE label15
263 0776 E6 25 INC InBlockAddr+1
264 0778 label15
265 0778 E6 26 INC ToBlockEnd
266 077A D0 DB BNE BlockReadLoop
267 077C E6 27 INC ToBlockEnd+1
268 077E D0 D7 BNE BlockReadLoop
269 0780 F0 80 BEQ FileInit ; koniec bloku - skok pod adres inicjalizacji
270 0782 GoCheckEOF
271 0782 20 B7 07 JSR CheckEOF ; skok do procedury wspolnej dla pobierania bloku i bajtu
272 0785 B0 EA BCS InBlockReadLoop ;tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli
273 0787 GoGetNextFileSect
274 0787 20 EC 07 JSR GetNextFileSect
275 078A B0 E5 BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli
276 078C FileGetBlockStart
277 078C 20 CA 07 JSR FileGetByte
278 078F 85 24 STA InBlockAddr
279 0791 20 CA 07 JSR FileGetByte
280 0794 85 25 STA InBlockAddr+1
281 0796 60 RTS
282 0797 GoInitAddr
283 0797 6C E2 02 JMP ($02E2)
284 079A GetDataSector
285 079A ReadErrorLoop
286 079A A2 0B LDX #$0B
287 079C SetDCB
288 079C BD AB 07 LDA blokDanychIO_Loader,X
289 079F 9D 00 03 STA DDEVIC,X
290 07A2 CA DEX
291 07A3 10 F7 BPL SetDCB
292 07A5 SioJMP
293 07A5 20 59 E4 JSR JSIOINT
294 07A8 30 F0 BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie
295 07AA 60 RTS
296 07AB blokDanychIO_Loader
297 07AB 31 01 52 40 4B 08 + .BY $31,$01,$52,$40,<FileSecBuff,>FileSecBuff,$0A,$00,$80,$00
298 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100)
299 = 07B3 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700
300 07B5 SectorNumber
301 07B5 00 00 .WO $0000
302 07B7 CheckEOF
303 07B7 EE 00 07 INC ToFileEndH
304 07BA D0 12 BNE NotEOF
305 07BC EE 01 07 INC ToFileEndH+1
306 07BF D0 0D BNE NotEOF
307 07C1 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku
308 07C1 A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu
309 07C3 48 PHA
310 07C4 A9 73 LDA #<(JRESETWM-1)
311 07C6 48 PHA
312 ;WaitLine0
313 ; LDA VCOUNT
314 ; bne WaitLine0
315 07C7 6C E0 02 JMP ($02E0)
316 ; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!!
317 07CA FileGetByte
318 07CA E6 28 INC ToFileEndL
319 07CC F0 E9 BEQ CheckEOF
320 07CE NotEOF
321 07CE EC B3 07 CPX SecLen ;; nie EOF, ale moze koniec sektora
322 07D1 D0 08 bne ByteToACCU ; --
323 07D3 AD 4A 08 lda InSectorCountH ; -- obsluga sektorow ponad 256b
324 07D6 CD B4 07 cmp SecLen+1 ; --
325 07D9 F0 11 BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny
326 07DB ByteToACCU
327 = 07DD FileSecBuffHaddr2 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!!
328 07DB BD 4B 08 LDA FileSecBuff,X ;; pobranie bajtu z pliku do A
329 07DE E8 INX
330 07DF D0 09 bne GoToSec ; --
331 07E1 IncrementationXH ; taki trik - to przypadkiem jest podprogram, wiec mozna tu wskoczyc zamiast zwiekszac liczniki w innym miejscu po raz drugi
332 07E1 EE 4A 08 inc InSectorCountH ; --
333 07E4 EE 6A 07 inc FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b
334 07E7 EE DD 07 inc FileSecBuffHaddr2 ; --
335 07EA GoToSec
336 07EA 38 SEC
337 07EB Jrts
338 07EB 60 RTS
339 ; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!!
340 07EC GetNextFileSect
341 07EC 98 tya
342 07ED 48 pha
343 07EE ReadNextInSequence
344 = 07EF SectorSequenceCount = *+1
345 07EE A9 00 lda #$00 ; to już ma być zainicjowane!!!
346 07F0 F0 0D beq NextMapPosition
347 07F2 CE EF 07 dec SectorSequenceCount
348 07F5 EE B5 07 inc SectorNumber
349 07F8 D0 03 bne noIncDAUX2
350 07FA EE B6 07 inc SectorNumber+1
351 07FD noIncDAUX2
352 07FD D0 30 bne ReadyToRead
353 ;jak jest tutaj to jest błąd...
354 ;powinien być skok do self-testu...
355 07FF NextMapPosition
356 07FF 20 43 08 jsr incCompressedMapPos
357 ;UWAGA! adres w mapie jest zawsze zwiększany o 1
358 ;więc przed uruchomieniem loadera trzeba zainicjować adresem-1
359 0802 A0 00 ldy #0
360 0804 B1 3D lda (CompressedMapPos),y
361 0806 30 07 bmi HowManyToSkip
362 0808 F0 15 beq SetNewStartSector
363 ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji
364 080A 8D EF 07 sta SectorSequenceCount
365 080D D0 DF bne ReadNextInSequence ;zawsze skoczy
366 080F HowManyToSkip
367 080F 29 7F and #%01111111
368 0811 18 clc
369 0812 6D B5 07 adc SectorNumber
370 0815 8D B5 07 sta SectorNumber
371 0818 90 03 bcc noIncDAUX2_v2
372 081A EE B6 07 inc SectorNumber+1
373 081D noIncDAUX2_v2
374 081D D0 10 bne ReadyToRead
375 ;jak jest tutaj to jest błąd...
376 ;powinien być skok do self-testu...
377 081F SetNewStartSector
378 081F 20 43 08 jsr incCompressedMapPos
379 0822 B1 3D lda (CompressedMapPos),y
380 0824 8D B5 07 sta SectorNumber
381 0827 20 43 08 jsr incCompressedMapPos
382 082A B1 3D lda (CompressedMapPos),y
383 082C 8D B6 07 sta SectorNumber+1
384 082F ReadyToRead
385 082F 20 9A 07 JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora
386
387 0832 68 pla
388 0833 A8 tay
389 0834 A9 08 lda #>FileSecBuff ; --
390 0836 8D 6A 07 sta FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b
391 0839 8D DD 07 sta FileSecBuffHaddr2 ; --
392 083C A2 00 LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze
393 083E 8E 4A 08 stx InSectorCountH ; --
394 0841 F0 98 JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc
395
396 0843 incCompressedMapPos
397 0843 E6 3D inc CompressedMapPos
398 0845 D0 02 bne skipIncCompressedMapPos
399 0847 E6 3E inc CompressedMapPos+1
400 0849 skipIncCompressedMapPos
401 0849 60 rts
402 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X
403 ; potrzebny do obslugi sektorow wiekszych od 256b
404 084A InSectorCountH
405 084A 00 .BY $00
406 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700
407 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz
408 ; w tym miejscu potem bedzie bufor
409 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora
410 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania
411 084B zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie
412 084B FirstMapSectorNr
413 084B 00 00 .WO $0000
414 084D LoadStart
415 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP
416 084D AC E7 02 LDY MEMLO
417 0850 AD E8 02 LDA MEMLO+1
418 0853 8D 5A 08 STA InMemClearLoop+2
419 0856 OutMemClearLoop
420 0856 A9 00 LDA #$00
421 0858 InMemClearLoop
422 0858 99 00 09 STA $0900,Y
423 085B C8 INY
424 085C D0 FA BNE InMemClearLoop
425 085E EE 5A 08 INC InMemClearLoop+2
426 0861 AD 5A 08 LDA InMemClearLoop+2
427 0864 CD E6 02 CMP MEMTOP+1
428 0867 90 ED BCC OutMemClearLoop
429 0869 AD E6 02 LDA MEMTOP+1
430 086C 8D 76 08 STA LastMemPageClear+2
431 086F AC E5 02 LDY MEMTOP
432 0872 A9 00 LDA #$00
433 0874 LastMemPageClear
434 0874 99 00 80 STA $8000,Y
435 0877 88 DEY
436 0878 C0 FF CPY #$FF
437 087A D0 F8 BNE LastMemPageClear
438 ; wyczyszczona, wiec ....
439 087C AD 95 08 LDA tempToFileEndL
440 087F 85 28 STA ToFileEndL
441 0881 A9 FF LDA #$FF
442 0883 8D FC 02 STA KBCODES
443 0886 EE 3C 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR)
444 0889 AE B3 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora
445 088C AD B4 07 LDA Seclen+1 ; --
446 088F 8D 4A 08 STA InSectorCountH ; -- obsluga sektorow ponad 256b
447 ;jmp *
448 0892 4C 1B 07 JMP FileNextBlock
449 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku
450 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera
451 0895 tempToFileEndL
452 0895 00 .BY $00
453 .endl
454 2196 JAkieTurbo
455 2196 USmode
456 2196 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed
457 2197 QMEG
458 2197 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG
459 2198 BootDrive
460 2198 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi
461 2199 BootShift
462 2199 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety
463 219A FolderTurbo
464 219A 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT
465 219B NewColors
466 219B 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano
467 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A)
468 219C bin2AsciiHex
469 219C 29 0F AND #$0F
470 219E 09 30 ORA #$30
471 21A0 C9 3A CMP #$3A
472 21A2 90 03 BCC labelka
473 21A4 18 CLC
474 21A5 69 07 ADC #$07
475 21A7 labelka
476 21A7 60 RTS
477 21A8 Edriver
478 21A8 45 3A 9B .BY "E:",$9b
479 21AB EditorOpen
480 ; otwarcie ekranu !!!
481 21AB A2 00 LDX #$00 ; kanal nr 0
482 21AD 20 6F 2B JSR CloseX ; najpierw Zamkniecie Ekranu
483 21B0 30 55 BMI ErrorDisplay
484 21B2 A2 00 LDX #$00 ; kanal nr 0
485 21B4 A9 03 LDA #$03
486 21B6 9D 42 03 STA ICCMD,X
487 21B9 A9 0C LDA #$0C
488 21BB 9D 4A 03 STA ICAX1,X
489 21BE 9D 48 03 STA ICBUFL,X
490 21C1 A9 00 LDA #$00
491 21C3 9D 4B 03 STA ICAX2,X
492 21C6 9D 49 03 STA ICBUFL+1,X
493 21C9 A9 A8 LDA #<Edriver
494 21CB 9D 44 03 STA ICBUFA,X
495 21CE A9 21 LDA #>Edriver
496 21D0 9D 45 03 STA ICBUFA+1,X
497 21D3 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0
498 21D6 30 2F BMI ErrorDisplay
499 21D8 60 RTS
500
501 21D9 mainprog
502 21D9 AD 97 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US
503 21DC 2D 99 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza
504 21DF 8D 96 21 STA USmode
505 21E2 F0 1E BEQ NoUSSpeed
506 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler
507 21E4 A0 35 ldy #<blokDanychIO_GetUSSpeed
508 21E6 A2 29 ldx #>blokDanychIO_GetUSSpeed
509 21E8 20 5B 2B jsr Table2DCB
510 21EB 20 59 E4 jsr JSIOINT ; wysylamy "?"
511 21EE 10 07 bpl USSpeed
512 21F0 A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage
513 21F2 8D 96 21 sta USmode
514 21F5 F0 0B beq NoUSSpeed
515 21F7 USSpeed
516 21F7 A0 02 LDY #$2
517 21F9 USstatprint
518 21F9 B9 97 2C LDA ONtext,y
519 21FC 99 6B 23 STA USstatus,y
520 21FF 88 DEY
521 2200 10 F7 bpl USstatprint
522
523 2202 NoUSSpeed
524 2202 4C 48 22 JMP ReadMainDir
525 2205 Error148
526 2205 A0 94 LDY #$94 ; kod bledu do Y
527 ; wyswietlenie komunikatu o bledzie - kod bledu w Y
528 2207 ErrorDisplay
529 2207 98 TYA
530 2208 48 PHA
531 2209 20 6D 2B JSR Close1
532 220C 68 PLA
533 220D 48 PHA
534 220E 4A LSR
535 220F 4A LSR
536 2210 4A LSR
537 2211 4A LSR
538 2212 20 9C 21 JSR bin2AsciiHex ; 4 starsze bity na HEX
539 2215 8D 2E 22 STA ErrorNumHex
540 2218 68 PLA
541 2219 20 9C 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX
542 221C 8D 2F 22 STA ErrorNumHex+1
543 221F 20 C0 2A JSR PrintXY
544 2222 00 00 .BY $00,$00
545 2224 7D .BY $7d ; kod czyszczenia ekranu
546 2225 45 52 52 4F 52 20 + .BY "ERROR - $"
547 222E ErrorNumHex
548 222E 30 30 00 .BY "00",$00
549 ; czekamy na dowolny klawisz
550 2231 A9 FF LDA #$FF
551 2233 8D FC 02 STA KBCODES
552 2236 WaitKloop
553 2236 AE FC 02 LDX KBCODES
554 2239 E8 INX
555 223A F0 FA BEQ WaitKloop
556 223C 8D FC 02 STA KBCODES ; w A jest $FF
557 ; ------------------
558 ; na wypadek wybrania nieistniejacej stacji
559 ; po bledzie przechodzimy na te z ktorej sie ladowalismy
560 223F AD 98 21 LDA BootDrive
561 ;LDA #1
562 2242 20 12 2C JSR SeTDriveNR
563 ; -----------------
564 2245 4C D9 21 JMP mainprog ; i odpalamy program od nowa
565 2248 ReadMainDir
566 2248 20 3A 2A JSR ReadPERCOM
567 224B A2 2D LDX #>FirstSectorBuff
568 224D A0 00 LDY #<FirstSectorBuff
569 224F 20 6F 2A JSR ReadFirstSect
570 ; Sprawdzenie wersji DOSa pod ktora formatowany byl dysk
571 2252 AD 20 2D LDA FirstSectorBuff+$20
572 2255 C9 11 CMP #$11 ; Sparta DOS 1.1
573 2257 F0 08 BEQ SpartaDisk
574 2259 C9 20 CMP #$20 ; Sparta DOS 2.x 3.x Sparta DOS X 4.1x/4.2x
575 225B F0 04 BEQ SpartaDisk
576 225D C9 21 CMP #$21 ; Nowy format Sparta DOS X >= 4.39 (moga byc sektory wieksze niz 256b)
577 225F D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki
578 2261 SpartaDisk
579 2261 A2 00 LDX #$00
580 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256
581 2263 AD 1F 2D LDA FirstSectorBuff+$1F
582 2266 30 04 BMI Sektor128b
583 2268 AA TAX
584 2269 A9 00 LDA #$00
585 226B E8 INX ; i wyliczenie starszego bajtu
586 226C Sektor128b
587 226C 8D B3 20 STA .adr loader.SecLen ; przed przepisaniem
588 226F 8E B4 20 STX .adr loader.SecLen+1 ; przed przepisaniem
589 ; pokazanie na ekranie
590 2272 BD 94 2C LDA DensityCodes,X
591 2275 8D 47 23 STA DensityDisplay
592 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu
593 2278 AC 09 2D LDY FirstSectorBuff+$09
594 227B AE 0A 2D LDX FirstSectorBuff+$0A
595 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x
596 227E ReadDIR
597 ; ustawienie znacznika wlaczenia Turbo dla katalogu
598 227E A9 01 LDA #$01
599 2280 8D 9A 21 STA FolderTurbo
600 2283 84 D2 STY DirMapSect
601 2285 86 D3 STX DirMapSect+1
602 2287 A9 2F LDA #>DirSectorBuff
603 2289 85 D1 STA CurrentFileInfoBuff+1
604 228B 85 CB STA CurrentDirBuf+1
605 228D A9 80 LDA #<DirSectorBuff
606 228F 85 D0 STA CurrentFileInfoBuff
607 2291 85 CA STA CurrentDirBuf
608 2293 A9 00 LDA #$00
609 2295 8D 9B 21 STA NewColors ; wyzerowanie kolorow tak zeby jak nie bedzie ich w DAT ustawily sie standardowe (akurat mamy 0 w A)
610 2298 85 D4 STA $D4
611 229A 85 D5 STA $D5
612 229C A9 17 LDA #$17
613 229E 20 44 29 JSR label39
614 22A1 A5 D0 LDA CurrentFileInfoBuff
615 22A3 85 CC STA CurrentDirBufEnd
616 22A5 A5 D1 LDA CurrentFileInfoBuff+1
617 22A7 85 CD STA CurrentDirBufEnd+1
618 22A9 A9 00 LDA #$00
619 22AB 85 D7 STA $D7
620 22AD 85 D8 STA $D8
621 22AF A5 CA LDA CurrentDirBuf
622 22B1 85 D0 STA CurrentFileInfoBuff
623 22B3 A5 CB LDA CurrentDirBuf+1
624 22B5 85 D1 STA CurrentFileInfoBuff+1
625 22B7 label46
626 22B7 A5 D1 LDA CurrentFileInfoBuff+1
627 22B9 C5 CD CMP CurrentDirBufEnd+1
628 22BB 90 08 BCC label40
629 22BD D0 71 BNE ToStartOfDir
630 22BF A5 D0 LDA CurrentFileInfoBuff
631 22C1 C5 CC CMP CurrentDirBufEnd
632 22C3 B0 6B BCS ToStartOfDir
633 22C5 label40
634 22C5 A0 00 LDY #$00
635 22C7 B1 D0 LDA (CurrentFileInfoBuff),Y
636 22C9 29 38 AND #$38
637 22CB C9 08 CMP #$08
638 22CD D0 1C BNE label42
639 22CF A0 10 LDY #$10
640 22D1 A2 0A LDX #$0A
641 22D3 label43
642 22D3 B1 D0 LDA (CurrentFileInfoBuff),Y
643 22D5 DD E0 22 CMP ProgName,X
644 22D8 D0 11 BNE label42
645 22DA 88 DEY
646 22DB CA DEX
647 22DC 10 F5 BPL label43
648 22DE 30 19 BMI DATfileFound
649 22E0 ProgName
650 22E0 4D 53 44 4F 53 20 + .BY "MSDOS DAT"
651 22EB label42
652 22EB A5 D0 LDA CurrentFileInfoBuff
653 22ED 18 CLC
654 22EE 69 17 ADC #$17
655 22F0 85 D0 STA CurrentFileInfoBuff
656 22F2 90 02 BCC label45
657 22F4 E6 D1 INC CurrentFileInfoBuff+1
658 22F6 label45
659 22F6 4C B7 22 JMP label46
660 ; znaleziono plik z dlugimi nazwami
661 22F9 DATfileFound
662 ; numer pierwszego sektora mapy sektorow pliku MSDOS.DAT przepisujemy do
663 ; wskaznika aktualnego sektora mapy pliku/katalogu. Dzieki temu przy skoku do procedury czytania
664 ; sektora mapy, przeczyta sie wlasnie ten pierwszy
665 22F9 A0 01 LDY #$01
666 22FB B1 D0 LDA (CurrentFileInfoBuff),Y
667 22FD 85 D2 STA DirMapSect
668 22FF C8 INY
669 2300 B1 D0 LDA (CurrentFileInfoBuff),Y
670 2302 85 D3 STA DirMapSect+1
671 2304 C8 INY
672 2305 B1 D0 LDA (CurrentFileInfoBuff),Y
673 2307 85 D4 STA $D4
674 2309 C8 INY
675 230A B1 D0 LDA (CurrentFileInfoBuff),Y
676 230C 85 D5 STA $D5
677 230E C8 INY
678 230F B1 D0 LDA (CurrentFileInfoBuff),Y
679 2311 F0 06 BEQ label47
680 2313 A9 FF LDA #$FF
681 2315 85 D4 STA $D4
682 2317 85 D5 STA $D5
683 2319 label47
684 2319 A5 CC LDA CurrentDirBufEnd
685 231B 85 D0 STA CurrentFileInfoBuff
686 231D A5 CD LDA CurrentDirBufEnd+1
687 231F 85 D1 STA CurrentFileInfoBuff+1
688 2321 A9 2E LDA #$2E
689 2323 20 44 29 JSR label39
690 2326 A5 D0 LDA CurrentFileInfoBuff
691 2328 85 CE STA $CE
692 232A A5 D1 LDA CurrentFileInfoBuff+1
693 232C 85 CF STA $CF
694 232E E6 D8 INC $D8
695 ; ustawienie wskaznikow dla listy wyswietlanych plikow na poczatek katalogu
696 2330 ToStartOfDir
697 2330 A9 00 LDA #$00
698 2332 85 D6 STA LastFilesPageFlag
699 2334 A5 CA LDA CurrentDirBuf
700 2336 18 CLC
701 2337 69 17 ADC #$17
702 2339 85 D0 STA CurrentFileInfoBuff
703 233B A5 CB LDA CurrentDirBuf+1
704 233D 69 00 ADC #$00
705 233F 85 D1 STA CurrentFileInfoBuff+1
706 2341 StatusBarPrint
707 2341 20 C0 2A JSR PrintXY
708 2344 00 00 .BY $00,$00
709 2346 7D .BY $7d
710 2347 DensityDisplay
711 2347 A0 C4 .BY +$80," D"
712 2349 DriveDisp1 ; "
713 2349 C1 BA A0 CD D3 C4 + .BY +$80,"A: MSDOS 4.7 QMEG:"
714 235C QMEGstatus
715 235C CF C6 C6 AF C2 C1 + .BY +$80,"OFF/BAS:"
716 2364 BASstatus
717 2364 CF C6 C6 AF D5 D3 + .BY +$80,"OFF/US:"
718 236B USstatus
719 236B CF C6 C6 A0 .BY +$80,"OFF " ; w inversie
720 236F 00 .BY $00
721 ; Nowa (minus pierwsza ;) linijka opisu na dole
722 2370 20 C0 2A JSR PrintXY
723 2373 11 15 .BY $11,$15
724 2375 B1 .BY +$80,"1"
725 2376 2D .BY "-"
726 2377 B8 .BY +$80,"8"
727 2378 20 6F 72 20 .BY " or "
728 237C E3 F4 F2 EC .BY +$80,"ctrl"
729 2380 2B .BY "+"
730 2381 C1 AE AE CF .BY +$80,"A..O"
731 2385 20 44 72 69 76 65 .BY " Drive"
732 238B 00 .BY $00
733 ; Pierwsza linijka opisu na dole strony
734 238C 20 C0 2A JSR PrintXY
735 238F 01 16 .BY $01,$16
736 2391 D3 D0 C1 C3 C5 .BY +$80,"SPACE"
737 2396 3A 43 6F 6E 74 69 + .BY ":Continue "
738 23A1 D3 C8 C9 C6 D4 .BY +$80,"SHIFT"
739 23A6 2B 2E 2E 2E 4E 6F + .BY "+...No High Speed"
740 23B7 00 .BY $00
741 ; Druga linijka opisu na dole strony
742 23B8 20 C0 2A JSR PrintXY
743 23BB 02 17 .BY $02,$17
744 23BD C5 D3 C3 .BY +$80,"ESC"
745 23C0 3A 41 6C 6C 20 66 + .BY ":All files "
746 23CC BE .BY +$80,">"
747 23CD 3A 4D 61 69 6E 20 + .BY ":Main Dir. "
748 23D9 BC .BY +$80,"<"
749 23DA 3A 55 50 2D 44 49 + .BY ":UP-DIR."
750 23E2 00 .BY $00
751 23E3 A9 00 LDA #$00
752 23E5 85 D9 STA NamesOnScreen
753 23E7 label68
754 23E7 A5 D1 LDA CurrentFileInfoBuff+1
755 23E9 C5 CD CMP CurrentDirBufEnd+1
756 23EB 90 08 BCC NoLastFileInDir
757 23ED D0 55 BNE LastFilesPageJump
758 23EF A5 D0 LDA CurrentFileInfoBuff
759 23F1 C5 CC CMP CurrentDirBufEnd
760 23F3 B0 4F BCS LastFilesPageJump
761 23F5 NoLastFileInDir
762 23F5 A0 00 LDY #$00
763 23F7 B1 D0 LDA (CurrentFileInfoBuff),Y
764 23F9 F0 49 BEQ LastFilesPageJump
765 23FB A2 22 LDX #$22
766 23FD A9 20 LDA #$20 ; spacja
767 23FF label50
768 23FF 9D B0 24 STA GameName,X
769 2402 CA DEX
770 2403 10 FA BPL label50
771 2405 A0 10 LDY #$10
772 2407 A2 0A LDX #$0A
773 2409 label51
774 2409 B1 D0 LDA (CurrentFileInfoBuff),Y
775 240B 9D B0 24 STA GameName,X
776 240E 88 DEY
777 240F CA DEX
778 2410 10 F7 BPL label51
779 2412 A5 D9 LDA NamesOnScreen
780 2414 18 CLC
781 2415 69 41 ADC #$41 ; literka "A"
782 2417 8D AD 24 STA GameKeySymbol
783 241A A5 D8 LDA $D8
784 241C D0 2C BNE label52
785 241E A0 00 LDY #$00
786 ; status sprawdzanego pliku
787 2420 B1 D0 LDA (CurrentFileInfoBuff),Y
788 2422 29 19 AND #$19
789 2424 C9 09 CMP #$09
790 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu"
791 2426 F0 08 BEQ label53
792 2428 A6 D7 LDX $D7
793 242A F0 1B BEQ label54
794 242C C9 08 CMP #$08
795 242E D0 17 BNE label54
796 2430 label53
797 ; jeszcze raz status sprawdzanego pliku
798 2430 B1 D0 LDA (CurrentFileInfoBuff),Y
799 2432 29 20 AND #$20
800 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik)
801 2434 F0 0B BEQ label55
802 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "<SUB-DIR>")
803 2436 A2 08 LDX #$08
804 2438 label56
805 2438 BD BF 25 LDA SubDirText,X
806 243B 8D BC 24 STA GameName+12
807 243E CA DEX
808 243F 10 F7 BPL label56
809 2441 label55
810 2441 4C A0 24 JMP GameNamePrint
811 2444 LastFilesPageJump
812 2444 4C 48 25 JMP LastFilesPage
813 2447 label54
814 2447 4C F8 24 JMP label59
815 244A label52
816 244A A0 00 LDY #$00
817 244C B1 D0 LDA (CurrentFileInfoBuff),Y
818 244E 29 18 AND #$18
819 2450 C9 08 CMP #$08
820 2452 D0 F3 BNE label54
821 2454 A5 CC LDA CurrentDirBufEnd
822 2456 85 D4 STA $D4
823 2458 A5 CD LDA CurrentDirBufEnd+1
824 245A 85 D5 STA $D5
825 245C label65
826 245C A5 D5 LDA $D5
827 245E C5 CF CMP $CF
828 2460 90 08 BCC label60
829 2462 D0 E3 BNE label54
830 2464 A5 D4 LDA $D4
831 2466 C5 CE CMP $CE
832 2468 B0 DD BCS label54
833 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy
834 246A label60
835 246A A0 00 LDY #$00
836 246C B1 D4 LDA ($D4),Y
837 246E C9 2A CMP #'*'
838 2470 D0 06 BNE CompareNames
839 2472 8D 9B 21 STA NewColors
840 2475 20 D8 2B JSR Asteriks
841 2478 CompareNames
842 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT
843 2478 A0 0A LDY #$0A ; 8+3 znaki
844 247A Checking62
845 247A B1 D4 LDA ($D4),Y
846 247C D9 B0 24 CMP GameName,Y
847 247F D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw
848 2481 88 DEY
849 2482 10 F6 BPL Checking62
850 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku
851 2484 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku
852 2486 ReplacingName
853 2486 B1 D4 LDA ($D4),Y
854 2488 99 A5 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania
855 248B C8 INY
856 248C C0 2E CPY #$2E
857 248E 90 F6 BCC ReplacingName
858 2490 B0 0E BCS GameNamePrint
859 2492 CheckNextName
860 2492 A5 D4 LDA $D4
861 2494 18 CLC
862 2495 69 2E ADC #$2E
863 2497 85 D4 STA $D4
864 2499 90 02 BCC label64
865 249B E6 D5 INC $D5
866 249D label64
867 249D 4C 5C 24 JMP label65
868 24A0 GameNamePrint
869 24A0 A5 D9 LDA NamesOnScreen
870 24A2 18 CLC
871 24A3 69 02 ADC #$02
872 24A5 8D AC 24 STA YposGameName
873 24A8 20 C0 2A JSR PrintXY
874 24AB 01 .BY $01
875 24AC YposGameName
876 24AC 02 .BY $02
877 24AD GameKeySymbol
878 24AD 41 29 20 .BY "A) "
879 24B0 GameName
880 24B0 20 20 20 20 20 20 + .BY " "
881 24D3 00 .BY $00
882 24D4 A5 D9 LDA NamesOnScreen
883 24D6 0A ASL
884 24D7 AA TAX
885 24D8 A5 D0 LDA CurrentFileInfoBuff
886 24DA 9D AA 2C STA FirstSectorsTable,X
887 24DD A5 D1 LDA CurrentFileInfoBuff+1
888 24DF 9D AB 2C STA FirstSectorsTable+1,X
889 24E2 A5 D0 LDA CurrentFileInfoBuff
890 24E4 18 CLC
891 24E5 69 17 ADC #$17
892 24E7 85 D0 STA CurrentFileInfoBuff
893 24E9 90 02 BCC label66
894 24EB E6 D1 INC CurrentFileInfoBuff+1
895 24ED label66
896 24ED E6 D9 INC NamesOnScreen
897 24EF A5 D9 LDA NamesOnScreen
898 24F1 C9 13 CMP #$13
899 24F3 B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie
900 24F5 4C E7 23 JMP label68
901 24F8 label59
902 24F8 A5 D0 LDA CurrentFileInfoBuff
903 24FA 18 CLC
904 24FB 69 17 ADC #$17
905 24FD 85 D0 STA CurrentFileInfoBuff
906 24FF 90 02 BCC label69
907 2501 E6 D1 INC CurrentFileInfoBuff+1
908 2503 label69
909 2503 4C E7 23 JMP label68
910 2506 MainDirKEY
911 2506 4C 48 22 JMP ReadMainDir
912 2509 UpDirKEY
913 2509 A0 02 LDY #$02
914 250B B1 CA LDA (CurrentDirBuf),Y
915 250D AA TAX
916 250E 88 DEY
917 250F 11 CA ORA (CurrentDirBuf),Y
918 2511 F0 37 BEQ KeyboardProc
919 2513 B1 CA LDA (CurrentDirBuf),Y
920 2515 A8 TAY
921 2516 4C 7E 22 JMP ReadDIR
922 2519 EscKEY
923 ; sprawdzmy czy z Shift
924 2519 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!!
925 251C 29 08 and #$08
926 251E D0 06 BNE NoSHIFTEsc
927 2520 20 AB 21 JSR EditorOpen
928 2523 6C 0A 00 JMP (DOSVEC)
929 2526 NoSHIFTEsc
930 2526 A2 00 LDX #$00
931 2528 86 D8 STX $D8
932 252A E8 INX
933 252B 86 D7 STX $D7
934 252D ToStartOfDirJump
935 252D 4C 30 23 JMP ToStartOfDir
936 2530 SpaceKEY
937 2530 A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy
938 2532 D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku
939 2534 4C 41 23 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej
940 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie
941 2537 ContArrowsPrint
942 2537 20 C0 2A JSR PrintXY
943 253A 01 15 .BY $01,$15
944 253C 1D .BY $1D ; strzalka w dol
945 253D 00 .BY $00
946 253E 20 C0 2A JSR PrintXY
947 2541 0E 15 .BY $0E,$15
948 2543 1D .BY $1D ; strzalka w dol
949 2544 00 .BY $00
950 2545 4C 4A 25 JMP KeyboardProc
951 2548 LastFilesPage
952 2548 E6 D6 INC LastFilesPageFlag
953 254A KeyboardProc
954 254A AD 9B 21 LDA NewColors
955 254D D0 0D BNE ColorsAlreadySet
956 254F A9 C4 LDA #$C4 ; ustawienie koloru tła i liter
957 2551 8D C6 02 STA COLPF2S
958 2554 8D C8 02 STA COLBAKS
959 2557 A9 CA LDA #$CA
960 2559 8D C5 02 STA COLPF1S
961 255C ColorsAlreadySet
962 255C 20 77 2B JSR GetKey
963 255F 29 7F AND #%01111111 ; eliminujemy invers
964 2561 F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu
965 2563 C9 3E CMP #$3E ; ">"
966 2565 F0 9F BEQ MainDirKEY
967 2567 C9 3C CMP #$3C ; "<"
968 2569 F0 9E BEQ UpDirKEY
969 256B C9 7E CMP #$7E ; BackSpace
970 256D F0 9A BEQ UpDirKEY
971 256F C9 1B CMP #$1B ; Esc
972 2571 F0 A6 BEQ EscKEY
973 2573 C9 20 CMP #$20 ; Spacja
974 2575 F0 B9 BEQ SpaceKEY
975 ; ----------------
976 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f)
977 2577 C9 10 CMP #$10
978 2579 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku)
979 257B 20 25 2C JSR SeTDriveLetter
980 257E 4C D9 21 JMP mainprog
981 2581 noCtrlLetter
982 ; sprawdzenie klawiszy 1-8
983 2581 C9 31 CMP #'1'
984 2583 90 0D BCC NoNumber
985 2585 C9 39 CMP #'9'
986 2587 B0 09 BCS NoNumber
987 2589 38 SEC
988 258A E9 30 SBC #'0'
989 258C 20 12 2C JSR SeTDriveNR
990 258F 4C D9 21 JMP mainprog
991 ; -----------------
992 2592 NoNumber
993 2592 C9 61 CMP #'a' ; czy nie ma capsa
994 2594 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany
995 2596 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze)
996 2598 BigLetters
997 2598 38 SEC
998 2599 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy
999 259B C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie
1000 259D B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz
1001 259F 0A ASL
1002 25A0 AA TAX
1003 25A1 BD AA 2C LDA FirstSectorsTable,X
1004 25A4 85 D4 STA $D4
1005 25A6 BD AB 2C LDA FirstSectorsTable+1,X
1006 25A9 85 D5 STA $D5
1007 25AB A0 00 LDY #$00
1008 25AD B1 D4 LDA ($D4),Y
1009 25AF 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik
1010 25B1 F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader
1011 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran
1012 25B3 A0 02 LDY #$02
1013 25B5 B1 D4 LDA ($D4),Y
1014 25B7 AA TAX
1015 25B8 88 DEY
1016 25B9 B1 D4 LDA ($D4),Y
1017 25BB A8 TAY
1018 25BC 4C 7E 22 JMP ReadDIR
1019 25BF SubDirText
1020 25BF 3C 53 55 42 2D 44 + .BY "<SUB-DIR>"
1021 25C8 GOtoLoader
1022 25C8 20 C1 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka
1023 25CB F0 03 BEQ DiskNotChanged1
1024 25CD 4C 48 22 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego
1025 25D0 DiskNotChanged1
1026 25D0 AD 9A 21 LDA FolderTurbo
1027 25D3 F0 07 BEQ SetTurboOFF
1028 25D5 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!!
1029 25D8 29 08 and #$08
1030 25DA D0 03 BNE NoSHIFT
1031 25DC SetTurboOFF
1032 25DC 8D 96 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0
1033 25DF NoSHIFT
1034 25DF A0 01 LDY #$01
1035 25E1 B1 D4 LDA ($D4),Y
1036 25E3 8D 4B 21 STA .adr loader.FirstMapSectorNr ; przed przepisaniem
1037 25E6 8D BD 2A sta blokDanychIO+$A ; od razu do bloku IOCB
1038 25E9 C8 INY
1039 25EA B1 D4 LDA ($D4),Y
1040 25EC 8D 4C 21 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem
1041 25EF 8D BE 2A sta blokDanychIO+$B ; od razu do bloku IOCB
1042 25F2 C8 INY
1043 25F3 B1 D4 LDA ($D4),Y
1044 25F5 49 FF EOR #$FF
1045 25F7 8D 95 21 STA .adr loader.tempToFileEndL
1046 25FA C8 INY
1047 25FB B1 D4 LDA ($D4),Y
1048 25FD 49 FF EOR #$FF
1049 25FF 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem
1050 2602 C8 INY
1051 2603 B1 D4 LDA ($D4),Y
1052 2605 49 FF EOR #$FF
1053 2607 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem
1054 ; wszystko zapamietane mozna robic mape sektorow....
1055 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu
1056 ; czyli DirSectorBuff
1057 ; sektor mapy przed kompresja leci do DirMapSectorBuff
1058 ; UWAGA
1059 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi
1060 ; zawierac rozkaz przeczytania pierwszego sektora!!!!!
1061 = 2F80 CompressedMap = DirSectorBuff
1062 ; czytamy pierwszy sektor mapy
1063 260A A0 80 LDY #<DirMapSectorBuff
1064 260C A2 2D LDX #>DirMapSectorBuff
1065 260E 20 85 2A Jsr ReadSector
1066 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!!
1067 2611 A9 00 LDA #00
1068 2613 85 82 STA CompressedMapCounter
1069 2615 85 83 STA CompressedMapCounter+1
1070 2617 20 E3 26 JSR AddToCompressedMAP
1071 261A AD 84 2D LDA DirMapSectorBuff+4
1072 261D 85 86 STA PrevFileSector
1073 261F 20 E3 26 JSR AddToCompressedMAP
1074 2622 AD 85 2D LDA DirMapSectorBuff+5
1075 2625 85 87 sta PrevFileSector+1
1076 2627 20 E3 26 JSR AddToCompressedMAP
1077 ; Inicjujemy liczniki
1078 262A .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80
1079 262A .zpvar PrevFileSector, MapPositionMem .word
1080 262A .zpvar SectorOffset .word
1081 262A .zpvar SectorsCounter .byte
1082 262A A9 00 LDA #$00
1083 262C 85 81 STA MapCounter+1
1084 262E 85 8C STA SectorsCounter
1085 2630 A9 06 lda #$06
1086 2632 85 80 STA MapCounter
1087 2634 GenerateCompressedMap
1088 2634 18 CLC
1089 2635 A9 80 LDA #<DirMapSectorBuff
1090 2637 65 80 ADC MapCounter
1091 2639 85 88 STA MAPPositionMem
1092 263B A9 2D LDA #>DirMapSectorBuff
1093 263D 65 81 ADC MapCounter+1
1094 263F 85 89 STA MAPPositionMem+1
1095 2641 A2 00 LDX #0
1096 2643 A0 01 LDY #1
1097 2645 A1 88 LDA (MAPPositionMem,x)
1098 2647 11 88 ORA (MAPPositionMem),y
1099 2649 F0 56 BEQ Sector00
1100 264B 38 SEC
1101 264C A1 88 LDA (MAPPositionMem,x)
1102 264E E5 86 SBC PrevFileSector
1103 2650 85 8A STA SectorOffset
1104 2652 B1 88 LDA (MAPPositionMem),y
1105 2654 E5 87 SBC PrevFileSector+1
1106 2656 85 8B STA SectorOffset+1
1107 ; mamy odstep miedzy poprzednim a nastepnym sektorem
1108 2658 D0 26 BNE OffsetToBig
1109 265A A5 8A LDA SectorOffset
1110 265C 30 22 BMI OffsetToBig ; max przeskok 127 sektorow
1111 265E C9 01 CMP #$01
1112 2660 D0 11 BNE JumpForward
1113 ; kolejny sektor
1114 ; zwiekszamy wiec licznik
1115 2662 E6 8C inc SectorsCounter
1116 2664 A5 8C LDA SectorsCounter
1117 2666 C9 7F CMP #%01111111
1118 2668 D0 2C BNE GetNextMapWord
1119 ; tu licznik dotarl do konca zerujemy go
1120 ; dodajemy wpis do skompresowanej mapy i gotowe
1121 266A 20 E3 26 JSR AddToCompressedMAP
1122 266D A9 00 LDA #0
1123 266F 85 8C STA SectorsCounter
1124 2671 F0 23 BEQ GetNextMapWord
1125 ; ominiecie wyznaczonej ilości sektorów (w A)
1126 2673 JumpForward
1127 2673 20 FE 26 JSR FlushBuffer
1128 2676 A5 8A LDA SectorOffset
1129 2678 09 80 ORA #%10000000
1130 267A 20 E3 26 JSR AddToCompressedMAP
1131 267D 4C 96 26 JMP GetNextMapWord
1132 ; wyznaczenie skoku do nowego sektora pliku
1133 2680 OffsetToBig
1134 2680 20 FE 26 JSR FlushBuffer
1135 2683 A9 00 LDA #0
1136 2685 20 E3 26 JSR AddToCompressedMAP
1137 2688 A0 00 LDY #00
1138 268A B1 88 LDA (MAPPositionMem),y
1139 268C 20 E3 26 JSR AddToCompressedMAP
1140 268F A0 01 LDY #01
1141 2691 B1 88 LDA (MAPPositionMem),y
1142 2693 20 E3 26 JSR AddToCompressedMAP
1143 2696 GetNextMapWord
1144 ; zapamietanie numeru obecnego sektora do porownania potem
1145 2696 A0 00 LDY #00
1146 2698 B1 88 LDA (MAPPositionMem),y
1147 269A 85 86 STA PrevFileSector
1148 269C C8 INY
1149 269D B1 88 LDA (MAPPositionMem),y
1150 269F 85 87 STA PrevFileSector+1
1151 26A1 Sector00
1152 26A1 18 A5 80 69 02 85 + ADW MapCounter #2
1153 26AC ops01
1154 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala
1155 26AC A5 81 LDA MapCounter+1
1156 26AE CD B4 20 CMP .adr loader.SecLen+1
1157 26B1 D0 05 bne noteqal01
1158 26B3 A5 80 LDA MapCounter
1159 26B5 CD B3 20 CMP .adr loader.SecLen
1160 26B8 noteqal01
1161 26B8 F0 03 4C 34 26 JNE GenerateCompressedMap
1162 ; czytamy nastepny sektor mapy
1163 ; sprawdzmy czy nie koniec
1164 26BD AD 80 2D LDA DirMapSectorBuff
1165 26C0 0D 81 2D ORA DirMapSectorBuff+1
1166 26C3 F0 45 BEQ EndMakingMap
1167 26C5 AD 80 2D LDA DirMapSectorBuff
1168 26C8 8D BD 2A sta blokDanychIO+$A
1169 26CB AD 81 2D LDA DirMapSectorBuff+1
1170 26CE 8D BE 2A sta blokDanychIO+$B
1171 26D1 A0 80 LDY #<DirMapSectorBuff
1172 26D3 A2 2D LDX #>DirMapSectorBuff
1173 26D5 20 85 2A Jsr ReadSector
1174 ; zerujemy licznik mapy
1175 26D8 A9 00 LDA #$00
1176 26DA 85 81 STA MapCounter+1
1177 26DC A9 04 lda #$04
1178 26DE 85 80 STA MapCounter
1179 26E0 4C 34 26 JMP GenerateCompressedMap
1180 ; dpisanie bajtu z A do mapy sektorow skompresowanej
1181 26E3 AddToCompressedMAP
1182 26E3 48 PHA
1183 ; wyliczamy adresa
1184 26E4 18 CLC
1185 26E5 A5 82 LDA CompressedMapCounter
1186 26E7 69 80 ADC #<CompressedMap
1187 26E9 8D F5 26 STA xxxxbla
1188 26EC A5 83 LDA CompressedMapCounter+1
1189 26EE 69 2F ADC #>CompressedMap
1190 26F0 8D F6 26 STA xxxxbla+1
1191 26F3 68 PLA
1192 = 26F5 xxxxbla=*+1
1193 26F4 8D FF FF STA $FFFF
1194 26F7 E6 82 INC CompressedMapCounter
1195 26F9 D0 02 BNE noinc013
1196 26FB E6 83 INC CompressedMapCounter+1
1197 26FD noinc013
1198 26FD 60 RTS
1199 26FE FlushBuffer
1200 26FE A5 8C LDA SectorsCounter
1201 2700 F0 07 BEQ NoFlush
1202 2702 20 E3 26 JSR AddToCompressedMAP
1203 2705 A9 00 LDA #0
1204 2707 85 8C STA SectorsCounter
1205 2709 NoFlush
1206 2709 60 RTS
1207 270A EndMakingMap
1208 270A 20 FE 26 JSR FlushBuffer
1209 270D A0 00 LDY #$00
1210 270F 8C 44 02 STY COLDST
1211 2712 A9 01 LDA #$01
1212 2714 85 09 STA BOOT
1213 2716 AE 00 07 LDX $700
1214 2719 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta
1215 271B D0 03 BNE NoRunFromDOS
1216 271D 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!!
1217 ; STA $D5EC ; to wylacza SpartaDOS X
1218 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :)
1219 2720 NoRunFromDOS
1220 2720 A9 31 LDA #<AfterWormStart
1221 2722 85 0C STA DOSINI
1222 2724 A9 27 LDA #>AfterWormStart
1223 2726 85 0D STA DOSINI+1
1224 ; LDA #>JRESETCD
1225 ; STA DOSVEC+1
1226 ; LDA #<JRESETCD
1227 ; STA DOSVEC
1228 ; zapamietanie stanu urzadzen PBI
1229 2728 AD 47 02 LDA PDVMASK
1230 272B 8D 9D 2C STA PDVMASKtemp
1231 272E 4C 74 E4 JMP JRESETWM ; wymuszenie cieplego resetu - z ustawionymi odpowiednimi prametrami powrotu
1232 2731 AfterWormStart
1233 ; wyznaczamy MEMlo, najpierw dodajemy dlugosc bufora na sektor
1234 ; do koncowego adresu naszej procedury
1235 ; odtworzenie stanu PBI
1236 2731 AD 9D 2C LDA PDVMASKtemp
1237 2734 8D 47 02 STA PDVMASK
1238 ; JSR EditorOpen ; zamiast cieplego startu czyszczenie ekranu
1239 2737 18 CLC
1240 2738 A9 4B LDA #<TempMEMLO
1241 273A 6D B3 20 ADC .adr loader.SecLen
1242 273D 8D E7 02 STA MEMLO
1243 2740 85 3D STA CompressedMapPos
1244 2742 8D 98 27 STA pointerMov2b-1 ; przygotowanie procedury przepisujacej
1245 ; STA APPMHI ; wlasciwie tu powinno byc to samo co po pozniejszym zwiekszeniu MEMLO !!!!
1246 2745 A9 08 LDA #>TempMEMLO
1247 2747 6D B4 20 ADC .adr loader.SecLen+1
1248 274A 8D E8 02 STA MEMLO+1
1249 274D 85 3E STA CompressedMapPos+1
1250 274F 8D 99 27 STA pointerMov2b
1251 ; STA APPMHI+1
1252 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora
1253 ; jest to jednoczesnie adres umieszczenia skompresowanej
1254 ; mapy sektorow pliku dla loadera ale MINUS 1
1255 2752 A5 3D D0 02 C6 3E + DEW CompressedMapPos
1256 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej
1257 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu)
1258 275A 18 CLC
1259 275B AD E7 02 LDA MEMLO
1260 275E 65 82 ADC CompressedMapCounter
1261 2760 8D E7 02 STA MEMLO
1262 2763 8D 0F 28 STA TurboRelocADDR
1263 2766 AD E8 02 LDA MEMLO+1
1264 2769 65 83 ADC CompressedMapCounter+1
1265 276B 8D E8 02 STA MEMLO+1
1266 276E 8D 10 28 STA TurboRelocADDR+1
1267 2771 A9 71 LDA #<JTESTROM
1268 2773 85 0C STA DOSINI
1269 2775 A9 E4 LDA #>JTESTROM
1270 2777 85 0D STA DOSINI+1
1271 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI)
1272 ; INC $033D ; bajty kontrolne zimnego startu
1273 ; INC $033E ; zmiana ich wartosci wymusza
1274 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja)
1275 2779 A2 00 LDX #$00
1276 277B 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter)
1277 ; STX BOOT
1278 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci
1279 277D moveloop1
1280 277D BD 00 20 LDA movedproc,X
1281 2780 9D 00 07 STA $0700,X
1282 2783 BD 00 21 LDA movedproc+$0100,X
1283 2786 9D 00 08 STA $0800,X
1284 2789 E8 INX
1285 278A D0 F1 BNE moveloop1
1286 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora
1287 278C moveloop2
1288 278C A5 82 D0 02 C6 83 + DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy
1289 = 2796 pointerMov2a=*+2
1290 2794 BD 80 2F LDA CompressedMap,x ; kod samomodyfikujacy sie
1291 = 2799 pointerMov2b=*+2
1292 2797 9D FF FF STA $FFFF,x ; kod samomodyfikujacy sie
1293 279A A5 82 LDA CompressedMapCounter
1294 279C 25 83 AND CompressedMapCounter+1
1295 279E C9 FF CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!!
1296 27A0 F0 0B BEQ SectorMapReady
1297 27A2 E8 INX
1298 27A3 D0 E7 BNE moveloop2
1299 27A5 EE 96 27 inc pointerMov2a
1300 27A8 EE 99 27 inc pointerMov2b
1301 27AB D0 DF bne moveloop2
1302 27AD SectorMapReady
1303
1304 27AD 20 D1 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO
1305 27B0 20 41 2C JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy)
1306
1307 27B3 A2 00 LDX #$00
1308 27B5 8A TXA
1309 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny)
1310 27B6 ClearLoop1
1311 27B6 9D 00 01 STA $0100,X ; STOS !!!
1312 27B9 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b)
1313 27BC 9D 00 05 STA $0500,X
1314 27BF 9D 00 06 STA $0600,X
1315 27C2 E0 80 CPX #$80 ;tylko ponad $80
1316 27C4 90 02 BCC NoZpage
1317 27C6 95 00 STA $00,X ; czyli polowa strony zerowej
1318 27C8 NoZpage
1319 27C8 E8 INX
1320 27C9 D0 EB BNE ClearLoop1
1321 27CB A2 FF LDX #$FF
1322 27CD 9A TXS ; "wyzerowanie wskaznika STOSU
1323
1324 27CE 4C 4D 08 JMP loader.LoadStart ; po przepisaniu
1325 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba
1326 ; na koniec odpowiednie zmodyfikowanie MEMLO
1327 27D1 ADDspeedProc
1328 27D1 AD 96 21 LDA USmode
1329 27D4 F0 5F beq NoHappyLoader
1330 ; wyznaczamy offset procedury
1331 27D6 38 SEC
1332 27D7 A9 36 LDA #<HappyUSMovedProc
1333 27D9 ED E7 02 SBC MEMLO
1334 27DC 8D 92 2C STA HappyOffset
1335 27DF A9 28 LDA #>HappyUSMovedProc
1336 27E1 ED E8 02 SBC MEMLO+1
1337 27E4 8D 93 2C STA HappyOffset+1
1338
1339 27E7 A0 00 LDY #0
1340 27E9 A2 09 LDX #[$A-1] ;xjsrA - the last
1341 ; relokujemy skoki pod offset z MEMLO
1342 27EB HappyRelocate
1343 27EB 38 SEC
1344 27EC BD 7E 2C LDA xjsrTableL,x
1345 27EF 85 32 STA SecBuffer
1346 27F1 BD 88 2C LDA xjsrTableH,x
1347 27F4 85 33 STA SecBuffer+1
1348 27F6 B1 32 LDA (SecBuffer),y
1349 27F8 ED 92 2C SBC HappyOffset
1350 27FB 91 32 STA (SecBuffer),y
1351 27FD C8 INY
1352 27FE B1 32 LDA (SecBuffer),y
1353 2800 ED 93 2C SBC HappyOffset+1
1354 2803 91 32 STA (SecBuffer),y
1355 2805 88 DEY
1356 2806 CA DEX
1357 2807 10 E2 BPL HappyRelocate
1358
1359 2809 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1]
1360 280B label72x
1361 280B BD 36 28 LDA HappyUSMovedProc,X
1362 = 280F TurboRelocADDR=*+1
1363 280E 9D 00 0A STA $0A00,X
1364 2811 CA DEX
1365 2812 E0 FF CPX #$FF
1366 2814 D0 F5 BNE label72x
1367 2816 A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc]
1368 2818 A2 00 LDX #$00
1369 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej.
1370 281A label73
1371 281A 98 TYA
1372 281B 18 CLC
1373 281C 6D E7 02 ADC MEMLO
1374 281F 8D E7 02 STA MEMLO
1375 2822 8A TXA
1376 2823 6D E8 02 ADC MEMLO+1
1377 2826 8D E8 02 STA MEMLO+1
1378 2829 AD 0F 28 LDA TurboRelocADDR
1379 282C 8D A6 07 STA loader.SioJMP+1 ; po przepisaniu
1380 282F AD 10 28 LDA TurboRelocADDR+1
1381 2832 8D A7 07 STA loader.SioJMP+2 ; po przepisaniu
1382 2835 NoHappyLoader
1383 2835 60 RTS
1384
1385
1386
1387 ; UWAGA !!!!!!!!!!!!!!
1388 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!!
1389 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone
1390 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!!
1391 2836 HappyUSMovedProc ;
1392
1393 2836 AD 04 03 LDA DBUFA
1394 2839 85 32 STA SecBuffer
1395 283B AD 05 03 LDA DBUFA+1
1396 283E 85 33 STA SecBuffer+1
1397
1398 2840 AD 08 03 LDA DBYT
1399 2843 85 31 STA SecLenUS
1400
1401 2845 78 SEI
1402 2846 BA TSX
1403 2847 86 37 STX StackCopy
1404 2849 A9 0D LDA #$0D
1405 284B 85 34 STA CRETRYZ
1406 ;command retry on zero page
1407 284D CommandLoop
1408 = 284E HappySpeed = *+1
1409 284D A9 28 LDA #$28 ;here goes speed from "?"
1410 284F 8D 04 D2 STA AUDF3
1411 2852 A9 34 LDA #$34
1412 2854 8D 03 D3 STA PBCTL ;ustawienie linii command
1413 2857 A2 80 LDX #$80
1414 2859 DelayLoopCmd
1415 2859 CA DEX
1416 285A D0 FD BNE DelayLoopCmd
1417 285C 8E 06 D2 STX AUDF4 ; zero
1418 285F 86 35 STX TransmitError
1419 ; pokey init
1420 2861 A9 23 LDA #$23
1421 2863 20 D7 28 xjsr1 JSR SecTransReg
1422 ;
1423
1424 2866 18 CLC
1425 2867 AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno)
1426 286A 6D 01 03 ADC DUNIT ; dodajemy numer stacji
1427 286D 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari)
1428 286F 85 30 STA CheckSum
1429 2871 8D 0D D2 STA SEROUT
1430 2874 AD 02 03 LDA DCOMND
1431 2877 20 ED 28 xjsr2 JSR PutSIOByte
1432 287A AD 0A 03 LDA DAUX1
1433 287D 20 ED 28 xjsr3 JSR PutSIOByte
1434 2880 AD 0B 03 LDA DAUX2
1435 2883 20 ED 28 xjsr4 JSR PutSIOByte
1436 2886 A5 30 LDA CheckSum
1437 2888 20 ED 28 xjsr5 JSR PutSIOByte
1438
1439 288B waitforEndOftransmission
1440 288B AD 0E D2 LDA IRQST
1441 288E 29 08 AND #$08
1442 2890 D0 F9 BNE waitforEndOftransmission
1443
1444 2892 A9 13 LDA #$13
1445 2894 20 D7 28 xjsr6 JSR SecTransReg
1446
1447 2897 A9 3C LDA #$3c
1448 2899 8D 03 D3 STA PBCTL ;command line off
1449 ; two ACK's
1450 289C A0 02 LDY #2
1451 289E DoubleACK
1452 289E 20 09 29 xjsr7 JSR GetSIOByte
1453 28A1 C9 44 CMP #$44
1454 28A3 B0 19 BCS ErrorHere
1455 28A5 88 DEY
1456 28A6 D0 F6 BNE DoubleACK
1457
1458 ;ldy #0
1459 28A8 84 30 STY CheckSum
1460 28AA ReadSectorLoop
1461 28AA 20 09 29 xjsr8 JSR GetSIOByte
1462 28AD 91 32 STA (SecBuffer),y
1463 28AF 20 01 29 xjsr9 JSR AddCheckSum
1464 28B2 C8 INY
1465 28B3 C4 31 CPY SecLenUS
1466 28B5 D0 F3 BNE ReadSectorLoop
1467
1468 28B7 20 09 29 xjsrA JSR GetSIOByte
1469 28BA C5 30 CMP CheckSum
1470 28BC F0 0B BEQ EndOfTransmission
1471 ;error!!!
1472 28BE ErrorHere
1473 28BE A0 90 LDY #$90
1474 28C0 84 35 STY TransmitError
1475 28C2 A6 37 LDX StackCopy
1476 28C4 9A TXS
1477 28C5 C6 34 DEC CRETRYZ
1478 28C7 D0 84 BNE CommandLoop
1479
1480 28C9 EndOfTransmission
1481 28C9 A9 00 LDA #0
1482 28CB 8D 07 D2 STA AUDC4
1483 28CE A5 10 LDA IRQENS
1484 28D0 8D 0E D2 STA IRQEN
1485 28D3 58 CLI
1486 28D4 A4 35 LDY TransmitError
1487 28D6 60 RTS
1488
1489 28D7 SecTransReg
1490 28D7 8D 0F D2 STA SKCTL
1491 28DA 8D 0A D2 STA SKSTRES
1492 28DD A9 38 LDA #$38
1493 28DF 8D 0E D2 STA IRQEN
1494 28E2 A9 28 LDA #$28
1495 28E4 8D 08 D2 STA AUDCTL
1496 28E7 A9 A8 LDA #$A8
1497 28E9 8D 07 D2 STA AUDC4
1498 28EC 60 RTS
1499
1500 28ED PutSIOByte
1501 28ED AA TAX
1502 28EE waitforSerial
1503 28EE AD 0E D2 LDA IRQST
1504 28F1 29 10 AND #$10
1505 28F3 D0 F9 BNE waitforSerial
1506
1507 28F5 8D 0E D2 STA IRQEN
1508 28F8 A9 10 LDA #$10
1509 28FA 8D 0E D2 STA IRQEN
1510
1511 28FD 8A TXA
1512 28FE 8D 0D D2 STA SEROUT
1513
1514 2901 AddCheckSum
1515 2901 18 CLC
1516 2902 65 30 ADC CheckSum
1517 2904 69 00 ADC #0
1518 2906 85 30 STA CheckSum
1519 2908 60 RTS
1520
1521 2909 GetSIOByte
1522 2909 A2 0A LDX #10 ;acktimeout
1523 290B ExternalLoop
1524 290B A9 00 LDA #0
1525 290D 85 36 STA looperka
1526 290F InternalLoop
1527 290F AD 0E D2 LDA IRQST
1528 2912 29 20 AND #$20
1529 2914 F0 09 BEQ ACKReceive
1530 2916 C6 36 DEC looperka
1531 2918 D0 F5 BNE InternalLoop
1532 291A CA DEX
1533 291B D0 EE BNE ExternalLoop
1534 291D F0 9F BEQ ErrorHere
1535 291F ACKReceive
1536 ; zero we have now
1537 291F 8D 0E D2 STA IRQST
1538 2922 A9 20 LDA #$20
1539 2924 8D 0E D2 STA IRQST
1540 2927 AD 0F D2 LDA SKSTAT
1541 292A 8D 0A D2 STA SKSTRES
1542 292D 29 20 AND #$20
1543 292F F0 8D BEQ ErrorHere
1544 ;
1545 2931 AD 0D D2 LDA SERIN
1546 2934 60 RTS
1547 2935 EndHappyUSProc
1548
1549
1550 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler
1551 2935 blokDanychIO_GetUSSpeed
1552 2935 31 01 3F 40 .BY $31,$01,"?",$40
1553 2939 4E 28 .WO HappySpeed
1554 293B 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A
1555 2941 DirMapEnd
1556 2941 4C 0D 2A JMP label75
1557 2944 label39
1558 2944 85 DA STA $DA
1559 2946 A5 D0 LDA CurrentFileInfoBuff
1560 2948 85 DB STA $DB
1561 294A A5 D1 LDA CurrentFileInfoBuff+1
1562 294C 85 DC STA $DC
1563 294E 20 C1 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka
1564 2951 F0 05 BEQ DiscNotChanged2
1565 2953 68 PLA
1566 2954 68 PLA
1567 2955 4C 48 22 JMP ReadMainDir
1568 2958 DiscNotChanged2
1569 ; odczyt sektora mapy wskazywanego przez DirMapSec
1570 2958 A5 D2 LDA DirMapSect
1571 295A 8D BD 2A STA blokDanychIO+10
1572 295D A5 D3 LDA DirMapSect+1
1573 295F 8D BE 2A STA blokDanychIO+11
1574 2962 0D BD 2A ORA blokDanychIO+10
1575 2965 F0 DA BEQ DirMapEnd
1576 2967 A2 2D LDX #>DirMapSectorBuff
1577 2969 A0 80 LDY #<DirMapSectorBuff
1578 296B 20 85 2A JSR ReadSector
1579 ; zostal wczytany kolejny sektor mapy nalezy wiec zapamietac we wskazniku DirMapSec
1580 ; numer nastepnego sektora mapy. To 2 pierwsze bajty z bufora na sektor mapy
1581 296E AD 80 2D LDA DirMapSectorBuff
1582 2971 85 D2 STA DirMapSect
1583 2973 AD 81 2D LDA DirMapSectorBuff+1
1584 2976 85 D3 STA DirMapSect+1
1585 2978 A9 04 LDA #$04
1586 297A 85 E2 STA InMapPointer ; --
1587 297C A9 00 LDA #$00 ; --
1588 297E 85 E3 STA InMapPointer+1 ; --
1589 2980 label80
1590 2980 A4 E2 LDY InMapPointer ; --
1591 2982 CC B3 20 CPY .adr loader.SecLen ; przed przepisaniem
1592 2985 D0 07 BNE NoNextMapSector ; --
1593 2987 A5 E3 LDA InMapPointer+1 ; --
1594 2989 CD B4 20 CMP .adr loader.Seclen+1 ; --
1595 298C F0 CA BEQ DiscNotChanged2
1596 298E NoNextMapSector
1597 ; pobranie numeru nastepnego sektora katalogu z mapy sektorow
1598 ; tymczasowy adrez na ZP
1599 298E A9 80 LDA #<DirMapSectorBuff ; --
1600 2990 85 E4 STA TempZP ; --
1601 2992 18 CLC ; --
1602 2993 A9 2D LDA #>DirMapSectorBuff ; --
1603 2995 65 E3 ADC InMapPointer+1 ; --
1604 2997 85 E5 STA TempZP+1 ; --
1605 2999 B1 E4 LDA (TempZP),Y
1606 299B 8D BD 2A STA blokDanychIO+10
1607 299E C8 INY
1608 299F B1 E4 LDA (TempZP),Y
1609 29A1 8D BE 2A STA blokDanychIO+11
1610 29A4 0D BD 2A ORA blokDanychIO+10
1611 29A7 F0 64 BEQ label75
1612 ; i zwiekszenie wskaznika mapy o 2
1613 29A9 C8 INY
1614 29AA 84 E2 STY InMapPointer
1615 29AC D0 02 BNE NoIncH ; --
1616 29AE E6 E3 INC InMapPointer+1 ; --
1617 29B0 NoIncH
1618 29B0 AD E5 02 LDA MEMTOP
1619 29B3 38 SEC
1620 29B4 E5 D0 SBC CurrentFileInfoBuff
1621 29B6 AD E6 02 LDA MEMTOP+1
1622 29B9 E5 D1 SBC CurrentFileInfoBuff+1
1623 29BB F0 50 BEQ label75
1624 29BD A4 D0 LDY CurrentFileInfoBuff
1625 29BF A6 D1 LDX CurrentFileInfoBuff+1
1626 29C1 20 85 2A JSR ReadSector
1627 29C4 A5 D4 LDA $D4
1628 29C6 05 D5 ORA $D5
1629 29C8 D0 16 BNE label79
1630 29CA A0 03 LDY #$03
1631 29CC B1 D0 LDA (CurrentFileInfoBuff),Y
1632 29CE 85 D4 STA $D4
1633 29D0 C8 INY
1634 29D1 B1 D0 LDA (CurrentFileInfoBuff),Y
1635 29D3 85 D5 STA $D5
1636 29D5 C8 INY
1637 29D6 B1 D0 LDA (CurrentFileInfoBuff),Y
1638 29D8 F0 06 BEQ label79
1639 29DA A9 FF LDA #$FF
1640 29DC 85 D4 STA $D4
1641 29DE 85 D5 STA $D5
1642 29E0 label79
1643 29E0 A5 D0 LDA CurrentFileInfoBuff
1644 29E2 18 CLC
1645 29E3 6D B3 20 ADC .adr loader.SecLen ; przed przepisaniem
1646 29E6 85 D0 STA CurrentFileInfoBuff
1647 29E8 A5 D1 LDA CurrentFileInfoBuff+1
1648 29EA 6D B4 20 ADC .adr loader.SecLen+1 ; przed przepisaniem
1649 29ED 85 D1 STA CurrentFileInfoBuff+1
1650 29EF A5 D4 LDA $D4
1651 29F1 38 SEC
1652 29F2 ED B3 20 SBC .adr loader.SecLen ; przed przepisaniem
1653 29F5 85 D4 STA $D4
1654 29F7 A5 D5 LDA $D5
1655 29F9 ED B4 20 SBC .adr loader.SecLen+1 ; przed przepisaniem
1656 29FC 85 D5 STA $D5
1657 29FE B0 80 BCS label80
1658 2A00 A5 D0 LDA CurrentFileInfoBuff
1659 2A02 18 CLC
1660 2A03 65 D4 ADC $D4
1661 2A05 85 D0 STA CurrentFileInfoBuff
1662 2A07 A5 D1 LDA CurrentFileInfoBuff+1
1663 2A09 65 D5 ADC $D5
1664 2A0B 85 D1 STA CurrentFileInfoBuff+1
1665 2A0D label75
1666 2A0D A5 DC LDA $DC
1667 2A0F C5 D1 CMP CurrentFileInfoBuff+1
1668 2A11 90 0B BCC label81
1669 2A13 D0 17 BNE label82
1670 2A15 A5 DB LDA $DB
1671 2A17 C5 D0 CMP CurrentFileInfoBuff
1672 2A19 90 03 BCC label81
1673 2A1B D0 0F BNE label82
1674 2A1D 60 RTS
1675 2A1E label81
1676 2A1E A5 DB LDA $DB
1677 2A20 18 CLC
1678 2A21 65 DA ADC $DA
1679 2A23 85 DB STA $DB
1680 2A25 90 E6 BCC label75
1681 2A27 E6 DC INC $DC
1682 2A29 4C 0D 2A JMP label75
1683 2A2C label82
1684 2A2C A5 DB LDA $DB
1685 2A2E 38 SEC
1686 2A2F E5 DA SBC $DA
1687 2A31 85 D0 STA CurrentFileInfoBuff
1688 2A33 A5 DC LDA $DC
1689 2A35 E9 00 SBC #$00
1690 2A37 85 D1 STA CurrentFileInfoBuff+1
1691 2A39 60 RTS
1692 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora
1693 2A3A ReadPERCOM
1694 2A3A A9 04 LDA #$04
1695 2A3C 8D BF 2A STA DiskRetryCount
1696 2A3F ReadPERCOMretry
1697 2A3F A0 63 LDY #<blokDanychIO_PERCOM
1698 2A41 A2 2A LDX #>blokDanychIO_PERCOM
1699 2A43 20 5B 2B JSR Table2DCB
1700 2A46 20 50 2B JSR GoSIO
1701 2A49 30 08 BMI PercomError
1702 ; blok odczytany - ustawmy dlugosc 1 sektora
1703 2A4B AD A4 2C LDA PERCOMdata+6
1704 2A4E C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128
1705 2A50 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest
1706 2A52 60 RTS
1707 2A53 PercomError
1708 2A53 CE BF 2A DEC DiskRetryCount
1709 2A56 D0 E7 BNE ReadPERCOMretry
1710 ; blok nieodczytany - dlugosc 1 sektora na $80
1711 2A58 Set1Sect128
1712 2A58 A9 00 LDA #$00
1713 2A5A 8D A4 2C STA PERCOMdata+6
1714 2A5D A9 80 LDA #$80
1715 2A5F 8D A5 2C STA PERCOMdata+7
1716 2A62 60 RTS
1717 2A63 blokDanychIO_PERCOM
1718 2A63 31 01 4E 40 .BY $31,$01,$4E,$40
1719 2A67 9E 2C .WO PERCOMdata
1720 2A69 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00
1721 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy)
1722 2A6F ReadFirstSect
1723 2A6F A9 01 LDA #$01
1724 2A71 8D BD 2A STA blokDanychIO+10
1725 2A74 A9 00 LDA #$00
1726 2A76 8D BE 2A STA blokDanychIO+11
1727 2A79 AD A4 2C LDA PERCOMdata+6
1728 2A7C 8D BC 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b
1729 2A7F AD A5 2C LDA PERCOMdata+7
1730 2A82 4C 8E 2A JMP ReadSector1
1731 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen)
1732 ; reszta danych jak nizej (A nie wazne)
1733 2A85 ReadSector
1734 2A85 AD B4 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b
1735 2A88 8D BC 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b
1736 2A8B AD B3 20 LDA .adr loader.SecLen ; przed przepisaniem
1737 2A8E ReadSector1
1738 2A8E 8D BB 2A STA blokDanychIO+8
1739 2A91 8E B8 2A STX blokDanychIO+5
1740 2A94 8C B7 2A STY blokDanychIO+4
1741 2A97 A9 04 LDA #$04
1742 2A99 8D BF 2A STA DiskRetryCount
1743 2A9C DiskReadRetry
1744 2A9C A0 B3 LDY #<blokDanychIO
1745 2A9E A2 2A LDX #>blokDanychIO
1746 2AA0 20 5B 2B JSR Table2DCB
1747 2AA3 20 50 2B JSR GoSIO
1748 2AA6 30 01 BMI label85
1749 2AA8 60 RTS
1750 2AA9 label85
1751 2AA9 CE BF 2A DEC DiskRetryCount
1752 2AAC D0 EE BNE DiskReadRetry
1753 2AAE 68 PLA
1754 2AAF 68 PLA
1755 2AB0 4C 07 22 JMP ErrorDisplay
1756 2AB3 blokDanychIO
1757 2AB3 31 01 52 40 .BY $31,$01,$52,$40
1758 2AB7 80 2D .WO DirMapSectorBuff
1759 2AB9 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00
1760 2ABF DiskRetryCount
1761 2ABF 00 .BY $00
1762 2AC0 PrintXY
1763 2AC0 68 PLA
1764 2AC1 85 C8 STA $C8
1765 2AC3 68 PLA
1766 2AC4 85 C9 STA $C9
1767 2AC6 A9 00 LDA #$00
1768 2AC8 85 DF STA $DF
1769 2ACA 20 42 2B JSR label87
1770 2ACD 48 PHA
1771 2ACE 20 42 2B JSR label87
1772 2AD1 85 DE STA $DE
1773 2AD3 0A ASL
1774 2AD4 0A ASL
1775 2AD5 18 CLC
1776 2AD6 65 DE ADC $DE
1777 2AD8 0A ASL
1778 2AD9 0A ASL
1779 2ADA 26 DF ROL $DF
1780 2ADC 0A ASL
1781 2ADD 26 DF ROL $DF
1782 2ADF 18 CLC
1783 2AE0 65 58 ADC SAVMSC
1784 2AE2 85 DE STA $DE
1785 2AE4 A5 DF LDA $DF
1786 2AE6 65 59 ADC SAVMSC+1
1787 2AE8 85 DF STA $DF
1788 2AEA 68 PLA
1789 2AEB A8 TAY
1790 2AEC label92
1791 2AEC 20 42 2B JSR label87
1792 2AEF C9 00 CMP #$00
1793 2AF1 F0 48 BEQ label88
1794 2AF3 C9 7D CMP #$7D
1795 2AF5 F0 21 BEQ label89
1796 2AF7 A2 00 LDX #$00
1797 2AF9 86 E0 STX $E0
1798 2AFB C9 80 CMP #$80
1799 2AFD 66 E0 ROR $E0
1800 2AFF 29 7F AND #$7F
1801 2B01 C9 20 CMP #$20
1802 2B03 B0 04 BCS label90
1803 2B05 09 40 ORA #$40
1804 2B07 D0 07 BNE label91
1805 2B09 label90
1806 2B09 C9 60 CMP #$60
1807 2B0B B0 03 BCS label91
1808 2B0D 38 SEC
1809 2B0E E9 20 SBC #$20
1810 2B10 label91
1811 2B10 05 E0 ORA $E0
1812 2B12 91 DE STA ($DE),Y
1813 2B14 C8 INY
1814 2B15 4C EC 2A JMP label92
1815 2B18 label89
1816 2B18 98 TYA
1817 2B19 48 PHA
1818 2B1A A5 58 LDA SAVMSC
1819 2B1C 85 E0 STA $E0
1820 2B1E A9 03 LDA #$03
1821 2B20 AA TAX
1822 2B21 18 CLC
1823 2B22 65 59 ADC SAVMSC+1
1824 2B24 85 E1 STA $E1
1825 2B26 A0 BF LDY #$BF
1826 2B28 A9 00 LDA #$00
1827 2B2A label93
1828 2B2A 91 E0 STA ($E0),Y
1829 2B2C 88 DEY
1830 2B2D C0 FF CPY #$FF
1831 2B2F D0 F9 BNE label93
1832 2B31 C6 E1 DEC $E1
1833 2B33 CA DEX
1834 2B34 10 F4 BPL label93
1835 2B36 68 PLA
1836 2B37 A8 TAY
1837 2B38 4C EC 2A JMP label92
1838 2B3B label88
1839 2B3B A5 C9 LDA $C9
1840 2B3D 48 PHA
1841 2B3E A5 C8 LDA $C8
1842 2B40 48 PHA
1843 2B41 60 RTS
1844 2B42 label87
1845 2B42 E6 C8 INC $C8
1846 2B44 D0 02 BNE label94
1847 2B46 E6 C9 INC $C9
1848 2B48 label94
1849 2B48 A2 00 LDX #$00
1850 2B4A A1 C8 LDA ($C8,X)
1851 2B4C 60 RTS
1852 2B4D GoErrorDisp
1853 2B4D 4C 07 22 JMP ErrorDisplay
1854 ; Skok do Sio lub procedury Turbo
1855 2B50 GoSIO
1856 2B50 AC 96 21 LDY USmode
1857 2B53 F0 03 BEQ StandardSpeed
1858 2B55 4C 36 28 JMP HappyUSMovedProc ; mozna skakac do tej procki
1859 2B58 StandardSpeed
1860 2B58 4C 59 E4 JMP JSIOINT
1861 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy)
1862 ; do bloku kontroli transmisji szeregowej DCB
1863 2B5B Table2DCB
1864 2B5B 8C 64 2B STY IOtableAddr+1
1865 2B5E 8E 65 2B STX IOtableAddr+2
1866 2B61 A2 0B LDX #$0B
1867 2B63 IOtableAddr
1868 2B63 BD FF FF LDA $FFFF,X
1869 2B66 9D 00 03 STA DDEVIC,X
1870 2B69 CA DEX
1871 2B6A 10 F7 BPL IOtableAddr
1872 2B6C 60 RTS
1873 2B6D Close1
1874 2B6D A2 10 LDX #$10
1875 2B6F CloseX
1876 2B6F A9 0C LDA #$0C
1877 2B71 9D 42 03 STA ICCMD,X
1878 2B74 4C 56 E4 JMP JCIOMAIN
1879 2B77 GetKey
1880 2B77 A2 10 LDX #$10
1881 2B79 A9 03 LDA #$03
1882 2B7B 9D 42 03 STA ICCMD,X
1883 2B7E A9 04 LDA #$04
1884 2B80 9D 4A 03 STA ICAX1,X
1885 2B83 A9 00 LDA #$00
1886 2B85 9D 4B 03 STA ICAX2,X
1887 2B88 9D 49 03 STA ICBUFL+1,X
1888 2B8B A9 FF LDA #$FF
1889 2B8D 9D 48 03 STA ICBUFL,X
1890 2B90 A9 BE LDA #<Kdriver
1891 2B92 9D 44 03 STA ICBUFA,X
1892 2B95 A9 2B LDA #>Kdriver
1893 2B97 9D 45 03 STA ICBUFA+1,X
1894 2B9A 20 56 E4 JSR JCIOMAIN
1895 2B9D 30 1C BMI GKeyError
1896 2B9F A2 10 LDX #$10
1897 2BA1 A9 00 LDA #$00
1898 2BA3 9D 48 03 STA ICBUFL,X
1899 2BA6 9D 49 03 STA ICBUFL+1,X
1900 2BA9 A9 07 LDA #$07
1901 2BAB 9D 42 03 STA ICCMD,X
1902 2BAE 20 56 E4 JSR JCIOMAIN
1903 2BB1 30 08 BMI GKeyError
1904 2BB3 48 PHA
1905 2BB4 20 6D 2B JSR Close1
1906 2BB7 30 02 BMI GKeyError
1907 2BB9 68 PLA
1908 2BBA 60 RTS
1909 2BBB GKeyError
1910 2BBB 4C 4D 2B JMP GoErrorDisp
1911 2BBE Kdriver
1912 2BBE 4B 3A 9B .BY "K:",$9B
1913 2BC1 DiscChangeCheck
1914 2BC1 A0 80 LDY #<DirMapSectorBuff
1915 2BC3 A2 2D LDX #>DirMapSectorBuff
1916 2BC5 20 6F 2A JSR ReadFirstSect
1917 2BC8 A2 7F LDX #$7F
1918 2BCA label98
1919 2BCA BD 00 2D LDA FirstSectorBuff,X
1920 2BCD DD 80 2D CMP DirMapSectorBuff,X
1921 2BD0 D0 05 BNE ChangedD
1922 2BD2 CA DEX
1923 2BD3 10 F5 BPL label98
1924 2BD5 A9 00 LDA #$00
1925 2BD7 ChangedD
1926 2BD7 60 RTS
1927 ; obsluga gwiazdki
1928 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od *
1929 ; w Y jest ) - X moze lepiej nie ruszac :)
1930 2BD8 Asteriks
1931 2BD8 A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy)
1932 2BDA 20 F6 2B JSR GetHexNumber
1933 2BDD 8D C5 02 STA COLPF1S ; literki
1934 2BE0 C8 INY
1935 2BE1 20 F6 2B JSR GetHexNumber
1936 2BE4 8D C6 02 STA COLPF2S ; tlo
1937 2BE7 C8 INY
1938 2BE8 20 F6 2B JSR GetHexNumber
1939 2BEB 8D C8 02 STA COLBAKS ; ramka
1940 2BEE C8 INY
1941 2BEF 20 F6 2B JSR GetHexNumber
1942 2BF2 8D 9A 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo)
1943 2BF5 60 RTS
1944 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX
1945 ; i zamienia na bajt w A
1946 2BF6 GetHexNumber
1947 2BF6 20 06 2C JSR GetHEX4bits
1948 2BF9 0A ASL
1949 2BFA 0A ASL
1950 2BFB 0A ASL
1951 2BFC 0A ASL
1952 2BFD 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda.
1953 2BFF C8 INY
1954 2C00 20 06 2C JSR GetHEX4bits
1955 2C03 05 E4 ORA TempZP
1956 2C05 60 RTS
1957 2C06 GetHEX4bits
1958 2C06 B1 D4 LDA ($D4),Y
1959 2C08 38 SEC
1960 2C09 E9 30 SBC #'0'
1961 2C0B C9 0A CMP #$0A ; sprawdzmy czy cyfra
1962 2C0D 90 02 BCC IsNumber
1963 2C0F E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow
1964 2C11 IsNumber
1965 2C11 60 RTS
1966 ; Ustawia numer satcji wg A
1967 2C12 SeTDriveNR
1968 2C12 C9 09 CMP #$09
1969 2C14 B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry
1970 2C16 20 34 2C JSR SeTblokDanychDrive
1971 2C19 18 CLC
1972 2C1A 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0
1973 2C1C 8D 49 23 STA DriveDisp1
1974 2C1F A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu
1975 2C21 8D 48 23 STA DriveDisp1-1
1976 2C24 60 RTS
1977 2C25 SeTDriveLetter
1978 2C25 20 34 2C JSR SeTblokDanychDrive
1979 2C28 18 CLC
1980 2C29 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu
1981 2C2B 8D 49 23 STA DriveDisp1
1982 2C2E A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja
1983 2C30 8D 48 23 STA DriveDisp1-1
1984 2C33 60 RTS
1985 2C34 SeTblokDanychDrive
1986 2C34 8D AC 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem
1987 2C37 8D B4 2A STA blokDanychIO+1
1988 2C3A 8D 36 29 STA blokDanychIO_GetUSSpeed+1
1989 2C3D 8D 64 2A STA blokDanychIO_PERCOM+1
1990 2C40 60 RTS
1991 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku
1992 2C41 MEMLOprint
1993 2C41 AD E7 02 LDA MEMLO
1994 2C44 48 PHA
1995 2C45 4A LSR
1996 2C46 4A LSR
1997 2C47 4A LSR
1998 2C48 4A LSR
1999 2C49 20 9C 21 JSR bin2AsciiHex
2000 2C4C 8D 7A 2C STA MEMLOvalue+2
2001 2C4F 68 PLA
2002 2C50 20 9C 21 JSR bin2AsciiHex
2003 2C53 8D 7B 2C STA MEMLOvalue+3
2004 2C56 AD E8 02 LDA MEMLO+1
2005 2C59 48 PHA
2006 2C5A 4A LSR
2007 2C5B 4A LSR
2008 2C5C 4A LSR
2009 2C5D 4A LSR
2010 2C5E 20 9C 21 JSR bin2AsciiHex
2011 2C61 8D 78 2C STA MEMLOvalue
2012 2C64 68 PLA
2013 2C65 20 9C 21 JSR bin2AsciiHex
2014 2C68 8D 79 2C STA MEMLOvalue+1
2015 2C6B 20 C0 2A JSR PrintXY
2016 2C6E 1C 17 .BY 28,23
2017 2C70 4D 45 4D 4C 4F 3A + .BY "MEMLO: $"
2018 2C78 MEMLOvalue
2019 2C78 30 30 30 30 .BY "0000"
2020 2C7C 00 .BY $00
2021 2C7D 60 RTS
2022
2023 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo
2024
2025 2C7E xjsrTableL
2026 2C7E 64 78 7E .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1]
2027 2C81 84 89 .BY <[xjsr4+1],<[xjsr5+1]
2028 2C83 95 9F AB .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1]
2029 2C86 B0 B8 .BY <[xjsr9+1],<[xjsrA+1]
2030 2C88 xjsrTableH
2031 2C88 28 28 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1]
2032 2C8B 28 28 .BY >[xjsr4+1],>[xjsr5+1]
2033 2C8D 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1]
2034 2C90 28 28 .BY >[xjsr9+1],>[xjsrA+1]
2035 ; miejsce na wyliczony offset o jaki przesuwamy procedure
2036 2C92 HappyOffset
2037 2C92 00 00 .WO $0000
2038 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :)
2039 2C94 DensityCodes
2040 2C94 F3 E4 F1 .by +$80,"sdq"
2041 ;.by "SDQ"
2042 ;.by $0e,$15,$a0
2043 2C97 ONtext
2044 2C97 CF CE A0 .BY +$80,"ON "
2045 2C9A OFFtext
2046 2C9A CF C6 C6 .BY +$80,"OFF"
2047 ; miejsce na przechowanie stanu urzadzen PBI (przez reset)
2048 2C9D PDVMASKtemp
2049 2C9D 00 .BY $00
2050 ; miejsce na blok PERCOM
2051 2C9E PERCOMdata
2052 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie
2053 = 2CAA FirstSectorsTable=*+12 ; omijamy 12b na percom
2054 ; zostawiamy $30 bajtow wolnego
2055
2056 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow
2057 = 2D00 ProgramEnd=FirstSectorBuff
2058 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu
2059 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu
2060 2C9E FirstRun
2061 ; odnotowujemy stan Shift z Bootowania
2062 2C9E AD 0F D2 LDA SKSTAT
2063 2CA1 29 08 and #$08
2064 2CA3 D0 03 BNE NoSHIFTboot
2065 2CA5 8D 99 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0
2066 2CA8 NoSHIFTboot
2067 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie
2068 2CA8 AD 01 D3 LDA PORTB
2069 2CAB 29 02 AND #$02
2070 2CAD D0 0B BNE BrakBasica
2071 ; jest Basic
2072 2CAF A0 02 LDY #$2
2073 2CB1 BASstatprint
2074 2CB1 B9 97 2C LDA ONtext,y
2075 2CB4 99 64 23 STA BASstatus,y
2076 2CB7 88 DEY
2077 2CB8 10 F7 bpl BASstatprint
2078 2CBA BrakBasica
2079 ; Sprawdzamy istnienie QMEGa
2080 2CBA A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy
2081 2CBC testQMEGloop
2082 2CBC B9 01 C0 LDA $C001,y
2083 2CBF D9 EF 2C CMP QMEGstring,y
2084 2CC2 D0 13 bne brakQMEGa
2085 2CC4 88 dey
2086 2CC5 10 F5 bpl testQMEGloop
2087 ; jest QMEG
2088 2CC7 A9 00 LDA #0
2089 2CC9 8D 97 21 STA QMEG
2090 2CCC A0 02 LDY #$2
2091 2CCE Qstatprint
2092 2CCE B9 97 2C LDA ONtext,y
2093 2CD1 99 5C 23 STA QMEGstatus,y
2094 2CD4 88 DEY
2095 2CD5 10 F7 bpl Qstatprint
2096 2CD7 brakQMEGa
2097 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi
2098 2CD7 AD 00 03 LDA DDEVIC
2099 2CDA 18 clc
2100 2CDB 6D 01 03 ADC DUNIT
2101 2CDE 38 sec
2102 2CDF E9 01 SBC #$01
2103 2CE1 29 0F AND #$0F ; zapamietanie numeru urzadzenia
2104 2CE3 8D 98 21 STA BootDrive
2105 2CE6 20 12 2C JSR SeTDriveNR
2106 2CE9 20 AB 21 JSR EditorOpen
2107 2CEC 4C D9 21 JMP mainprog
2108 2CEF QMEGstring
2109 2CEF 51 4D 45 47 2D 4F + .BY "QMEG-OS",0
2110 2CF7 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26"
2111 ;.OPT List
2112
2113
2114 = 0080 MAPCOUNTER
2114 = 0082 COMPRESSEDMAPCOUNTER
2114 = 0084 MAPCOUNTERMEM
2114 = 0086 PREVFILESECTOR
2114 = 0088 MAPPOSITIONMEM
2114 = 008A SECTOROFFSET
2114 = 008C SECTORSCOUNTER
2114 org $02e0
2115 02E0-02E1> FD 1F .WO START
2116 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera)
2117 ; OPT h-
2118 ; org $0000
2119 ; .WO $0000
2120