mads 2.1.7 build 3 (13 Sep 23) Source: loaderFN.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 55 icl 'lib/SYSEQU.ASM' Source: SYSEQU.ASM 1 ; .PAGE "FTe SYSTEM EQUATES FOR ATARI" 2 ; 3 ; FILE = #DN:SYSEQU.ASM 4 ; 5 ; 6 ; I/O CONTROL BLOCK EQUATES 7 ; 8 ;SAVEPC = * ; SAVE CURRENT ORG 9 ; 10 11 = 0340 IOCB = $0340 ;START OF SYSTEM IOCBS 12 ; 13 = 0340 ICHID = IOCB ;DEVICE HANDLER IS (SET BY OS) 14 = 0341 ICDNO = IOCB+1 ;DEVICE NUMBER (SET BY OS) 15 = 0342 ICCOM = IOCB+2 ;I/O COMMAND 16 = 0343 ICSTA = IOCB+3 ;I/O STATUS 17 = 0344 ICBADR = IOCB+4 ;BUFFER ADDRESS 18 = 0346 ICPUT = IOCB+6 ;DH PUT ROUTINE (ADR-1) 19 = 0348 ICBLEN = IOCB+8 ;BUFFER LENGTH 20 = 034A ICAUX1 = IOCB+10 ;AUX 1 21 = 034B ICAUX2 = IOCB+11 ;AUX 2 22 = 034C ICAUX3 = IOCB+12 ;AUX 3 23 = 034D ICAUX4 = IOCB+13 ;AUX 4 24 = 034E ICAUX5 = IOCB+14 ;AUX 5 25 = 034F ICAUX6 = IOCB+15 ;AUX 6 26 ; 27 = 0010 IOCBLEN = 16 ;LENGTH OF ONE IOCB 28 ; 29 ; IOCB COMMAND VALUE EQUATES 30 ; 31 = 0003 COPN = 3 ;OPEN 32 = 0007 CGBINR = 7 ;GET BINARY RECORD 33 = 0005 CGTXTR = 5 ;GET TEXT RECORD 34 = 000B CPBINR = 11 ;PUT BINARY RECORD 35 = 0009 CPTXTR = 9 ;PUT TEXT RECORD 36 = 000C CCLOSE = 12 ;CLOSE 37 = 000D CSTAT = 13 ;GET STATUS 38 ; 39 ; DEVICE DEPENDENT COMMAND EQUATES FOR FILE MANAGER 40 ; 41 = 0020 CREN = 32 ;RENAME 42 = 0021 CERA = 33 ;ERASE 43 = 0023 CPRO = 35 ;PROTECT 44 = 0024 CUNP = 36 ;UNPROTECT 45 = 0025 CPOINT = 37 ;POINT 46 = 0026 CNOTE = 38 ;NOTE 47 ; 48 ; AUX1 VALUES REQD FOR OPEN 49 ; 50 = 0004 OPIN = 4 ;OPEN INPUT 51 = 0008 OPOUT = 8 ;OPEN OUTPUT 52 = 000C OPUPD = 12 ;OPEN UPDATE 53 = 0009 OPAPND = 9 ;OPEN APPEND 54 = 0006 OPDIR = 6 ;OPEN DIRECTORY 55 ; 56 ; .PAGE 57 ; 58 ; EXECUTE FLAG DEFINES 59 ; 60 = 0080 EXCYES = $80 ; EXECUTE IN PROGRESS 61 = 0040 EXCSCR = $40 ; ECHO EXCUTE INPUT TO SCREEN 62 = 0010 EXCNEW = $10 ; EXECUTE START UP MODE 63 = 0020 EXCSUP = $20 ; COLD START EXEC FLAG 64 ; 65 ; MISC ADDRESS EQUATES 66 ; 67 = 000A CPALOC = $0A ; POINTER TO CP/A 68 = 0008 WARMST = $08 ; WAR, START (0=COLD) 69 = 02E7 MEMLO = $02E7 ; AVAIL MEM (LOW) PTR 70 = 02E5 MEMTOP = $02E5 ; AVAIL MEM (HIGH) PTR 71 = 000E APPMHI = $0E ; UPPER LIMIT OF APPLICATION MEMORY 72 = 02E2 INITADR = $02E2 ; ATARI LOAD/INIT ADR 73 = 02E0 GOADR = $02E0 ; ATARI LOAD/GO ADR 74 = BFFA CARTLOC = $BFFA ; CARTRIDGE RUN LOCATION 75 = E456 CIO = $E456 ;CIO ENTRY ADR 76 = 009B EOL = $9B ; END OF LINE CHAR 77 ; 78 ; CP/A FUNCTION AND VALUE DISPLACEMSNT 79 ; (INDIRECT THROUGH CPALOC) 80 ; IE. (CPALOC),Y 81 ; 82 = 0003 CPGNFN = 3 ; GET NEXT FILE NAME 83 = 0007 CPDFDV = $07 ; DEFAULT DRIVE (3 BYTES) 84 = 000A CPBUFP = $0A ; CMD BUFF NEXT CHAR POINTR (1 BYTE) 85 = 000B CPEXFL = $0B ; EXECUTE FLAG 86 = 000C CPEXFN = $0C ; EXECUTE FILE NAME (16 BYTES) 87 = 001C CPEXNP = $1C ; EXECUTE NOTE/POINT VALUES 88 = 0021 CPFNAM = $21 ; FILENAME BUFFER 89 = 003D RUNLOC = $3D ; CP/A LOAD/RUN ADR 90 = 003F CPCMDB = $3F ; COMMAND BUFFER (60 BYTES) 91 = 00F3 CPCMDGO = $F3 92 ; 93 ; *= SAVEPC ; RESTORE PC 94 ; 56 57 58 = 000A acktimeout = $a 59 = 0002 readtimeout = 2 60 61 62 = 0318 STACKP = $0318 63 = 0042 CRITIC = $42 64 = 02BD DRETRY = $02BD 65 = 030F CASFLG = $030F 66 = 029C CRETRY = $029C 67 68 69 = 0002 CASINI = $02 70 ;WARMST = $08 71 = 0009 BOOT = $09 72 = 000A DOSVEC = $0a 73 = 000C DOSINI = $0c 74 ;APPMHI = $0e 75 76 = 0010 IRQENS = $10 77 78 79 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) 80 81 ; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku 82 = 0064 InBlockAddr = $64 ; word 83 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) 84 = 0066 ToBlockEnd = $66 ; word 85 = 0066 BlockLen = $66 ; word 86 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH 87 = 0028 ToFileEndL = $28 88 = 0068 BlockATemp = $68 89 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku 90 91 = 0030 CheckSUM = $30 92 = 0031 SecLenUS = $31 93 = 0032 SecBuffer = $32 94 = 0034 CRETRYZ = $34 95 = 0035 TransmitError =$35 96 = 0036 Looperka = $36 97 = 0037 StackCopy = $37 98 99 100 = 0058 SAVMSC = $58 101 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego 102 ; katalog 103 = 00CA CurrentDirBuf = $CA 104 ; adres konca tego bufora (2 bajty) 105 = 00CC CurrentDirBufEnd = $CC 106 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji 107 ; o obrabianym pliku (skok co $17) 108 = 00D0 CurrentFileInfoBuff = $D0 109 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) 110 = 00D2 DirMapSect = $D2 111 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu 112 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji 113 ; ma byc wyswietlany katalog od poczatku 114 = 00D6 LastFilesPageFlag = $D6 115 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony 116 ; zawiera liczbe widocznych na ekranie plikow (1 bajt) 117 = 00D9 NamesOnScreen = $D9 118 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna 119 ; wczesniej byl 1 bajt w $D6 120 = 00E2 InMapPointer = $E2 121 ; zmienna tymczasowa na ZP (2 bajty) 122 = 00E4 TempZP = $E4 123 124 = 020A VSERIN = $020a 125 = 02C5 COLPF1S = $02c5 126 = 02C6 COLPF2S = $02c6 127 = 02C8 COLBAKS = $02c8 128 129 = 0244 COLDST = $0244 130 ;MEMTOP = $02e5 131 ;MEMLO = $02e7 132 133 = 02FC KBCODES = $02fc 134 135 = 0300 DDEVIC = $0300 136 = 0301 DUNIT = $0301 137 = 0302 DCOMND = $0302 138 = 0304 DBUFA = $0304 139 = 0308 DBYT = $0308 140 = 030A DAUX1 = $030a 141 = 030B DAUX2 = $030b 142 143 = 0342 ICCMD = $0342 144 = 0344 ICBUFA = $0344 145 ;ICBUFA+1 = $0345 146 = 0348 ICBUFL = $0348 147 ;ICBUFL+1 = $0349 148 = 034A ICAX1 = $034a 149 = 034B ICAX2 = $034b 150 151 = 03FA GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta 152 153 = D204 AUDF3 = $d204 154 = D206 AUDF4 = $d206 155 = D207 AUDC4 = $d207 156 = D208 AUDCTL = $d208 157 = D20A SKSTRES = $d20a 158 = D20D SEROUT = $D20d 159 = D20D SERIN = $D20d 160 = D20E IRQEN = $D20e 161 = D20E IRQST = $D20e 162 163 164 = D20F SKSTAT = $d20f 165 = D20F SKCTL = $d20f 166 167 168 = D303 PBCTL = $d303 169 = D301 PORTB = $d301 170 171 = D40B VCOUNT = $D40B 172 173 = E456 JCIOMAIN = $e456 174 = E459 JSIOINT = $e459 175 = E471 JTESTROM = $e471 176 = E474 JRESETWM = $e474 177 = E477 JRESETCD = $e477 178 179 org $1FFD 180 181 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura 182 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! 183 = 07BE FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu 184 = 07BE TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) 185 186 START 187 FFFF> 1FFD-2CCC> 4C 0B + JMP FirstRun ;1FFD 4C 70 21 188 189 190 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu 191 ; do wczytania !!!!!! 192 193 2000 movedproc 194 0700 .local loader, $0700 195 196 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 197 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych 198 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO 199 0700 ToFileEndH 200 0700 00 00 .WO $0000 201 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym 202 0702 20 7A 07 JSR GoInitAddr 203 0705 FileNextBlock 204 ; wczytanie kolejnego bloku binarnego 205 0705 20 6F 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) 206 0708 C0 88 CPY #$88 ; czy EOF 207 070A D0 03 4C 8D 07 jeq EndOfFile 208 070F A5 64 LDA InBlockAddr 209 0711 25 65 AND InBlockAddr+1 210 0713 C9 FF CMP #$FF ; jesli oba sa $FF to..... 211 0715 D0 03 BNE FileNoFFFFHead 212 0717 20 6F 07 JSR FileGetBlockStart ; pobranie jeszcze raz 213 071A FileNoFFFFHead 214 071A A5 64 85 68 A5 65 + mwa InBlockAddr BlockATemp ; zapamietanie adresu poczatkowego bloku (na chwile) 215 0722 A9 66 LDA #BlockLen 218 0728 85 65 sta InBlockAddr+1 219 072A 20 97 07 JSR GetFile2Bytes ; pobranie dwoch bajtow - ; Pobranie adresu konca ladowanego bloku 220 072D C0 88 CPY #$88 ; czy EOF 221 072F F0 5C beq EndOfFile 222 ; wyliczenie długości bloku programu binarnego 223 0731 38 sec 224 0732 A5 66 lda BlockLen 225 0734 E5 68 sbc BlockATemp 226 0736 85 66 sta BlockLen 227 0738 A5 67 lda BlockLen+1 228 073A E5 69 sbc BlockATemp+1 229 073C 85 67 sta BlockLen+1 230 073E E6 66 D0 02 E6 67 inw BlockLen 231 0744 A5 68 85 64 A5 69 + mwa BlockATemp InBlockAddr ; odtworzenie adresu poczatkowego bloku 232 074C 38 SEC 233 074D WhatIsIt 234 074D B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y 235 ; ktory tylko wylacza skok !!! 236 074F CE 4D 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! 237 0752 A5 64 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ 238 0754 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu 239 0757 A5 65 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem 240 0759 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). 241 075C FileNoFirstBlock 242 075C A9 96 LDA #Jrts ; jesli nie jest to blok z adresem inicjacji 245 0763 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie 246 247 0766 BlockReadLoop ;; petla odczytujaca z pliku blok binarny 248 0766 20 9F 07 JSR GetFileBytes 249 0769 C0 88 CPY #$88 ; czy EOF 250 076B F0 20 beq EndOfFile 251 076D D0 93 jne FileInit ; koniec bloku - skok pod adres inicjalizacji 252 076F FileGetBlockStart 253 076F A9 64 LDA #InBlockAddr 256 0775 85 65 sta InBlockAddr+1 257 0777 4C 97 07 JMP GetFile2Bytes ; pobranie dwoch bajtow 258 077A GoInitAddr 259 077A 6C E2 02 JMP ($02E2) 260 077D SioJMP 261 077D 20 59 E4 JSR JSIOINT 262 ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie 263 0780 60 RTS 264 0781 blokDanychIO_Loader 265 0781 31 01 52 40 BE 07 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 266 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) 267 = 0789 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 268 078B SectorNumber 269 078B 00 00 .WO $0000 270 078D EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku 271 078D A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu 272 078F 48 PHA 273 0790 A9 73 LDA #<(JRESETWM-1) 274 0792 48 PHA 275 ;WaitLine0 276 ; LDA VCOUNT 277 ; bne WaitLine0 278 0793 6C E0 02 JMP ($02E0) 279 0796 Jrts 280 0796 60 RTS 281 0797 GetFile2Bytes 282 0797 A9 02 85 66 A9 00 + mwa #2 BlockLen 283 079F GetFileBytes 284 079F A2 10 LDX #16 ; kanal 1 285 07A1 A9 07 LDA #CGBINR ; rozkaz BGET 286 07A3 9D 42 03 STA ICCOM,X ; COMMAND 287 07A6 A5 64 LDA InBlockAddr 288 07A8 9D 44 03 STA ICBUFA,x 289 07AB A5 65 LDA InBlockAddr+1 290 07AD 9D 45 03 STA ICBUFA+1,x 291 07B0 A5 66 LDA BlockLen 292 07B2 9D 48 03 STA ICBUFL,x 293 07B5 A5 67 LDA BlockLen+1 294 07B7 9D 49 03 STA ICBUFL+1,x 295 07BA 4C 56 E4 JMP CIO 296 297 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X 298 ; potrzebny do obslugi sektorow wiekszych od 256b 299 07BD InSectorCountH 300 07BD 00 .BY $00 301 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 302 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz 303 ; w tym miejscu potem bedzie bufor 304 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora 305 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania 306 07BE zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie 307 07BE FirstMapSectorNr 308 07BE 00 00 .WO $0000 309 07C0 LoadStart 310 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP 311 07C0 AC E7 02 LDY MEMLO 312 07C3 AD E8 02 LDA MEMLO+1 313 07C6 8D CD 07 STA InMemClearLoop+2 314 07C9 OutMemClearLoop 315 07C9 A9 00 LDA #$00 316 07CB InMemClearLoop 317 07CB 99 00 09 STA $0900,Y 318 07CE C8 INY 319 07CF D0 FA BNE InMemClearLoop 320 07D1 EE CD 07 INC InMemClearLoop+2 321 07D4 AD CD 07 LDA InMemClearLoop+2 322 07D7 CD E6 02 CMP MEMTOP+1 323 07DA 90 ED BCC OutMemClearLoop 324 07DC AD E6 02 LDA MEMTOP+1 325 07DF 8D E9 07 STA LastMemPageClear+2 326 07E2 AC E5 02 LDY MEMTOP 327 07E5 A9 00 LDA #$00 328 07E7 LastMemPageClear 329 07E7 99 00 80 STA $8000,Y 330 07EA 88 DEY 331 07EB C0 FF CPY #$FF 332 07ED D0 F8 BNE LastMemPageClear 333 ; wyczyszczona, wiec .... 334 07EF AD 08 08 LDA tempToFileEndL 335 07F2 85 28 STA ToFileEndL 336 07F4 A9 FF LDA #$FF 337 07F6 8D FC 02 STA KBCODES 338 07F9 EE 4D 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) 339 07FC AE 89 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora 340 07FF AD 8A 07 LDA Seclen+1 ; -- 341 0802 8D BD 07 STA InSectorCountH ; -- obsluga sektorow ponad 256b 342 ;jmp * 343 0805 4C 05 07 JMP FileNextBlock 344 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku 345 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera 346 0808 tempToFileEndL 347 0808 00 .BY $00 348 .endl 349 2109 JAkieTurbo 350 2109 USmode 351 2109 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed 352 210A QMEG 353 210A 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG 354 210B BootDrive 355 210B 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi 356 210C BootShift 357 210C 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety 358 210D FolderTurbo 359 210D 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT 360 210E NewColors 361 210E 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano 362 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) 363 210F bin2AsciiHex 364 210F 29 0F AND #$0F 365 2111 09 30 ORA #$30 366 2113 C9 3A CMP #$3A 367 2115 90 03 BCC labelka 368 2117 18 CLC 369 2118 69 07 ADC #$07 370 211A labelka 371 211A 60 RTS 372 211B Edriver 373 211B 45 3A 9B .BY "E:",$9b 374 211E EditorOpen 375 ; otwarcie ekranu !!! 376 211E A2 00 LDX #$00 ; kanal nr 0 377 2120 20 DC 2A JSR CloseX ; najpierw Zamkniecie Ekranu 378 2123 30 55 BMI ErrorDisplay 379 2125 A2 00 LDX #$00 ; kanal nr 0 380 2127 A9 03 LDA #$03 381 2129 9D 42 03 STA ICCMD,X 382 212C A9 0C LDA #$0C 383 212E 9D 4A 03 STA ICAX1,X 384 2131 9D 48 03 STA ICBUFL,X 385 2134 A9 00 LDA #$00 386 2136 9D 4B 03 STA ICAX2,X 387 2139 9D 49 03 STA ICBUFL+1,X 388 213C A9 1B LDA #Edriver 391 2143 9D 45 03 STA ICBUFA+1,X 392 2146 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 393 2149 30 2F BMI ErrorDisplay 394 214B 60 RTS 395 396 214C mainprog 397 214C AD 0A 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US 398 214F 2D 0C 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza 399 2152 8D 09 21 STA USmode 400 2155 F0 1E BEQ NoUSSpeed 401 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler 402 2157 A0 A2 ldy #blokDanychIO_GetUSSpeed 404 215B 20 C8 2A jsr Table2DCB 405 215E 20 59 E4 jsr JSIOINT ; wysylamy "?" 406 2161 10 07 bpl USSpeed 407 2163 A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage 408 2165 8D 09 21 sta USmode 409 2168 F0 0B beq NoUSSpeed 410 216A USSpeed 411 216A A0 02 LDY #$2 412 216C USstatprint 413 216C B9 04 2C LDA ONtext,y 414 216F 99 DE 22 STA USstatus,y 415 2172 88 DEY 416 2173 10 F7 bpl USstatprint 417 418 2175 NoUSSpeed 419 2175 4C BB 21 JMP ReadMainDir 420 2178 Error148 421 2178 A0 94 LDY #$94 ; kod bledu do Y 422 ; wyswietlenie komunikatu o bledzie - kod bledu w Y 423 217A ErrorDisplay 424 217A 98 TYA 425 217B 48 PHA 426 217C 20 DA 2A JSR Close1 427 217F 68 PLA 428 2180 48 PHA 429 2181 4A LSR 430 2182 4A LSR 431 2183 4A LSR 432 2184 4A LSR 433 2185 20 0F 21 JSR bin2AsciiHex ; 4 starsze bity na HEX 434 2188 8D A1 21 STA ErrorNumHex 435 218B 68 PLA 436 218C 20 0F 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX 437 218F 8D A2 21 STA ErrorNumHex+1 438 2192 20 2D 2A JSR PrintXY 439 2195 00 00 .BY $00,$00 440 2197 7D .BY $7d ; kod czyszczenia ekranu 441 2198 45 52 52 4F 52 20 + .BY "ERROR - $" 442 21A1 ErrorNumHex 443 21A1 30 30 00 .BY "00",$00 444 ; czekamy na dowolny klawisz 445 21A4 A9 FF LDA #$FF 446 21A6 8D FC 02 STA KBCODES 447 21A9 WaitKloop 448 21A9 AE FC 02 LDX KBCODES 449 21AC E8 INX 450 21AD F0 FA BEQ WaitKloop 451 21AF 8D FC 02 STA KBCODES ; w A jest $FF 452 ; ------------------ 453 ; na wypadek wybrania nieistniejacej stacji 454 ; po bledzie przechodzimy na te z ktorej sie ladowalismy 455 21B2 AD 0B 21 LDA BootDrive 456 ;LDA #1 457 21B5 20 7F 2B JSR SeTDriveNR 458 ; ----------------- 459 21B8 4C 4C 21 JMP mainprog ; i odpalamy program od nowa 460 21BB ReadMainDir 461 21BB 20 A7 29 JSR ReadPERCOM 462 21BE A2 2D LDX #>FirstSectorBuff 463 21C0 A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) 472 21D2 D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki 473 21D4 SpartaDisk 474 21D4 A2 00 LDX #$00 475 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 476 21D6 AD 1F 2D LDA FirstSectorBuff+$1F 477 21D9 30 04 BMI Sektor128b 478 21DB AA TAX 479 21DC A9 00 LDA #$00 480 21DE E8 INX ; i wyliczenie starszego bajtu 481 21DF Sektor128b 482 21DF 8D 89 20 STA .adr loader.SecLen ; przed przepisaniem 483 21E2 8E 8A 20 STX .adr loader.SecLen+1 ; przed przepisaniem 484 ; pokazanie na ekranie 485 21E5 BD 01 2C LDA DensityCodes,X 486 21E8 8D BA 22 STA DensityDisplay 487 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu 488 21EB AC 09 2D LDY FirstSectorBuff+$09 489 21EE AE 0A 2D LDX FirstSectorBuff+$0A 490 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x 491 21F1 ReadDIR 492 ; ustawienie znacznika wlaczenia Turbo dla katalogu 493 21F1 A9 01 LDA #$01 494 21F3 8D 0D 21 STA FolderTurbo 495 21F6 84 D2 STY DirMapSect 496 21F8 86 D3 STX DirMapSect+1 497 21FA A9 2F LDA #>DirSectorBuff 498 21FC 85 D1 STA CurrentFileInfoBuff+1 499 21FE 85 CB STA CurrentDirBuf+1 500 2200 A9 80 LDA #" 642 2340 3A 4D 61 69 6E 20 + .BY ":Main Dir. " 643 234C BC .BY +$80,"<" 644 234D 3A 55 50 2D 44 49 + .BY ":UP-DIR." 645 2355 00 .BY $00 646 2356 A9 00 LDA #$00 647 2358 85 D9 STA NamesOnScreen 648 235A label68 649 235A A5 D1 LDA CurrentFileInfoBuff+1 650 235C C5 CD CMP CurrentDirBufEnd+1 651 235E 90 08 BCC NoLastFileInDir 652 2360 D0 55 BNE LastFilesPageJump 653 2362 A5 D0 LDA CurrentFileInfoBuff 654 2364 C5 CC CMP CurrentDirBufEnd 655 2366 B0 4F BCS LastFilesPageJump 656 2368 NoLastFileInDir 657 2368 A0 00 LDY #$00 658 236A B1 D0 LDA (CurrentFileInfoBuff),Y 659 236C F0 49 BEQ LastFilesPageJump 660 236E A2 22 LDX #$22 661 2370 A9 20 LDA #$20 ; spacja 662 2372 label50 663 2372 9D 23 24 STA GameName,X 664 2375 CA DEX 665 2376 10 FA BPL label50 666 2378 A0 10 LDY #$10 667 237A A2 0A LDX #$0A 668 237C label51 669 237C B1 D0 LDA (CurrentFileInfoBuff),Y 670 237E 9D 23 24 STA GameName,X 671 2381 88 DEY 672 2382 CA DEX 673 2383 10 F7 BPL label51 674 2385 A5 D9 LDA NamesOnScreen 675 2387 18 CLC 676 2388 69 41 ADC #$41 ; literka "A" 677 238A 8D 20 24 STA GameKeySymbol 678 238D A5 D8 LDA $D8 679 238F D0 2C BNE label52 680 2391 A0 00 LDY #$00 681 ; status sprawdzanego pliku 682 2393 B1 D0 LDA (CurrentFileInfoBuff),Y 683 2395 29 19 AND #$19 684 2397 C9 09 CMP #$09 685 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" 686 2399 F0 08 BEQ label53 687 239B A6 D7 LDX $D7 688 239D F0 1B BEQ label54 689 239F C9 08 CMP #$08 690 23A1 D0 17 BNE label54 691 23A3 label53 692 ; jeszcze raz status sprawdzanego pliku 693 23A3 B1 D0 LDA (CurrentFileInfoBuff),Y 694 23A5 29 20 AND #$20 695 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) 696 23A7 F0 0B BEQ label55 697 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") 698 23A9 A2 08 LDX #$08 699 23AB label56 700 23AB BD 32 25 LDA SubDirText,X 701 23AE 8D 2F 24 STA GameName+12 702 23B1 CA DEX 703 23B2 10 F7 BPL label56 704 23B4 label55 705 23B4 4C 13 24 JMP GameNamePrint 706 23B7 LastFilesPageJump 707 23B7 4C BB 24 JMP LastFilesPage 708 23BA label54 709 23BA 4C 6B 24 JMP label59 710 23BD label52 711 23BD A0 00 LDY #$00 712 23BF B1 D0 LDA (CurrentFileInfoBuff),Y 713 23C1 29 18 AND #$18 714 23C3 C9 08 CMP #$08 715 23C5 D0 F3 BNE label54 716 23C7 A5 CC LDA CurrentDirBufEnd 717 23C9 85 D4 STA $D4 718 23CB A5 CD LDA CurrentDirBufEnd+1 719 23CD 85 D5 STA $D5 720 23CF label65 721 23CF A5 D5 LDA $D5 722 23D1 C5 CF CMP $CF 723 23D3 90 08 BCC label60 724 23D5 D0 E3 BNE label54 725 23D7 A5 D4 LDA $D4 726 23D9 C5 CE CMP $CE 727 23DB B0 DD BCS label54 728 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy 729 23DD label60 730 23DD A0 00 LDY #$00 731 23DF B1 D4 LDA ($D4),Y 732 23E1 C9 2A CMP #'*' 733 23E3 D0 06 BNE CompareNames 734 23E5 8D 0E 21 STA NewColors 735 23E8 20 45 2B JSR Asteriks 736 23EB CompareNames 737 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT 738 23EB A0 0A LDY #$0A ; 8+3 znaki 739 23ED Checking62 740 23ED B1 D4 LDA ($D4),Y 741 23EF D9 23 24 CMP GameName,Y 742 23F2 D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw 743 23F4 88 DEY 744 23F5 10 F6 BPL Checking62 745 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku 746 23F7 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku 747 23F9 ReplacingName 748 23F9 B1 D4 LDA ($D4),Y 749 23FB 99 18 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania 750 23FE C8 INY 751 23FF C0 2E CPY #$2E 752 2401 90 F6 BCC ReplacingName 753 2403 B0 0E BCS GameNamePrint 754 2405 CheckNextName 755 2405 A5 D4 LDA $D4 756 2407 18 CLC 757 2408 69 2E ADC #$2E 758 240A 85 D4 STA $D4 759 240C 90 02 BCC label64 760 240E E6 D5 INC $D5 761 2410 label64 762 2410 4C CF 23 JMP label65 763 2413 GameNamePrint 764 2413 A5 D9 LDA NamesOnScreen 765 2415 18 CLC 766 2416 69 02 ADC #$02 767 2418 8D 1F 24 STA YposGameName 768 241B 20 2D 2A JSR PrintXY 769 241E 01 .BY $01 770 241F YposGameName 771 241F 02 .BY $02 772 2420 GameKeySymbol 773 2420 41 29 20 .BY "A) " 774 2423 GameName 775 2423 20 20 20 20 20 20 + .BY " " 776 2446 00 .BY $00 777 2447 A5 D9 LDA NamesOnScreen 778 2449 0A ASL 779 244A AA TAX 780 244B A5 D0 LDA CurrentFileInfoBuff 781 244D 9D 17 2C STA FirstSectorsTable,X 782 2450 A5 D1 LDA CurrentFileInfoBuff+1 783 2452 9D 18 2C STA FirstSectorsTable+1,X 784 2455 A5 D0 LDA CurrentFileInfoBuff 785 2457 18 CLC 786 2458 69 17 ADC #$17 787 245A 85 D0 STA CurrentFileInfoBuff 788 245C 90 02 BCC label66 789 245E E6 D1 INC CurrentFileInfoBuff+1 790 2460 label66 791 2460 E6 D9 INC NamesOnScreen 792 2462 A5 D9 LDA NamesOnScreen 793 2464 C9 13 CMP #$13 794 2466 B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie 795 2468 4C 5A 23 JMP label68 796 246B label59 797 246B A5 D0 LDA CurrentFileInfoBuff 798 246D 18 CLC 799 246E 69 17 ADC #$17 800 2470 85 D0 STA CurrentFileInfoBuff 801 2472 90 02 BCC label69 802 2474 E6 D1 INC CurrentFileInfoBuff+1 803 2476 label69 804 2476 4C 5A 23 JMP label68 805 2479 MainDirKEY 806 2479 4C BB 21 JMP ReadMainDir 807 247C UpDirKEY 808 247C A0 02 LDY #$02 809 247E B1 CA LDA (CurrentDirBuf),Y 810 2480 AA TAX 811 2481 88 DEY 812 2482 11 CA ORA (CurrentDirBuf),Y 813 2484 F0 37 BEQ KeyboardProc 814 2486 B1 CA LDA (CurrentDirBuf),Y 815 2488 A8 TAY 816 2489 4C F1 21 JMP ReadDIR 817 248C EscKEY 818 ; sprawdzmy czy z Shift 819 248C AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! 820 248F 29 08 and #$08 821 2491 D0 06 BNE NoSHIFTEsc 822 2493 20 1E 21 JSR EditorOpen 823 2496 6C 0A 00 JMP (DOSVEC) 824 2499 NoSHIFTEsc 825 2499 A2 00 LDX #$00 826 249B 86 D8 STX $D8 827 249D E8 INX 828 249E 86 D7 STX $D7 829 24A0 ToStartOfDirJump 830 24A0 4C A3 22 JMP ToStartOfDir 831 24A3 SpaceKEY 832 24A3 A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy 833 24A5 D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku 834 24A7 4C B4 22 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej 835 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie 836 24AA ContArrowsPrint 837 24AA 20 2D 2A JSR PrintXY 838 24AD 01 15 .BY $01,$15 839 24AF 1D .BY $1D ; strzalka w dol 840 24B0 00 .BY $00 841 24B1 20 2D 2A JSR PrintXY 842 24B4 0E 15 .BY $0E,$15 843 24B6 1D .BY $1D ; strzalka w dol 844 24B7 00 .BY $00 845 24B8 4C BD 24 JMP KeyboardProc 846 24BB LastFilesPage 847 24BB E6 D6 INC LastFilesPageFlag 848 24BD KeyboardProc 849 24BD AD 0E 21 LDA NewColors 850 24C0 D0 0D BNE ColorsAlreadySet 851 24C2 A9 C4 LDA #$C4 ; ustawienie koloru tła i liter 852 24C4 8D C6 02 STA COLPF2S 853 24C7 8D C8 02 STA COLBAKS 854 24CA A9 CA LDA #$CA 855 24CC 8D C5 02 STA COLPF1S 856 24CF ColorsAlreadySet 857 24CF 20 E4 2A JSR GetKey 858 24D2 29 7F AND #%01111111 ; eliminujemy invers 859 24D4 F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu 860 24D6 C9 3E CMP #$3E ; ">" 861 24D8 F0 9F BEQ MainDirKEY 862 24DA C9 3C CMP #$3C ; "<" 863 24DC F0 9E BEQ UpDirKEY 864 24DE C9 7E CMP #$7E ; BackSpace 865 24E0 F0 9A BEQ UpDirKEY 866 24E2 C9 1B CMP #$1B ; Esc 867 24E4 F0 A6 BEQ EscKEY 868 24E6 C9 20 CMP #$20 ; Spacja 869 24E8 F0 B9 BEQ SpaceKEY 870 ; ---------------- 871 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) 872 24EA C9 10 CMP #$10 873 24EC B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) 874 24EE 20 92 2B JSR SeTDriveLetter 875 24F1 4C 4C 21 JMP mainprog 876 24F4 noCtrlLetter 877 ; sprawdzenie klawiszy 1-8 878 24F4 C9 31 CMP #'1' 879 24F6 90 0D BCC NoNumber 880 24F8 C9 39 CMP #'9' 881 24FA B0 09 BCS NoNumber 882 24FC 38 SEC 883 24FD E9 30 SBC #'0' 884 24FF 20 7F 2B JSR SeTDriveNR 885 2502 4C 4C 21 JMP mainprog 886 ; ----------------- 887 2505 NoNumber 888 2505 C9 61 CMP #'a' ; czy nie ma capsa 889 2507 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany 890 2509 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) 891 250B BigLetters 892 250B 38 SEC 893 250C E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy 894 250E C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie 895 2510 B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz 896 2512 0A ASL 897 2513 AA TAX 898 2514 BD 17 2C LDA FirstSectorsTable,X 899 2517 85 D4 STA $D4 900 2519 BD 18 2C LDA FirstSectorsTable+1,X 901 251C 85 D5 STA $D5 902 251E A0 00 LDY #$00 903 2520 B1 D4 LDA ($D4),Y 904 2522 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik 905 2524 F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader 906 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran 907 2526 A0 02 LDY #$02 908 2528 B1 D4 LDA ($D4),Y 909 252A AA TAX 910 252B 88 DEY 911 252C B1 D4 LDA ($D4),Y 912 252E A8 TAY 913 252F 4C F1 21 JMP ReadDIR 914 2532 SubDirText 915 2532 3C 53 55 42 2D 44 + .BY "" 916 253B GOtoLoader 917 253B 20 2E 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka 918 253E F0 03 BEQ DiskNotChanged1 919 2540 4C BB 21 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego 920 2543 DiskNotChanged1 921 2543 AD 0D 21 LDA FolderTurbo 922 2546 F0 07 BEQ SetTurboOFF 923 2548 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! 924 254B 29 08 and #$08 925 254D D0 03 BNE NoSHIFT 926 254F SetTurboOFF 927 254F 8D 09 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 928 2552 NoSHIFT 929 2552 A0 01 LDY #$01 930 2554 B1 D4 LDA ($D4),Y 931 2556 8D BE 20 STA .adr loader.FirstMapSectorNr ; przed przepisaniem 932 2559 8D 2A 2A sta blokDanychIO+$A ; od razu do bloku IOCB 933 255C C8 INY 934 255D B1 D4 LDA ($D4),Y 935 255F 8D BF 20 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem 936 2562 8D 2B 2A sta blokDanychIO+$B ; od razu do bloku IOCB 937 2565 C8 INY 938 2566 B1 D4 LDA ($D4),Y 939 2568 49 FF EOR #$FF 940 256A 8D 08 21 STA .adr loader.tempToFileEndL 941 256D C8 INY 942 256E B1 D4 LDA ($D4),Y 943 2570 49 FF EOR #$FF 944 2572 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem 945 2575 C8 INY 946 2576 B1 D4 LDA ($D4),Y 947 2578 49 FF EOR #$FF 948 257A 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem 949 ; wszystko zapamietane mozna robic mape sektorow.... 950 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu 951 ; czyli DirSectorBuff 952 ; sektor mapy przed kompresja leci do DirMapSectorBuff 953 ; UWAGA 954 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi 955 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! 956 = 2F80 CompressedMap = DirSectorBuff 957 ; czytamy pierwszy sektor mapy 958 257D A0 80 LDY #DirMapSectorBuff 960 2581 20 F2 29 Jsr ReadSector 961 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! 962 2584 A9 00 LDA #00 963 2586 85 82 STA CompressedMapCounter 964 2588 85 83 STA CompressedMapCounter+1 965 258A 20 56 26 JSR AddToCompressedMAP 966 258D AD 84 2D LDA DirMapSectorBuff+4 967 2590 85 86 STA PrevFileSector 968 2592 20 56 26 JSR AddToCompressedMAP 969 2595 AD 85 2D LDA DirMapSectorBuff+5 970 2598 85 87 sta PrevFileSector+1 971 259A 20 56 26 JSR AddToCompressedMAP 972 ; Inicjujemy liczniki 973 259D .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 974 259D .zpvar PrevFileSector, MapPositionMem .word 975 259D .zpvar SectorOffset .word 976 259D .zpvar SectorsCounter .byte 977 259D A9 00 LDA #$00 978 259F 85 81 STA MapCounter+1 979 25A1 85 8C STA SectorsCounter 980 25A3 A9 06 lda #$06 981 25A5 85 80 STA MapCounter 982 25A7 GenerateCompressedMap 983 25A7 18 CLC 984 25A8 A9 80 LDA #DirMapSectorBuff 988 25B0 65 81 ADC MapCounter+1 989 25B2 85 89 STA MAPPositionMem+1 990 25B4 A2 00 LDX #0 991 25B6 A0 01 LDY #1 992 25B8 A1 88 LDA (MAPPositionMem,x) 993 25BA 11 88 ORA (MAPPositionMem),y 994 25BC F0 56 BEQ Sector00 995 25BE 38 SEC 996 25BF A1 88 LDA (MAPPositionMem,x) 997 25C1 E5 86 SBC PrevFileSector 998 25C3 85 8A STA SectorOffset 999 25C5 B1 88 LDA (MAPPositionMem),y 1000 25C7 E5 87 SBC PrevFileSector+1 1001 25C9 85 8B STA SectorOffset+1 1002 ; mamy odstep miedzy poprzednim a nastepnym sektorem 1003 25CB D0 26 BNE OffsetToBig 1004 25CD A5 8A LDA SectorOffset 1005 25CF 30 22 BMI OffsetToBig ; max przeskok 127 sektorow 1006 25D1 C9 01 CMP #$01 1007 25D3 D0 11 BNE JumpForward 1008 ; kolejny sektor 1009 ; zwiekszamy wiec licznik 1010 25D5 E6 8C inc SectorsCounter 1011 25D7 A5 8C LDA SectorsCounter 1012 25D9 C9 7F CMP #%01111111 1013 25DB D0 2C BNE GetNextMapWord 1014 ; tu licznik dotarl do konca zerujemy go 1015 ; dodajemy wpis do skompresowanej mapy i gotowe 1016 25DD 20 56 26 JSR AddToCompressedMAP 1017 25E0 A9 00 LDA #0 1018 25E2 85 8C STA SectorsCounter 1019 25E4 F0 23 BEQ GetNextMapWord 1020 ; ominiecie wyznaczonej ilości sektorów (w A) 1021 25E6 JumpForward 1022 25E6 20 71 26 JSR FlushBuffer 1023 25E9 A5 8A LDA SectorOffset 1024 25EB 09 80 ORA #%10000000 1025 25ED 20 56 26 JSR AddToCompressedMAP 1026 25F0 4C 09 26 JMP GetNextMapWord 1027 ; wyznaczenie skoku do nowego sektora pliku 1028 25F3 OffsetToBig 1029 25F3 20 71 26 JSR FlushBuffer 1030 25F6 A9 00 LDA #0 1031 25F8 20 56 26 JSR AddToCompressedMAP 1032 25FB A0 00 LDY #00 1033 25FD B1 88 LDA (MAPPositionMem),y 1034 25FF 20 56 26 JSR AddToCompressedMAP 1035 2602 A0 01 LDY #01 1036 2604 B1 88 LDA (MAPPositionMem),y 1037 2606 20 56 26 JSR AddToCompressedMAP 1038 2609 GetNextMapWord 1039 ; zapamietanie numeru obecnego sektora do porownania potem 1040 2609 A0 00 LDY #00 1041 260B B1 88 LDA (MAPPositionMem),y 1042 260D 85 86 STA PrevFileSector 1043 260F C8 INY 1044 2610 B1 88 LDA (MAPPositionMem),y 1045 2612 85 87 STA PrevFileSector+1 1046 2614 Sector00 1047 2614 18 A5 80 69 02 85 + ADW MapCounter #2 1048 261F ops01 1049 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala 1050 261F A5 81 LDA MapCounter+1 1051 2621 CD 8A 20 CMP .adr loader.SecLen+1 1052 2624 D0 05 bne noteqal01 1053 2626 A5 80 LDA MapCounter 1054 2628 CD 89 20 CMP .adr loader.SecLen 1055 262B noteqal01 1056 262B F0 03 4C A7 25 JNE GenerateCompressedMap 1057 ; czytamy nastepny sektor mapy 1058 ; sprawdzmy czy nie koniec 1059 2630 AD 80 2D LDA DirMapSectorBuff 1060 2633 0D 81 2D ORA DirMapSectorBuff+1 1061 2636 F0 45 BEQ EndMakingMap 1062 2638 AD 80 2D LDA DirMapSectorBuff 1063 263B 8D 2A 2A sta blokDanychIO+$A 1064 263E AD 81 2D LDA DirMapSectorBuff+1 1065 2641 8D 2B 2A sta blokDanychIO+$B 1066 2644 A0 80 LDY #DirMapSectorBuff 1068 2648 20 F2 29 Jsr ReadSector 1069 ; zerujemy licznik mapy 1070 264B A9 00 LDA #$00 1071 264D 85 81 STA MapCounter+1 1072 264F A9 04 lda #$04 1073 2651 85 80 STA MapCounter 1074 2653 4C A7 25 JMP GenerateCompressedMap 1075 ; dpisanie bajtu z A do mapy sektorow skompresowanej 1076 2656 AddToCompressedMAP 1077 2656 48 PHA 1078 ; wyliczamy adresa 1079 2657 18 CLC 1080 2658 A5 82 LDA CompressedMapCounter 1081 265A 69 80 ADC #CompressedMap 1085 2663 8D 69 26 STA xxxxbla+1 1086 2666 68 PLA 1087 = 2668 xxxxbla=*+1 1088 2667 8D FF FF STA $FFFF 1089 266A E6 82 INC CompressedMapCounter 1090 266C D0 02 BNE noinc013 1091 266E E6 83 INC CompressedMapCounter+1 1092 2670 noinc013 1093 2670 60 RTS 1094 2671 FlushBuffer 1095 2671 A5 8C LDA SectorsCounter 1096 2673 F0 07 BEQ NoFlush 1097 2675 20 56 26 JSR AddToCompressedMAP 1098 2678 A9 00 LDA #0 1099 267A 85 8C STA SectorsCounter 1100 267C NoFlush 1101 267C 60 RTS 1102 267D EndMakingMap 1103 267D 20 71 26 JSR FlushBuffer 1104 2680 LoaderGo 1105 2680 A0 00 LDY #$00 1106 2682 8C 44 02 STY COLDST 1107 2685 A9 01 LDA #$01 1108 2687 85 09 STA BOOT 1109 2689 AE 00 07 LDX $700 1110 268C E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta 1111 268E D0 03 BNE NoRunFromDOS 1112 2690 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! 1113 ; STA $D5EC ; to wylacza SpartaDOS X 1114 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) 1115 2693 NoRunFromDOS 1116 2693 A9 A4 LDA #AfterWormStart 1119 2699 85 0D STA DOSINI+1 1120 ; LDA #>JRESETCD 1121 ; STA DOSVEC+1 1122 ; LDA #TempMEMLO 1143 26B7 6D 8A 20 ADC .adr loader.SecLen+1 1144 26BA 8D E8 02 STA MEMLO+1 1145 26BD 85 3E STA CompressedMapPos+1 1146 ; STA pointerMov2b 1147 ; STA APPMHI+1 1148 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora 1149 ; jest to jednoczesnie adres umieszczenia skompresowanej 1150 ; mapy sektorow pliku dla loadera ale MINUS 1 1151 26BF A5 3D D0 02 C6 3E + DEW CompressedMapPos 1152 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej 1153 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) 1154 26C7 18 CLC 1155 26C8 AD E7 02 LDA MEMLO 1156 ; ADC CompressedMapCounter 1157 ; STA MEMLO 1158 26CB 8D 7C 27 STA TurboRelocADDR 1159 26CE AD E8 02 LDA MEMLO+1 1160 ; ADC CompressedMapCounter+1 1161 ; STA MEMLO+1 1162 26D1 8D 7D 27 STA TurboRelocADDR+1 1163 26D4 A9 71 LDA #JTESTROM 1166 26DA 85 0D STA DOSINI+1 1167 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) 1168 ; INC $033D ; bajty kontrolne zimnego startu 1169 ; INC $033E ; zmiana ich wartosci wymusza 1170 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) 1171 26DC A2 00 LDX #$00 1172 26DE 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) 1173 ; STX BOOT 1174 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci 1175 26E0 moveloop1 1176 26E0 BD 00 20 LDA movedproc,X 1177 26E3 9D 00 07 STA $0700,X 1178 26E6 BD 00 21 LDA movedproc+$0100,X 1179 26E9 9D 00 08 STA $0800,X 1180 26EC E8 INX 1181 26ED D0 F1 BNE moveloop1 1182 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora 1183 /* moveloop2 1184 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy 1185 pointerMov2a=*+2 1186 LDA CompressedMap,x ; kod samomodyfikujacy sie 1187 pointerMov2b=*+2 1188 STA $FFFF,x ; kod samomodyfikujacy sie 1189 LDA CompressedMapCounter 1190 AND CompressedMapCounter+1 1191 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! 1192 BEQ SectorMapReady 1193 INX 1194 BNE moveloop2 1195 inc pointerMov2a 1196 inc pointerMov2b 1197 bne moveloop2 1198 SectorMapReady 1199 */ 1199 1200 26EF 20 3E 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO 1201 26F2 20 AE 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) 1202 1203 26F5 A2 00 LDX #$00 1204 26F7 8A TXA 1205 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) 1206 26F8 ClearLoop1 1207 26F8 9D 00 01 STA $0100,X ; STOS !!! 1208 26FB 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) 1209 26FE 9D 00 05 STA $0500,X 1210 2701 9D 00 06 STA $0600,X 1211 2704 E0 80 CPX #$80 ;tylko ponad $80 1212 2706 90 02 BCC NoZpage 1213 2708 95 00 STA $00,X ; czyli polowa strony zerowej 1214 270A NoZpage 1215 270A E8 INX 1216 270B D0 EB BNE ClearLoop1 1217 270D A2 FF LDX #$FF 1218 270F 9A TXS ; "wyzerowanie wskaznika STOSU 1219 1220 ; a tutaj otwieramy kanal 1 CIO do odczytu 1221 1222 2710 A2 10 LDX #16 ; kanal 1 1223 2712 A9 03 LDA #COPN ; rozkaz OPEN 1224 2714 9D 42 03 STA ICCOM,X ; COMMAND 1225 2717 A9 04 LDA #$04 ; READ 1226 2719 9D 4A 03 STA ICAUX1,X 1227 271C A9 00 LDA #$00 1228 271E 9D 4B 03 STA ICAUX2,X 1229 2721 A9 31 LDA # FileToOpen 1232 2728 9D 45 03 STA ICBADR+1,X 1233 272B 20 56 E4 JSR CIO 1234 1235 272E 4C C0 07 JMP loader.LoadStart ; po przepisaniu 1236 2731 FileToOpen 1237 2731 48 3A 53 43 4F 52 + .BYTE 'H:SCORCH.XEX',0 1238 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba 1239 ; na koniec odpowiednie zmodyfikowanie MEMLO 1240 273E ADDspeedProc 1241 273E AD 09 21 LDA USmode 1242 2741 F0 5F beq NoHappyLoader 1243 ; wyznaczamy offset procedury 1244 2743 38 SEC 1245 2744 A9 A3 LDA #HappyUSMovedProc 1249 274E ED E8 02 SBC MEMLO+1 1250 2751 8D 00 2C STA HappyOffset+1 1251 1252 2754 A0 00 LDY #0 1253 2756 A2 09 LDX #[$A-1] ;xjsrA - the last 1254 ; relokujemy skoki pod offset z MEMLO 1255 2758 HappyRelocate 1256 2758 38 SEC 1257 2759 BD EB 2B LDA xjsrTableL,x 1258 275C 85 32 STA SecBuffer 1259 275E BD F5 2B LDA xjsrTableH,x 1260 2761 85 33 STA SecBuffer+1 1261 2763 B1 32 LDA (SecBuffer),y 1262 2765 ED FF 2B SBC HappyOffset 1263 2768 91 32 STA (SecBuffer),y 1264 276A C8 INY 1265 276B B1 32 LDA (SecBuffer),y 1266 276D ED 00 2C SBC HappyOffset+1 1267 2770 91 32 STA (SecBuffer),y 1268 2772 88 DEY 1269 2773 CA DEX 1270 2774 10 E2 BPL HappyRelocate 1271 1272 2776 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] 1273 2778 label72x 1274 2778 BD A3 27 LDA HappyUSMovedProc,X 1275 = 277C TurboRelocADDR=*+1 1276 277B 9D 00 0A STA $0A00,X 1277 277E CA DEX 1278 277F E0 FF CPX #$FF 1279 2781 D0 F5 BNE label72x 1280 2783 A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] 1281 2785 A2 00 LDX #$00 1282 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. 1283 2787 label73 1284 2787 98 TYA 1285 2788 18 CLC 1286 2789 6D E7 02 ADC MEMLO 1287 278C 8D E7 02 STA MEMLO 1288 278F 8A TXA 1289 2790 6D E8 02 ADC MEMLO+1 1290 2793 8D E8 02 STA MEMLO+1 1291 2796 AD 7C 27 LDA TurboRelocADDR 1292 2799 8D 7E 07 STA loader.SioJMP+1 ; po przepisaniu 1293 279C AD 7D 27 LDA TurboRelocADDR+1 1294 279F 8D 7F 07 STA loader.SioJMP+2 ; po przepisaniu 1295 27A2 NoHappyLoader 1296 27A2 60 RTS 1297 1298 1299 1300 ; UWAGA !!!!!!!!!!!!!! 1301 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! 1302 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone 1303 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! 1304 27A3 HappyUSMovedProc ; 1305 1306 27A3 AD 04 03 LDA DBUFA 1307 27A6 85 32 STA SecBuffer 1308 27A8 AD 05 03 LDA DBUFA+1 1309 27AB 85 33 STA SecBuffer+1 1310 1311 27AD AD 08 03 LDA DBYT 1312 27B0 85 31 STA SecLenUS 1313 1314 27B2 78 SEI 1315 27B3 BA TSX 1316 27B4 86 37 STX StackCopy 1317 27B6 A9 0D LDA #$0D 1318 27B8 85 34 STA CRETRYZ 1319 ;command retry on zero page 1320 27BA CommandLoop 1321 = 27BB HappySpeed = *+1 1322 27BA A9 28 LDA #$28 ;here goes speed from "?" 1323 27BC 8D 04 D2 STA AUDF3 1324 27BF A9 34 LDA #$34 1325 27C1 8D 03 D3 STA PBCTL ;ustawienie linii command 1326 27C4 A2 80 LDX #$80 1327 27C6 DelayLoopCmd 1328 27C6 CA DEX 1329 27C7 D0 FD BNE DelayLoopCmd 1330 27C9 8E 06 D2 STX AUDF4 ; zero 1331 27CC 86 35 STX TransmitError 1332 ; pokey init 1333 27CE A9 23 LDA #$23 1334 27D0 20 44 28 xjsr1 JSR SecTransReg 1335 ; 1336 1337 27D3 18 CLC 1338 27D4 AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) 1339 27D7 6D 01 03 ADC DUNIT ; dodajemy numer stacji 1340 27DA 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) 1341 27DC 85 30 STA CheckSum 1342 27DE 8D 0D D2 STA SEROUT 1343 27E1 AD 02 03 LDA DCOMND 1344 27E4 20 5A 28 xjsr2 JSR PutSIOByte 1345 27E7 AD 0A 03 LDA DAUX1 1346 27EA 20 5A 28 xjsr3 JSR PutSIOByte 1347 27ED AD 0B 03 LDA DAUX2 1348 27F0 20 5A 28 xjsr4 JSR PutSIOByte 1349 27F3 A5 30 LDA CheckSum 1350 27F5 20 5A 28 xjsr5 JSR PutSIOByte 1351 1352 27F8 waitforEndOftransmission 1353 27F8 AD 0E D2 LDA IRQST 1354 27FB 29 08 AND #$08 1355 27FD D0 F9 BNE waitforEndOftransmission 1356 1357 27FF A9 13 LDA #$13 1358 2801 20 44 28 xjsr6 JSR SecTransReg 1359 1360 2804 A9 3C LDA #$3c 1361 2806 8D 03 D3 STA PBCTL ;command line off 1362 ; two ACK's 1363 2809 A0 02 LDY #2 1364 280B DoubleACK 1365 280B 20 76 28 xjsr7 JSR GetSIOByte 1366 280E C9 44 CMP #$44 1367 2810 B0 19 BCS ErrorHere 1368 2812 88 DEY 1369 2813 D0 F6 BNE DoubleACK 1370 1371 ;ldy #0 1372 2815 84 30 STY CheckSum 1373 2817 ReadSectorLoop 1374 2817 20 76 28 xjsr8 JSR GetSIOByte 1375 281A 91 32 STA (SecBuffer),y 1376 281C 20 6E 28 xjsr9 JSR AddCheckSum 1377 281F C8 INY 1378 2820 C4 31 CPY SecLenUS 1379 2822 D0 F3 BNE ReadSectorLoop 1380 1381 2824 20 76 28 xjsrA JSR GetSIOByte 1382 2827 C5 30 CMP CheckSum 1383 2829 F0 0B BEQ EndOfTransmission 1384 ;error!!! 1385 282B ErrorHere 1386 282B A0 90 LDY #$90 1387 282D 84 35 STY TransmitError 1388 282F A6 37 LDX StackCopy 1389 2831 9A TXS 1390 2832 C6 34 DEC CRETRYZ 1391 2834 D0 84 BNE CommandLoop 1392 1393 2836 EndOfTransmission 1394 2836 A9 00 LDA #0 1395 2838 8D 07 D2 STA AUDC4 1396 283B A5 10 LDA IRQENS 1397 283D 8D 0E D2 STA IRQEN 1398 2840 58 CLI 1399 2841 A4 35 LDY TransmitError 1400 2843 60 RTS 1401 1402 2844 SecTransReg 1403 2844 8D 0F D2 STA SKCTL 1404 2847 8D 0A D2 STA SKSTRES 1405 284A A9 38 LDA #$38 1406 284C 8D 0E D2 STA IRQEN 1407 284F A9 28 LDA #$28 1408 2851 8D 08 D2 STA AUDCTL 1409 2854 A9 A8 LDA #$A8 1410 2856 8D 07 D2 STA AUDC4 1411 2859 60 RTS 1412 1413 285A PutSIOByte 1414 285A AA TAX 1415 285B waitforSerial 1416 285B AD 0E D2 LDA IRQST 1417 285E 29 10 AND #$10 1418 2860 D0 F9 BNE waitforSerial 1419 1420 2862 8D 0E D2 STA IRQEN 1421 2865 A9 10 LDA #$10 1422 2867 8D 0E D2 STA IRQEN 1423 1424 286A 8A TXA 1425 286B 8D 0D D2 STA SEROUT 1426 1427 286E AddCheckSum 1428 286E 18 CLC 1429 286F 65 30 ADC CheckSum 1430 2871 69 00 ADC #0 1431 2873 85 30 STA CheckSum 1432 2875 60 RTS 1433 1434 2876 GetSIOByte 1435 2876 A2 0A LDX #10 ;acktimeout 1436 2878 ExternalLoop 1437 2878 A9 00 LDA #0 1438 287A 85 36 STA looperka 1439 287C InternalLoop 1440 287C AD 0E D2 LDA IRQST 1441 287F 29 20 AND #$20 1442 2881 F0 09 BEQ ACKReceive 1443 2883 C6 36 DEC looperka 1444 2885 D0 F5 BNE InternalLoop 1445 2887 CA DEX 1446 2888 D0 EE BNE ExternalLoop 1447 288A F0 9F BEQ ErrorHere 1448 288C ACKReceive 1449 ; zero we have now 1450 288C 8D 0E D2 STA IRQST 1451 288F A9 20 LDA #$20 1452 2891 8D 0E D2 STA IRQST 1453 2894 AD 0F D2 LDA SKSTAT 1454 2897 8D 0A D2 STA SKSTRES 1455 289A 29 20 AND #$20 1456 289C F0 8D BEQ ErrorHere 1457 ; 1458 289E AD 0D D2 LDA SERIN 1459 28A1 60 RTS 1460 28A2 EndHappyUSProc 1461 1462 1463 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler 1464 28A2 blokDanychIO_GetUSSpeed 1465 28A2 31 01 3F 40 .BY $31,$01,"?",$40 1466 28A6 BB 27 .WO HappySpeed 1467 28A8 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A 1468 28AE DirMapEnd 1469 28AE 4C 7A 29 JMP label75 1470 28B1 label39 1471 28B1 85 DA STA $DA 1472 28B3 A5 D0 LDA CurrentFileInfoBuff 1473 28B5 85 DB STA $DB 1474 28B7 A5 D1 LDA CurrentFileInfoBuff+1 1475 28B9 85 DC STA $DC 1476 28BB 20 2E 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka 1477 28BE F0 05 BEQ DiscNotChanged2 1478 28C0 68 PLA 1479 28C1 68 PLA 1480 28C2 4C BB 21 JMP ReadMainDir 1481 28C5 DiscNotChanged2 1482 ; odczyt sektora mapy wskazywanego przez DirMapSec 1483 28C5 A5 D2 LDA DirMapSect 1484 28C7 8D 2A 2A STA blokDanychIO+10 1485 28CA A5 D3 LDA DirMapSect+1 1486 28CC 8D 2B 2A STA blokDanychIO+11 1487 28CF 0D 2A 2A ORA blokDanychIO+10 1488 28D2 F0 DA BEQ DirMapEnd 1489 28D4 A2 2D LDX #>DirMapSectorBuff 1490 28D6 A0 80 LDY #DirMapSectorBuff ; -- 1516 2902 65 E3 ADC InMapPointer+1 ; -- 1517 2904 85 E5 STA TempZP+1 ; -- 1518 2906 B1 E4 LDA (TempZP),Y 1519 2908 8D 2A 2A STA blokDanychIO+10 1520 290B C8 INY 1521 290C B1 E4 LDA (TempZP),Y 1522 290E 8D 2B 2A STA blokDanychIO+11 1523 2911 0D 2A 2A ORA blokDanychIO+10 1524 2914 F0 64 BEQ label75 1525 ; i zwiekszenie wskaznika mapy o 2 1526 2916 C8 INY 1527 2917 84 E2 STY InMapPointer 1528 2919 D0 02 BNE NoIncH ; -- 1529 291B E6 E3 INC InMapPointer+1 ; -- 1530 291D NoIncH 1531 291D AD E5 02 LDA MEMTOP 1532 2920 38 SEC 1533 2921 E5 D0 SBC CurrentFileInfoBuff 1534 2923 AD E6 02 LDA MEMTOP+1 1535 2926 E5 D1 SBC CurrentFileInfoBuff+1 1536 2928 F0 50 BEQ label75 1537 292A A4 D0 LDY CurrentFileInfoBuff 1538 292C A6 D1 LDX CurrentFileInfoBuff+1 1539 292E 20 F2 29 JSR ReadSector 1540 2931 A5 D4 LDA $D4 1541 2933 05 D5 ORA $D5 1542 2935 D0 16 BNE label79 1543 2937 A0 03 LDY #$03 1544 2939 B1 D0 LDA (CurrentFileInfoBuff),Y 1545 293B 85 D4 STA $D4 1546 293D C8 INY 1547 293E B1 D0 LDA (CurrentFileInfoBuff),Y 1548 2940 85 D5 STA $D5 1549 2942 C8 INY 1550 2943 B1 D0 LDA (CurrentFileInfoBuff),Y 1551 2945 F0 06 BEQ label79 1552 2947 A9 FF LDA #$FF 1553 2949 85 D4 STA $D4 1554 294B 85 D5 STA $D5 1555 294D label79 1556 294D A5 D0 LDA CurrentFileInfoBuff 1557 294F 18 CLC 1558 2950 6D 89 20 ADC .adr loader.SecLen ; przed przepisaniem 1559 2953 85 D0 STA CurrentFileInfoBuff 1560 2955 A5 D1 LDA CurrentFileInfoBuff+1 1561 2957 6D 8A 20 ADC .adr loader.SecLen+1 ; przed przepisaniem 1562 295A 85 D1 STA CurrentFileInfoBuff+1 1563 295C A5 D4 LDA $D4 1564 295E 38 SEC 1565 295F ED 89 20 SBC .adr loader.SecLen ; przed przepisaniem 1566 2962 85 D4 STA $D4 1567 2964 A5 D5 LDA $D5 1568 2966 ED 8A 20 SBC .adr loader.SecLen+1 ; przed przepisaniem 1569 2969 85 D5 STA $D5 1570 296B B0 80 BCS label80 1571 296D A5 D0 LDA CurrentFileInfoBuff 1572 296F 18 CLC 1573 2970 65 D4 ADC $D4 1574 2972 85 D0 STA CurrentFileInfoBuff 1575 2974 A5 D1 LDA CurrentFileInfoBuff+1 1576 2976 65 D5 ADC $D5 1577 2978 85 D1 STA CurrentFileInfoBuff+1 1578 297A label75 1579 297A A5 DC LDA $DC 1580 297C C5 D1 CMP CurrentFileInfoBuff+1 1581 297E 90 0B BCC label81 1582 2980 D0 17 BNE label82 1583 2982 A5 DB LDA $DB 1584 2984 C5 D0 CMP CurrentFileInfoBuff 1585 2986 90 03 BCC label81 1586 2988 D0 0F BNE label82 1587 298A 60 RTS 1588 298B label81 1589 298B A5 DB LDA $DB 1590 298D 18 CLC 1591 298E 65 DA ADC $DA 1592 2990 85 DB STA $DB 1593 2992 90 E6 BCC label75 1594 2994 E6 DC INC $DC 1595 2996 4C 7A 29 JMP label75 1596 2999 label82 1597 2999 A5 DB LDA $DB 1598 299B 38 SEC 1599 299C E5 DA SBC $DA 1600 299E 85 D0 STA CurrentFileInfoBuff 1601 29A0 A5 DC LDA $DC 1602 29A2 E9 00 SBC #$00 1603 29A4 85 D1 STA CurrentFileInfoBuff+1 1604 29A6 60 RTS 1605 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora 1606 29A7 ReadPERCOM 1607 29A7 A9 04 LDA #$04 1608 29A9 8D 2C 2A STA DiskRetryCount 1609 29AC ReadPERCOMretry 1610 29AC A0 D0 LDY #blokDanychIO_PERCOM 1612 29B0 20 C8 2A JSR Table2DCB 1613 29B3 20 BD 2A JSR GoSIO 1614 29B6 30 08 BMI PercomError 1615 ; blok odczytany - ustawmy dlugosc 1 sektora 1616 29B8 AD 11 2C LDA PERCOMdata+6 1617 29BB C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 1618 29BD F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest 1619 29BF 60 RTS 1620 29C0 PercomError 1621 29C0 CE 2C 2A DEC DiskRetryCount 1622 29C3 D0 E7 BNE ReadPERCOMretry 1623 ; blok nieodczytany - dlugosc 1 sektora na $80 1624 29C5 Set1Sect128 1625 29C5 A9 00 LDA #$00 1626 29C7 8D 11 2C STA PERCOMdata+6 1627 29CA A9 80 LDA #$80 1628 29CC 8D 12 2C STA PERCOMdata+7 1629 29CF 60 RTS 1630 29D0 blokDanychIO_PERCOM 1631 29D0 31 01 4E 40 .BY $31,$01,$4E,$40 1632 29D4 0B 2C .WO PERCOMdata 1633 29D6 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 1634 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) 1635 29DC ReadFirstSect 1636 29DC A9 01 LDA #$01 1637 29DE 8D 2A 2A STA blokDanychIO+10 1638 29E1 A9 00 LDA #$00 1639 29E3 8D 2B 2A STA blokDanychIO+11 1640 29E6 AD 11 2C LDA PERCOMdata+6 1641 29E9 8D 29 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b 1642 29EC AD 12 2C LDA PERCOMdata+7 1643 29EF 4C FB 29 JMP ReadSector1 1644 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) 1645 ; reszta danych jak nizej (A nie wazne) 1646 29F2 ReadSector 1647 29F2 AD 8A 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b 1648 29F5 8D 29 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b 1649 29F8 AD 89 20 LDA .adr loader.SecLen ; przed przepisaniem 1650 29FB ReadSector1 1651 29FB 8D 28 2A STA blokDanychIO+8 1652 29FE 8E 25 2A STX blokDanychIO+5 1653 2A01 8C 24 2A STY blokDanychIO+4 1654 2A04 A9 04 LDA #$04 1655 2A06 8D 2C 2A STA DiskRetryCount 1656 2A09 DiskReadRetry 1657 2A09 A0 20 LDY #blokDanychIO 1659 2A0D 20 C8 2A JSR Table2DCB 1660 2A10 20 BD 2A JSR GoSIO 1661 2A13 30 01 BMI label85 1662 2A15 60 RTS 1663 2A16 label85 1664 2A16 CE 2C 2A DEC DiskRetryCount 1665 2A19 D0 EE BNE DiskReadRetry 1666 2A1B 68 PLA 1667 2A1C 68 PLA 1668 2A1D 4C 7A 21 JMP ErrorDisplay 1669 2A20 blokDanychIO 1670 2A20 31 01 52 40 .BY $31,$01,$52,$40 1671 2A24 80 2D .WO DirMapSectorBuff 1672 2A26 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 1673 2A2C DiskRetryCount 1674 2A2C 00 .BY $00 1675 2A2D PrintXY 1676 2A2D 68 PLA 1677 2A2E 85 C8 STA $C8 1678 2A30 68 PLA 1679 2A31 85 C9 STA $C9 1680 2A33 A9 00 LDA #$00 1681 2A35 85 DF STA $DF 1682 2A37 20 AF 2A JSR label87 1683 2A3A 48 PHA 1684 2A3B 20 AF 2A JSR label87 1685 2A3E 85 DE STA $DE 1686 2A40 0A ASL 1687 2A41 0A ASL 1688 2A42 18 CLC 1689 2A43 65 DE ADC $DE 1690 2A45 0A ASL 1691 2A46 0A ASL 1692 2A47 26 DF ROL $DF 1693 2A49 0A ASL 1694 2A4A 26 DF ROL $DF 1695 2A4C 18 CLC 1696 2A4D 65 58 ADC SAVMSC 1697 2A4F 85 DE STA $DE 1698 2A51 A5 DF LDA $DF 1699 2A53 65 59 ADC SAVMSC+1 1700 2A55 85 DF STA $DF 1701 2A57 68 PLA 1702 2A58 A8 TAY 1703 2A59 label92 1704 2A59 20 AF 2A JSR label87 1705 2A5C C9 00 CMP #$00 1706 2A5E F0 48 BEQ label88 1707 2A60 C9 7D CMP #$7D 1708 2A62 F0 21 BEQ label89 1709 2A64 A2 00 LDX #$00 1710 2A66 86 E0 STX $E0 1711 2A68 C9 80 CMP #$80 1712 2A6A 66 E0 ROR $E0 1713 2A6C 29 7F AND #$7F 1714 2A6E C9 20 CMP #$20 1715 2A70 B0 04 BCS label90 1716 2A72 09 40 ORA #$40 1717 2A74 D0 07 BNE label91 1718 2A76 label90 1719 2A76 C9 60 CMP #$60 1720 2A78 B0 03 BCS label91 1721 2A7A 38 SEC 1722 2A7B E9 20 SBC #$20 1723 2A7D label91 1724 2A7D 05 E0 ORA $E0 1725 2A7F 91 DE STA ($DE),Y 1726 2A81 C8 INY 1727 2A82 4C 59 2A JMP label92 1728 2A85 label89 1729 2A85 98 TYA 1730 2A86 48 PHA 1731 2A87 A5 58 LDA SAVMSC 1732 2A89 85 E0 STA $E0 1733 2A8B A9 03 LDA #$03 1734 2A8D AA TAX 1735 2A8E 18 CLC 1736 2A8F 65 59 ADC SAVMSC+1 1737 2A91 85 E1 STA $E1 1738 2A93 A0 BF LDY #$BF 1739 2A95 A9 00 LDA #$00 1740 2A97 label93 1741 2A97 91 E0 STA ($E0),Y 1742 2A99 88 DEY 1743 2A9A C0 FF CPY #$FF 1744 2A9C D0 F9 BNE label93 1745 2A9E C6 E1 DEC $E1 1746 2AA0 CA DEX 1747 2AA1 10 F4 BPL label93 1748 2AA3 68 PLA 1749 2AA4 A8 TAY 1750 2AA5 4C 59 2A JMP label92 1751 2AA8 label88 1752 2AA8 A5 C9 LDA $C9 1753 2AAA 48 PHA 1754 2AAB A5 C8 LDA $C8 1755 2AAD 48 PHA 1756 2AAE 60 RTS 1757 2AAF label87 1758 2AAF E6 C8 INC $C8 1759 2AB1 D0 02 BNE label94 1760 2AB3 E6 C9 INC $C9 1761 2AB5 label94 1762 2AB5 A2 00 LDX #$00 1763 2AB7 A1 C8 LDA ($C8,X) 1764 2AB9 60 RTS 1765 2ABA GoErrorDisp 1766 2ABA 4C 7A 21 JMP ErrorDisplay 1767 ; Skok do Sio lub procedury Turbo 1768 2ABD GoSIO 1769 2ABD AC 09 21 LDY USmode 1770 2AC0 F0 03 BEQ StandardSpeed 1771 2AC2 4C A3 27 JMP HappyUSMovedProc ; mozna skakac do tej procki 1772 2AC5 StandardSpeed 1773 2AC5 4C 59 E4 JMP JSIOINT 1774 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) 1775 ; do bloku kontroli transmisji szeregowej DCB 1776 2AC8 Table2DCB 1777 2AC8 8C D1 2A STY IOtableAddr+1 1778 2ACB 8E D2 2A STX IOtableAddr+2 1779 2ACE A2 0B LDX #$0B 1780 2AD0 IOtableAddr 1781 2AD0 BD FF FF LDA $FFFF,X 1782 2AD3 9D 00 03 STA DDEVIC,X 1783 2AD6 CA DEX 1784 2AD7 10 F7 BPL IOtableAddr 1785 2AD9 60 RTS 1786 2ADA Close1 1787 2ADA A2 10 LDX #$10 1788 2ADC CloseX 1789 2ADC A9 0C LDA #$0C 1790 2ADE 9D 42 03 STA ICCMD,X 1791 2AE1 4C 56 E4 JMP JCIOMAIN 1792 2AE4 GetKey 1793 2AE4 A2 10 LDX #$10 1794 2AE6 A9 03 LDA #$03 1795 2AE8 9D 42 03 STA ICCMD,X 1796 2AEB A9 04 LDA #$04 1797 2AED 9D 4A 03 STA ICAX1,X 1798 2AF0 A9 00 LDA #$00 1799 2AF2 9D 4B 03 STA ICAX2,X 1800 2AF5 9D 49 03 STA ICBUFL+1,X 1801 2AF8 A9 FF LDA #$FF 1802 2AFA 9D 48 03 STA ICBUFL,X 1803 2AFD A9 2B LDA #Kdriver 1806 2B04 9D 45 03 STA ICBUFA+1,X 1807 2B07 20 56 E4 JSR JCIOMAIN 1808 2B0A 30 1C BMI GKeyError 1809 2B0C A2 10 LDX #$10 1810 2B0E A9 00 LDA #$00 1811 2B10 9D 48 03 STA ICBUFL,X 1812 2B13 9D 49 03 STA ICBUFL+1,X 1813 2B16 A9 07 LDA #$07 1814 2B18 9D 42 03 STA ICCMD,X 1815 2B1B 20 56 E4 JSR JCIOMAIN 1816 2B1E 30 08 BMI GKeyError 1817 2B20 48 PHA 1818 2B21 20 DA 2A JSR Close1 1819 2B24 30 02 BMI GKeyError 1820 2B26 68 PLA 1821 2B27 60 RTS 1822 2B28 GKeyError 1823 2B28 4C BA 2A JMP GoErrorDisp 1824 2B2B Kdriver 1825 2B2B 4B 3A 9B .BY "K:",$9B 1826 2B2E DiscChangeCheck 1827 2B2E A0 80 LDY #DirMapSectorBuff 1829 2B32 20 DC 29 JSR ReadFirstSect 1830 2B35 A2 7F LDX #$7F 1831 2B37 label98 1832 2B37 BD 00 2D LDA FirstSectorBuff,X 1833 2B3A DD 80 2D CMP DirMapSectorBuff,X 1834 2B3D D0 05 BNE ChangedD 1835 2B3F CA DEX 1836 2B40 10 F5 BPL label98 1837 2B42 A9 00 LDA #$00 1838 2B44 ChangedD 1839 2B44 60 RTS 1840 ; obsluga gwiazdki 1841 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * 1842 ; w Y jest ) - X moze lepiej nie ruszac :) 1843 2B45 Asteriks 1844 2B45 A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) 1845 2B47 20 63 2B JSR GetHexNumber 1846 2B4A 8D C5 02 STA COLPF1S ; literki 1847 2B4D C8 INY 1848 2B4E 20 63 2B JSR GetHexNumber 1849 2B51 8D C6 02 STA COLPF2S ; tlo 1850 2B54 C8 INY 1851 2B55 20 63 2B JSR GetHexNumber 1852 2B58 8D C8 02 STA COLBAKS ; ramka 1853 2B5B C8 INY 1854 2B5C 20 63 2B JSR GetHexNumber 1855 2B5F 8D 0D 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) 1856 2B62 60 RTS 1857 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX 1858 ; i zamienia na bajt w A 1859 2B63 GetHexNumber 1860 2B63 20 73 2B JSR GetHEX4bits 1861 2B66 0A ASL 1862 2B67 0A ASL 1863 2B68 0A ASL 1864 2B69 0A ASL 1865 2B6A 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. 1866 2B6C C8 INY 1867 2B6D 20 73 2B JSR GetHEX4bits 1868 2B70 05 E4 ORA TempZP 1869 2B72 60 RTS 1870 2B73 GetHEX4bits 1871 2B73 B1 D4 LDA ($D4),Y 1872 2B75 38 SEC 1873 2B76 E9 30 SBC #'0' 1874 2B78 C9 0A CMP #$0A ; sprawdzmy czy cyfra 1875 2B7A 90 02 BCC IsNumber 1876 2B7C E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow 1877 2B7E IsNumber 1878 2B7E 60 RTS 1879 ; Ustawia numer satcji wg A 1880 2B7F SeTDriveNR 1881 2B7F C9 09 CMP #$09 1882 2B81 B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry 1883 2B83 20 A1 2B JSR SeTblokDanychDrive 1884 2B86 18 CLC 1885 2B87 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 1886 2B89 8D BC 22 STA DriveDisp1 1887 2B8C A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu 1888 2B8E 8D BB 22 STA DriveDisp1-1 1889 2B91 60 RTS 1890 2B92 SeTDriveLetter 1891 2B92 20 A1 2B JSR SeTblokDanychDrive 1892 2B95 18 CLC 1893 2B96 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu 1894 2B98 8D BC 22 STA DriveDisp1 1895 2B9B A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja 1896 2B9D 8D BB 22 STA DriveDisp1-1 1897 2BA0 60 RTS 1898 2BA1 SeTblokDanychDrive 1899 2BA1 8D 82 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem 1900 2BA4 8D 21 2A STA blokDanychIO+1 1901 2BA7 8D A3 28 STA blokDanychIO_GetUSSpeed+1 1902 2BAA 8D D1 29 STA blokDanychIO_PERCOM+1 1903 2BAD 60 RTS 1904 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku 1905 2BAE MEMLOprint 1906 2BAE AD E7 02 LDA MEMLO 1907 2BB1 48 PHA 1908 2BB2 4A LSR 1909 2BB3 4A LSR 1910 2BB4 4A LSR 1911 2BB5 4A LSR 1912 2BB6 20 0F 21 JSR bin2AsciiHex 1913 2BB9 8D E7 2B STA MEMLOvalue+2 1914 2BBC 68 PLA 1915 2BBD 20 0F 21 JSR bin2AsciiHex 1916 2BC0 8D E8 2B STA MEMLOvalue+3 1917 2BC3 AD E8 02 LDA MEMLO+1 1918 2BC6 48 PHA 1919 2BC7 4A LSR 1920 2BC8 4A LSR 1921 2BC9 4A LSR 1922 2BCA 4A LSR 1923 2BCB 20 0F 21 JSR bin2AsciiHex 1924 2BCE 8D E5 2B STA MEMLOvalue 1925 2BD1 68 PLA 1926 2BD2 20 0F 21 JSR bin2AsciiHex 1927 2BD5 8D E6 2B STA MEMLOvalue+1 1928 2BD8 20 2D 2A JSR PrintXY 1929 2BDB 1C 17 .BY 28,23 1930 2BDD 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" 1931 2BE5 MEMLOvalue 1932 2BE5 30 30 30 30 .BY "0000" 1933 2BE9 00 .BY $00 1934 2BEA 60 RTS 1935 1936 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo 1937 1938 2BEB xjsrTableL 1939 2BEB D1 E5 EB .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] 1940 2BEE F1 F6 .BY <[xjsr4+1],<[xjsr5+1] 1941 2BF0 02 0C 18 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] 1942 2BF3 1D 25 .BY <[xjsr9+1],<[xjsrA+1] 1943 2BF5 xjsrTableH 1944 2BF5 27 27 27 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] 1945 2BF8 27 27 .BY >[xjsr4+1],>[xjsr5+1] 1946 2BFA 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] 1947 2BFD 28 28 .BY >[xjsr9+1],>[xjsrA+1] 1948 ; miejsce na wyliczony offset o jaki przesuwamy procedure 1949 2BFF HappyOffset 1950 2BFF 00 00 .WO $0000 1951 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) 1952 2C01 DensityCodes 1953 2C01 F3 E4 F1 .by +$80,"sdq" 1954 ;.by "SDQ" 1955 ;.by $0e,$15,$a0 1956 2C04 ONtext 1957 2C04 CF CE A0 .BY +$80,"ON " 1958 2C07 OFFtext 1959 2C07 CF C6 C6 .BY +$80,"OFF" 1960 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) 1961 2C0A PDVMASKtemp 1962 2C0A 00 .BY $00 1963 ; miejsce na blok PERCOM 1964 2C0B PERCOMdata 1965 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie 1966 = 2C17 FirstSectorsTable=*+12 ; omijamy 12b na percom 1967 ; zostawiamy $30 bajtow wolnego 1968 1969 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow 1970 = 2D00 ProgramEnd=FirstSectorBuff 1971 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu 1972 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu 1973 2C0B FirstRun 1974 ; odnotowujemy stan Shift z Bootowania 1975 2C0B AD 0F D2 LDA SKSTAT 1976 2C0E 29 08 and #$08 1977 2C10 D0 03 BNE NoSHIFTboot 1978 2C12 8D 0C 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 1979 2C15 NoSHIFTboot 1980 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie 1981 2C15 AD 01 D3 LDA PORTB 1982 2C18 29 02 AND #$02 1983 2C1A D0 0B BNE BrakBasica 1984 ; jest Basic 1985 2C1C A0 02 LDY #$2 1986 2C1E BASstatprint 1987 2C1E B9 04 2C LDA ONtext,y 1988 2C21 99 D7 22 STA BASstatus,y 1989 2C24 88 DEY 1990 2C25 10 F7 bpl BASstatprint 1991 2C27 BrakBasica 1992 ; Sprawdzamy istnienie QMEGa 1993 2C27 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy 1994 2C29 testQMEGloop 1995 2C29 B9 01 C0 LDA $C001,y 1996 2C2C D9 5C 2C CMP QMEGstring,y 1997 2C2F D0 13 bne brakQMEGa 1998 2C31 88 dey 1999 2C32 10 F5 bpl testQMEGloop 2000 ; jest QMEG 2001 2C34 A9 00 LDA #0 2002 2C36 8D 0A 21 STA QMEG 2003 2C39 A0 02 LDY #$2 2004 2C3B Qstatprint 2005 2C3B B9 04 2C LDA ONtext,y 2006 2C3E 99 CF 22 STA QMEGstatus,y 2007 2C41 88 DEY 2008 2C42 10 F7 bpl Qstatprint 2009 2C44 brakQMEGa 2010 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi 2011 2C44 AD 00 03 LDA DDEVIC 2012 2C47 18 clc 2013 2C48 6D 01 03 ADC DUNIT 2014 2C4B 38 sec 2015 2C4C E9 01 SBC #$01 2016 2C4E 29 0F AND #$0F ; zapamietanie numeru urzadzenia 2017 2C50 8D 0B 21 STA BootDrive 2018 2C53 20 7F 2B JSR SeTDriveNR 2019 2C56 20 1E 21 JSR EditorOpen 2020 2C59 4C 4C 21 JMP mainprog 2021 2C5C QMEGstring 2022 2C5C 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 2023 2C64 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" 2024 ;.OPT List 2025 2026 2027 = 0080 MAPCOUNTER 2027 = 0082 COMPRESSEDMAPCOUNTER 2027 = 0084 MAPCOUNTERMEM 2027 = 0086 PREVFILESECTOR 2027 = 0088 MAPPOSITIONMEM 2027 = 008A SECTOROFFSET 2027 = 008C SECTORSCOUNTER 2027 org $02e0 2028 02E0-02E1> 80 26 .WO LoaderGo 2029 ; .WO START 2030 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) 2031 ; OPT h- 2032 ; org $0000 2033 ; .WO $0000 2034