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 ; 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,$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 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 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 #= 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 #" 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 "") 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 "" 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 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 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 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 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 1223 2726 85 0D STA DOSINI+1 1224 ; LDA #>JRESETCD 1225 ; STA DOSVEC+1 1226 ; 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 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 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 ; -- 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 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 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 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 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