mads 2.1.6 build 65 (4 Jun 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 = 0024 InBlockAddr = $24 ; word 83 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) 84 = 0026 ToBlockEnd = $26 ; word 85 = 0026 BlockLen= $26 ; word 86 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH 87 = 0028 ToFileEndL = $28 88 = 0028 BlockATemp = $28 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 = 07D7 FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu 184 = 07D7 TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) 185 186 START 187 FFFF> 1FFD-2CE5> 4C 24 + 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 8A TXA 203 0703 48 PHA 204 0704 A5 28 LDA ToFileEndL 205 0706 48 PHA 206 0707 A5 3D LDA CompressedMapPos 207 0709 48 PHA 208 070A A5 3E LDA CompressedMapPos+1 209 070C 48 PHA 210 070D 20 93 07 JSR GoInitAddr 211 0710 68 PLA 212 0711 85 3E STA CompressedMapPos+1 213 0713 68 PLA 214 0714 85 3D STA CompressedMapPos 215 0716 68 PLA 216 0717 85 28 STA ToFileEndL 217 0719 68 PLA 218 071A AA TAX 219 071B FileNextBlock 220 ; wczytanie kolejnego bloku binarnego 221 071B 20 88 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) 222 071E C0 88 CPY #$88 ; czy EOF 223 0720 D0 03 4C A6 07 jeq EndOfFile 224 0725 A5 24 LDA InBlockAddr 225 0727 25 25 AND InBlockAddr+1 226 0729 C9 FF CMP #$FF ; jesli oba sa $FF to..... 227 072B D0 03 BNE FileNoFFFFHead 228 072D 20 88 07 JSR FileGetBlockStart ; pobranie jeszcze raz 229 0730 FileNoFFFFHead 230 0730 A5 24 85 28 A5 25 + mwa InBlockAddr BlockATemp ; zapamietanie adresu poczatkowego bloku (na chwile) 231 0738 A9 26 LDA #BlockLen 234 073E 85 25 sta InBlockAddr+1 235 0740 20 B0 07 JSR GetFile2Bytes ; pobranie dwoch bajtow - ; Pobranie adresu konca ladowanego bloku 236 0743 C0 88 CPY #$88 ; czy EOF 237 0745 F0 5F beq EndOfFile 238 ; wyliczenie długości bloku programu binarnego 239 0747 38 sec 240 0748 A5 26 lda BlockLen 241 074A E5 28 sbc BlockATemp 242 074C 85 26 sta BlockLen 243 074E A5 27 lda BlockLen+1 244 0750 E5 29 sbc BlockATemp+1 245 0752 85 27 sta BlockLen+1 246 0754 E6 26 D0 02 E6 27 inw BlockLen 247 075A A5 28 85 24 A5 29 + mwa BlockATemp InBlockAddr ; odtworzenie adresu poczatkowego bloku 248 0762 38 SEC 249 0763 WhatIsIt 250 0763 B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y 251 ; ktory tylko wylacza skok !!! 252 0765 CE 63 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! 253 0768 A5 24 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ 254 076A 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu 255 076D A5 25 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem 256 076F 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). 257 0772 FileNoFirstBlock 258 0772 A9 AF LDA #Jrts ; jesli nie jest to blok z adresem inicjacji 261 0779 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie 262 263 077C BlockReadLoop ;; petla odczytujaca z pliku blok binarny 264 077C 20 B8 07 JSR GetFileBytes 265 077F C0 88 CPY #$88 ; czy EOF 266 0781 F0 23 beq EndOfFile 267 0783 F0 03 4C 02 07 jne FileInit ; koniec bloku - skok pod adres inicjalizacji 268 0788 FileGetBlockStart 269 0788 A9 24 LDA #InBlockAddr 272 078E 85 25 sta InBlockAddr+1 273 0790 4C B0 07 JMP GetFile2Bytes ; pobranie dwoch bajtow 274 0793 GoInitAddr 275 0793 6C E2 02 JMP ($02E2) 276 0796 SioJMP 277 0796 20 59 E4 JSR JSIOINT 278 ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie 279 0799 60 RTS 280 079A blokDanychIO_Loader 281 079A 31 01 52 40 D7 07 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 282 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) 283 = 07A2 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 284 07A4 SectorNumber 285 07A4 00 00 .WO $0000 286 07A6 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku 287 07A6 A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu 288 07A8 48 PHA 289 07A9 A9 73 LDA #<(JRESETWM-1) 290 07AB 48 PHA 291 ;WaitLine0 292 ; LDA VCOUNT 293 ; bne WaitLine0 294 07AC 6C E0 02 JMP ($02E0) 295 07AF Jrts 296 07AF 60 RTS 297 07B0 GetFile2Bytes 298 07B0 A9 02 85 26 A9 00 + mwa #2 BlockLen 299 07B8 GetFileBytes 300 07B8 A2 10 LDX #16 ; kanal 1 301 07BA A9 07 LDA #CGBINR ; rozkaz BGET 302 07BC 9D 42 03 STA ICCOM,X ; COMMAND 303 07BF A5 24 LDA InBlockAddr 304 07C1 9D 44 03 STA ICBUFA,x 305 07C4 A5 25 LDA InBlockAddr+1 306 07C6 9D 45 03 STA ICBUFA+1,x 307 07C9 A5 26 LDA BlockLen 308 07CB 9D 48 03 STA ICBUFL,x 309 07CE A5 27 LDA BlockLen+1 310 07D0 9D 49 03 STA ICBUFL+1,x 311 07D3 4C 56 E4 JMP CIO 312 313 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X 314 ; potrzebny do obslugi sektorow wiekszych od 256b 315 07D6 InSectorCountH 316 07D6 00 .BY $00 317 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 318 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz 319 ; w tym miejscu potem bedzie bufor 320 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora 321 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania 322 07D7 zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie 323 07D7 FirstMapSectorNr 324 07D7 00 00 .WO $0000 325 07D9 LoadStart 326 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP 327 07D9 AC E7 02 LDY MEMLO 328 07DC AD E8 02 LDA MEMLO+1 329 07DF 8D E6 07 STA InMemClearLoop+2 330 07E2 OutMemClearLoop 331 07E2 A9 00 LDA #$00 332 07E4 InMemClearLoop 333 07E4 99 00 09 STA $0900,Y 334 07E7 C8 INY 335 07E8 D0 FA BNE InMemClearLoop 336 07EA EE E6 07 INC InMemClearLoop+2 337 07ED AD E6 07 LDA InMemClearLoop+2 338 07F0 CD E6 02 CMP MEMTOP+1 339 07F3 90 ED BCC OutMemClearLoop 340 07F5 AD E6 02 LDA MEMTOP+1 341 07F8 8D 02 08 STA LastMemPageClear+2 342 07FB AC E5 02 LDY MEMTOP 343 07FE A9 00 LDA #$00 344 0800 LastMemPageClear 345 0800 99 00 80 STA $8000,Y 346 0803 88 DEY 347 0804 C0 FF CPY #$FF 348 0806 D0 F8 BNE LastMemPageClear 349 ; wyczyszczona, wiec .... 350 0808 AD 21 08 LDA tempToFileEndL 351 080B 85 28 STA ToFileEndL 352 080D A9 FF LDA #$FF 353 080F 8D FC 02 STA KBCODES 354 0812 EE 63 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) 355 0815 AE A2 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora 356 0818 AD A3 07 LDA Seclen+1 ; -- 357 081B 8D D6 07 STA InSectorCountH ; -- obsluga sektorow ponad 256b 358 ;jmp * 359 081E 4C 1B 07 JMP FileNextBlock 360 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku 361 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera 362 0821 tempToFileEndL 363 0821 00 .BY $00 364 .endl 365 2122 JAkieTurbo 366 2122 USmode 367 2122 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed 368 2123 QMEG 369 2123 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG 370 2124 BootDrive 371 2124 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi 372 2125 BootShift 373 2125 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety 374 2126 FolderTurbo 375 2126 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT 376 2127 NewColors 377 2127 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano 378 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) 379 2128 bin2AsciiHex 380 2128 29 0F AND #$0F 381 212A 09 30 ORA #$30 382 212C C9 3A CMP #$3A 383 212E 90 03 BCC labelka 384 2130 18 CLC 385 2131 69 07 ADC #$07 386 2133 labelka 387 2133 60 RTS 388 2134 Edriver 389 2134 45 3A 9B .BY "E:",$9b 390 2137 EditorOpen 391 ; otwarcie ekranu !!! 392 2137 A2 00 LDX #$00 ; kanal nr 0 393 2139 20 F5 2A JSR CloseX ; najpierw Zamkniecie Ekranu 394 213C 30 55 BMI ErrorDisplay 395 213E A2 00 LDX #$00 ; kanal nr 0 396 2140 A9 03 LDA #$03 397 2142 9D 42 03 STA ICCMD,X 398 2145 A9 0C LDA #$0C 399 2147 9D 4A 03 STA ICAX1,X 400 214A 9D 48 03 STA ICBUFL,X 401 214D A9 00 LDA #$00 402 214F 9D 4B 03 STA ICAX2,X 403 2152 9D 49 03 STA ICBUFL+1,X 404 2155 A9 34 LDA #Edriver 407 215C 9D 45 03 STA ICBUFA+1,X 408 215F 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 409 2162 30 2F BMI ErrorDisplay 410 2164 60 RTS 411 412 2165 mainprog 413 2165 AD 23 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US 414 2168 2D 25 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza 415 216B 8D 22 21 STA USmode 416 216E F0 1E BEQ NoUSSpeed 417 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler 418 2170 A0 BB ldy #blokDanychIO_GetUSSpeed 420 2174 20 E1 2A jsr Table2DCB 421 2177 20 59 E4 jsr JSIOINT ; wysylamy "?" 422 217A 10 07 bpl USSpeed 423 217C A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage 424 217E 8D 22 21 sta USmode 425 2181 F0 0B beq NoUSSpeed 426 2183 USSpeed 427 2183 A0 02 LDY #$2 428 2185 USstatprint 429 2185 B9 1D 2C LDA ONtext,y 430 2188 99 F7 22 STA USstatus,y 431 218B 88 DEY 432 218C 10 F7 bpl USstatprint 433 434 218E NoUSSpeed 435 218E 4C D4 21 JMP ReadMainDir 436 2191 Error148 437 2191 A0 94 LDY #$94 ; kod bledu do Y 438 ; wyswietlenie komunikatu o bledzie - kod bledu w Y 439 2193 ErrorDisplay 440 2193 98 TYA 441 2194 48 PHA 442 2195 20 F3 2A JSR Close1 443 2198 68 PLA 444 2199 48 PHA 445 219A 4A LSR 446 219B 4A LSR 447 219C 4A LSR 448 219D 4A LSR 449 219E 20 28 21 JSR bin2AsciiHex ; 4 starsze bity na HEX 450 21A1 8D BA 21 STA ErrorNumHex 451 21A4 68 PLA 452 21A5 20 28 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX 453 21A8 8D BB 21 STA ErrorNumHex+1 454 21AB 20 46 2A JSR PrintXY 455 21AE 00 00 .BY $00,$00 456 21B0 7D .BY $7d ; kod czyszczenia ekranu 457 21B1 45 52 52 4F 52 20 + .BY "ERROR - $" 458 21BA ErrorNumHex 459 21BA 30 30 00 .BY "00",$00 460 ; czekamy na dowolny klawisz 461 21BD A9 FF LDA #$FF 462 21BF 8D FC 02 STA KBCODES 463 21C2 WaitKloop 464 21C2 AE FC 02 LDX KBCODES 465 21C5 E8 INX 466 21C6 F0 FA BEQ WaitKloop 467 21C8 8D FC 02 STA KBCODES ; w A jest $FF 468 ; ------------------ 469 ; na wypadek wybrania nieistniejacej stacji 470 ; po bledzie przechodzimy na te z ktorej sie ladowalismy 471 21CB AD 24 21 LDA BootDrive 472 ;LDA #1 473 21CE 20 98 2B JSR SeTDriveNR 474 ; ----------------- 475 21D1 4C 65 21 JMP mainprog ; i odpalamy program od nowa 476 21D4 ReadMainDir 477 21D4 20 C0 29 JSR ReadPERCOM 478 21D7 A2 2D LDX #>FirstSectorBuff 479 21D9 A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) 488 21EB D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki 489 21ED SpartaDisk 490 21ED A2 00 LDX #$00 491 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 492 21EF AD 1F 2D LDA FirstSectorBuff+$1F 493 21F2 30 04 BMI Sektor128b 494 21F4 AA TAX 495 21F5 A9 00 LDA #$00 496 21F7 E8 INX ; i wyliczenie starszego bajtu 497 21F8 Sektor128b 498 21F8 8D A2 20 STA .adr loader.SecLen ; przed przepisaniem 499 21FB 8E A3 20 STX .adr loader.SecLen+1 ; przed przepisaniem 500 ; pokazanie na ekranie 501 21FE BD 1A 2C LDA DensityCodes,X 502 2201 8D D3 22 STA DensityDisplay 503 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu 504 2204 AC 09 2D LDY FirstSectorBuff+$09 505 2207 AE 0A 2D LDX FirstSectorBuff+$0A 506 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x 507 220A ReadDIR 508 ; ustawienie znacznika wlaczenia Turbo dla katalogu 509 220A A9 01 LDA #$01 510 220C 8D 26 21 STA FolderTurbo 511 220F 84 D2 STY DirMapSect 512 2211 86 D3 STX DirMapSect+1 513 2213 A9 2F LDA #>DirSectorBuff 514 2215 85 D1 STA CurrentFileInfoBuff+1 515 2217 85 CB STA CurrentDirBuf+1 516 2219 A9 80 LDA #" 658 2359 3A 4D 61 69 6E 20 + .BY ":Main Dir. " 659 2365 BC .BY +$80,"<" 660 2366 3A 55 50 2D 44 49 + .BY ":UP-DIR." 661 236E 00 .BY $00 662 236F A9 00 LDA #$00 663 2371 85 D9 STA NamesOnScreen 664 2373 label68 665 2373 A5 D1 LDA CurrentFileInfoBuff+1 666 2375 C5 CD CMP CurrentDirBufEnd+1 667 2377 90 08 BCC NoLastFileInDir 668 2379 D0 55 BNE LastFilesPageJump 669 237B A5 D0 LDA CurrentFileInfoBuff 670 237D C5 CC CMP CurrentDirBufEnd 671 237F B0 4F BCS LastFilesPageJump 672 2381 NoLastFileInDir 673 2381 A0 00 LDY #$00 674 2383 B1 D0 LDA (CurrentFileInfoBuff),Y 675 2385 F0 49 BEQ LastFilesPageJump 676 2387 A2 22 LDX #$22 677 2389 A9 20 LDA #$20 ; spacja 678 238B label50 679 238B 9D 3C 24 STA GameName,X 680 238E CA DEX 681 238F 10 FA BPL label50 682 2391 A0 10 LDY #$10 683 2393 A2 0A LDX #$0A 684 2395 label51 685 2395 B1 D0 LDA (CurrentFileInfoBuff),Y 686 2397 9D 3C 24 STA GameName,X 687 239A 88 DEY 688 239B CA DEX 689 239C 10 F7 BPL label51 690 239E A5 D9 LDA NamesOnScreen 691 23A0 18 CLC 692 23A1 69 41 ADC #$41 ; literka "A" 693 23A3 8D 39 24 STA GameKeySymbol 694 23A6 A5 D8 LDA $D8 695 23A8 D0 2C BNE label52 696 23AA A0 00 LDY #$00 697 ; status sprawdzanego pliku 698 23AC B1 D0 LDA (CurrentFileInfoBuff),Y 699 23AE 29 19 AND #$19 700 23B0 C9 09 CMP #$09 701 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" 702 23B2 F0 08 BEQ label53 703 23B4 A6 D7 LDX $D7 704 23B6 F0 1B BEQ label54 705 23B8 C9 08 CMP #$08 706 23BA D0 17 BNE label54 707 23BC label53 708 ; jeszcze raz status sprawdzanego pliku 709 23BC B1 D0 LDA (CurrentFileInfoBuff),Y 710 23BE 29 20 AND #$20 711 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) 712 23C0 F0 0B BEQ label55 713 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") 714 23C2 A2 08 LDX #$08 715 23C4 label56 716 23C4 BD 4B 25 LDA SubDirText,X 717 23C7 8D 48 24 STA GameName+12 718 23CA CA DEX 719 23CB 10 F7 BPL label56 720 23CD label55 721 23CD 4C 2C 24 JMP GameNamePrint 722 23D0 LastFilesPageJump 723 23D0 4C D4 24 JMP LastFilesPage 724 23D3 label54 725 23D3 4C 84 24 JMP label59 726 23D6 label52 727 23D6 A0 00 LDY #$00 728 23D8 B1 D0 LDA (CurrentFileInfoBuff),Y 729 23DA 29 18 AND #$18 730 23DC C9 08 CMP #$08 731 23DE D0 F3 BNE label54 732 23E0 A5 CC LDA CurrentDirBufEnd 733 23E2 85 D4 STA $D4 734 23E4 A5 CD LDA CurrentDirBufEnd+1 735 23E6 85 D5 STA $D5 736 23E8 label65 737 23E8 A5 D5 LDA $D5 738 23EA C5 CF CMP $CF 739 23EC 90 08 BCC label60 740 23EE D0 E3 BNE label54 741 23F0 A5 D4 LDA $D4 742 23F2 C5 CE CMP $CE 743 23F4 B0 DD BCS label54 744 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy 745 23F6 label60 746 23F6 A0 00 LDY #$00 747 23F8 B1 D4 LDA ($D4),Y 748 23FA C9 2A CMP #'*' 749 23FC D0 06 BNE CompareNames 750 23FE 8D 27 21 STA NewColors 751 2401 20 5E 2B JSR Asteriks 752 2404 CompareNames 753 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT 754 2404 A0 0A LDY #$0A ; 8+3 znaki 755 2406 Checking62 756 2406 B1 D4 LDA ($D4),Y 757 2408 D9 3C 24 CMP GameName,Y 758 240B D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw 759 240D 88 DEY 760 240E 10 F6 BPL Checking62 761 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku 762 2410 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku 763 2412 ReplacingName 764 2412 B1 D4 LDA ($D4),Y 765 2414 99 31 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania 766 2417 C8 INY 767 2418 C0 2E CPY #$2E 768 241A 90 F6 BCC ReplacingName 769 241C B0 0E BCS GameNamePrint 770 241E CheckNextName 771 241E A5 D4 LDA $D4 772 2420 18 CLC 773 2421 69 2E ADC #$2E 774 2423 85 D4 STA $D4 775 2425 90 02 BCC label64 776 2427 E6 D5 INC $D5 777 2429 label64 778 2429 4C E8 23 JMP label65 779 242C GameNamePrint 780 242C A5 D9 LDA NamesOnScreen 781 242E 18 CLC 782 242F 69 02 ADC #$02 783 2431 8D 38 24 STA YposGameName 784 2434 20 46 2A JSR PrintXY 785 2437 01 .BY $01 786 2438 YposGameName 787 2438 02 .BY $02 788 2439 GameKeySymbol 789 2439 41 29 20 .BY "A) " 790 243C GameName 791 243C 20 20 20 20 20 20 + .BY " " 792 245F 00 .BY $00 793 2460 A5 D9 LDA NamesOnScreen 794 2462 0A ASL 795 2463 AA TAX 796 2464 A5 D0 LDA CurrentFileInfoBuff 797 2466 9D 30 2C STA FirstSectorsTable,X 798 2469 A5 D1 LDA CurrentFileInfoBuff+1 799 246B 9D 31 2C STA FirstSectorsTable+1,X 800 246E A5 D0 LDA CurrentFileInfoBuff 801 2470 18 CLC 802 2471 69 17 ADC #$17 803 2473 85 D0 STA CurrentFileInfoBuff 804 2475 90 02 BCC label66 805 2477 E6 D1 INC CurrentFileInfoBuff+1 806 2479 label66 807 2479 E6 D9 INC NamesOnScreen 808 247B A5 D9 LDA NamesOnScreen 809 247D C9 13 CMP #$13 810 247F B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie 811 2481 4C 73 23 JMP label68 812 2484 label59 813 2484 A5 D0 LDA CurrentFileInfoBuff 814 2486 18 CLC 815 2487 69 17 ADC #$17 816 2489 85 D0 STA CurrentFileInfoBuff 817 248B 90 02 BCC label69 818 248D E6 D1 INC CurrentFileInfoBuff+1 819 248F label69 820 248F 4C 73 23 JMP label68 821 2492 MainDirKEY 822 2492 4C D4 21 JMP ReadMainDir 823 2495 UpDirKEY 824 2495 A0 02 LDY #$02 825 2497 B1 CA LDA (CurrentDirBuf),Y 826 2499 AA TAX 827 249A 88 DEY 828 249B 11 CA ORA (CurrentDirBuf),Y 829 249D F0 37 BEQ KeyboardProc 830 249F B1 CA LDA (CurrentDirBuf),Y 831 24A1 A8 TAY 832 24A2 4C 0A 22 JMP ReadDIR 833 24A5 EscKEY 834 ; sprawdzmy czy z Shift 835 24A5 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! 836 24A8 29 08 and #$08 837 24AA D0 06 BNE NoSHIFTEsc 838 24AC 20 37 21 JSR EditorOpen 839 24AF 6C 0A 00 JMP (DOSVEC) 840 24B2 NoSHIFTEsc 841 24B2 A2 00 LDX #$00 842 24B4 86 D8 STX $D8 843 24B6 E8 INX 844 24B7 86 D7 STX $D7 845 24B9 ToStartOfDirJump 846 24B9 4C BC 22 JMP ToStartOfDir 847 24BC SpaceKEY 848 24BC A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy 849 24BE D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku 850 24C0 4C CD 22 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej 851 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie 852 24C3 ContArrowsPrint 853 24C3 20 46 2A JSR PrintXY 854 24C6 01 15 .BY $01,$15 855 24C8 1D .BY $1D ; strzalka w dol 856 24C9 00 .BY $00 857 24CA 20 46 2A JSR PrintXY 858 24CD 0E 15 .BY $0E,$15 859 24CF 1D .BY $1D ; strzalka w dol 860 24D0 00 .BY $00 861 24D1 4C D6 24 JMP KeyboardProc 862 24D4 LastFilesPage 863 24D4 E6 D6 INC LastFilesPageFlag 864 24D6 KeyboardProc 865 24D6 AD 27 21 LDA NewColors 866 24D9 D0 0D BNE ColorsAlreadySet 867 24DB A9 C4 LDA #$C4 ; ustawienie koloru tła i liter 868 24DD 8D C6 02 STA COLPF2S 869 24E0 8D C8 02 STA COLBAKS 870 24E3 A9 CA LDA #$CA 871 24E5 8D C5 02 STA COLPF1S 872 24E8 ColorsAlreadySet 873 24E8 20 FD 2A JSR GetKey 874 24EB 29 7F AND #%01111111 ; eliminujemy invers 875 24ED F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu 876 24EF C9 3E CMP #$3E ; ">" 877 24F1 F0 9F BEQ MainDirKEY 878 24F3 C9 3C CMP #$3C ; "<" 879 24F5 F0 9E BEQ UpDirKEY 880 24F7 C9 7E CMP #$7E ; BackSpace 881 24F9 F0 9A BEQ UpDirKEY 882 24FB C9 1B CMP #$1B ; Esc 883 24FD F0 A6 BEQ EscKEY 884 24FF C9 20 CMP #$20 ; Spacja 885 2501 F0 B9 BEQ SpaceKEY 886 ; ---------------- 887 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) 888 2503 C9 10 CMP #$10 889 2505 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) 890 2507 20 AB 2B JSR SeTDriveLetter 891 250A 4C 65 21 JMP mainprog 892 250D noCtrlLetter 893 ; sprawdzenie klawiszy 1-8 894 250D C9 31 CMP #'1' 895 250F 90 0D BCC NoNumber 896 2511 C9 39 CMP #'9' 897 2513 B0 09 BCS NoNumber 898 2515 38 SEC 899 2516 E9 30 SBC #'0' 900 2518 20 98 2B JSR SeTDriveNR 901 251B 4C 65 21 JMP mainprog 902 ; ----------------- 903 251E NoNumber 904 251E C9 61 CMP #'a' ; czy nie ma capsa 905 2520 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany 906 2522 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) 907 2524 BigLetters 908 2524 38 SEC 909 2525 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy 910 2527 C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie 911 2529 B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz 912 252B 0A ASL 913 252C AA TAX 914 252D BD 30 2C LDA FirstSectorsTable,X 915 2530 85 D4 STA $D4 916 2532 BD 31 2C LDA FirstSectorsTable+1,X 917 2535 85 D5 STA $D5 918 2537 A0 00 LDY #$00 919 2539 B1 D4 LDA ($D4),Y 920 253B 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik 921 253D F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader 922 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran 923 253F A0 02 LDY #$02 924 2541 B1 D4 LDA ($D4),Y 925 2543 AA TAX 926 2544 88 DEY 927 2545 B1 D4 LDA ($D4),Y 928 2547 A8 TAY 929 2548 4C 0A 22 JMP ReadDIR 930 254B SubDirText 931 254B 3C 53 55 42 2D 44 + .BY "" 932 2554 GOtoLoader 933 2554 20 47 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka 934 2557 F0 03 BEQ DiskNotChanged1 935 2559 4C D4 21 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego 936 255C DiskNotChanged1 937 255C AD 26 21 LDA FolderTurbo 938 255F F0 07 BEQ SetTurboOFF 939 2561 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! 940 2564 29 08 and #$08 941 2566 D0 03 BNE NoSHIFT 942 2568 SetTurboOFF 943 2568 8D 22 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 944 256B NoSHIFT 945 256B A0 01 LDY #$01 946 256D B1 D4 LDA ($D4),Y 947 256F 8D D7 20 STA .adr loader.FirstMapSectorNr ; przed przepisaniem 948 2572 8D 43 2A sta blokDanychIO+$A ; od razu do bloku IOCB 949 2575 C8 INY 950 2576 B1 D4 LDA ($D4),Y 951 2578 8D D8 20 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem 952 257B 8D 44 2A sta blokDanychIO+$B ; od razu do bloku IOCB 953 257E C8 INY 954 257F B1 D4 LDA ($D4),Y 955 2581 49 FF EOR #$FF 956 2583 8D 21 21 STA .adr loader.tempToFileEndL 957 2586 C8 INY 958 2587 B1 D4 LDA ($D4),Y 959 2589 49 FF EOR #$FF 960 258B 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem 961 258E C8 INY 962 258F B1 D4 LDA ($D4),Y 963 2591 49 FF EOR #$FF 964 2593 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem 965 ; wszystko zapamietane mozna robic mape sektorow.... 966 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu 967 ; czyli DirSectorBuff 968 ; sektor mapy przed kompresja leci do DirMapSectorBuff 969 ; UWAGA 970 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi 971 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! 972 = 2F80 CompressedMap = DirSectorBuff 973 ; czytamy pierwszy sektor mapy 974 2596 A0 80 LDY #DirMapSectorBuff 976 259A 20 0B 2A Jsr ReadSector 977 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! 978 259D A9 00 LDA #00 979 259F 85 82 STA CompressedMapCounter 980 25A1 85 83 STA CompressedMapCounter+1 981 25A3 20 6F 26 JSR AddToCompressedMAP 982 25A6 AD 84 2D LDA DirMapSectorBuff+4 983 25A9 85 86 STA PrevFileSector 984 25AB 20 6F 26 JSR AddToCompressedMAP 985 25AE AD 85 2D LDA DirMapSectorBuff+5 986 25B1 85 87 sta PrevFileSector+1 987 25B3 20 6F 26 JSR AddToCompressedMAP 988 ; Inicjujemy liczniki 989 25B6 .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 990 25B6 .zpvar PrevFileSector, MapPositionMem .word 991 25B6 .zpvar SectorOffset .word 992 25B6 .zpvar SectorsCounter .byte 993 25B6 A9 00 LDA #$00 994 25B8 85 81 STA MapCounter+1 995 25BA 85 8C STA SectorsCounter 996 25BC A9 06 lda #$06 997 25BE 85 80 STA MapCounter 998 25C0 GenerateCompressedMap 999 25C0 18 CLC 1000 25C1 A9 80 LDA #DirMapSectorBuff 1004 25C9 65 81 ADC MapCounter+1 1005 25CB 85 89 STA MAPPositionMem+1 1006 25CD A2 00 LDX #0 1007 25CF A0 01 LDY #1 1008 25D1 A1 88 LDA (MAPPositionMem,x) 1009 25D3 11 88 ORA (MAPPositionMem),y 1010 25D5 F0 56 BEQ Sector00 1011 25D7 38 SEC 1012 25D8 A1 88 LDA (MAPPositionMem,x) 1013 25DA E5 86 SBC PrevFileSector 1014 25DC 85 8A STA SectorOffset 1015 25DE B1 88 LDA (MAPPositionMem),y 1016 25E0 E5 87 SBC PrevFileSector+1 1017 25E2 85 8B STA SectorOffset+1 1018 ; mamy odstep miedzy poprzednim a nastepnym sektorem 1019 25E4 D0 26 BNE OffsetToBig 1020 25E6 A5 8A LDA SectorOffset 1021 25E8 30 22 BMI OffsetToBig ; max przeskok 127 sektorow 1022 25EA C9 01 CMP #$01 1023 25EC D0 11 BNE JumpForward 1024 ; kolejny sektor 1025 ; zwiekszamy wiec licznik 1026 25EE E6 8C inc SectorsCounter 1027 25F0 A5 8C LDA SectorsCounter 1028 25F2 C9 7F CMP #%01111111 1029 25F4 D0 2C BNE GetNextMapWord 1030 ; tu licznik dotarl do konca zerujemy go 1031 ; dodajemy wpis do skompresowanej mapy i gotowe 1032 25F6 20 6F 26 JSR AddToCompressedMAP 1033 25F9 A9 00 LDA #0 1034 25FB 85 8C STA SectorsCounter 1035 25FD F0 23 BEQ GetNextMapWord 1036 ; ominiecie wyznaczonej ilości sektorów (w A) 1037 25FF JumpForward 1038 25FF 20 8A 26 JSR FlushBuffer 1039 2602 A5 8A LDA SectorOffset 1040 2604 09 80 ORA #%10000000 1041 2606 20 6F 26 JSR AddToCompressedMAP 1042 2609 4C 22 26 JMP GetNextMapWord 1043 ; wyznaczenie skoku do nowego sektora pliku 1044 260C OffsetToBig 1045 260C 20 8A 26 JSR FlushBuffer 1046 260F A9 00 LDA #0 1047 2611 20 6F 26 JSR AddToCompressedMAP 1048 2614 A0 00 LDY #00 1049 2616 B1 88 LDA (MAPPositionMem),y 1050 2618 20 6F 26 JSR AddToCompressedMAP 1051 261B A0 01 LDY #01 1052 261D B1 88 LDA (MAPPositionMem),y 1053 261F 20 6F 26 JSR AddToCompressedMAP 1054 2622 GetNextMapWord 1055 ; zapamietanie numeru obecnego sektora do porownania potem 1056 2622 A0 00 LDY #00 1057 2624 B1 88 LDA (MAPPositionMem),y 1058 2626 85 86 STA PrevFileSector 1059 2628 C8 INY 1060 2629 B1 88 LDA (MAPPositionMem),y 1061 262B 85 87 STA PrevFileSector+1 1062 262D Sector00 1063 262D 18 A5 80 69 02 85 + ADW MapCounter #2 1064 2638 ops01 1065 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala 1066 2638 A5 81 LDA MapCounter+1 1067 263A CD A3 20 CMP .adr loader.SecLen+1 1068 263D D0 05 bne noteqal01 1069 263F A5 80 LDA MapCounter 1070 2641 CD A2 20 CMP .adr loader.SecLen 1071 2644 noteqal01 1072 2644 F0 03 4C C0 25 JNE GenerateCompressedMap 1073 ; czytamy nastepny sektor mapy 1074 ; sprawdzmy czy nie koniec 1075 2649 AD 80 2D LDA DirMapSectorBuff 1076 264C 0D 81 2D ORA DirMapSectorBuff+1 1077 264F F0 45 BEQ EndMakingMap 1078 2651 AD 80 2D LDA DirMapSectorBuff 1079 2654 8D 43 2A sta blokDanychIO+$A 1080 2657 AD 81 2D LDA DirMapSectorBuff+1 1081 265A 8D 44 2A sta blokDanychIO+$B 1082 265D A0 80 LDY #DirMapSectorBuff 1084 2661 20 0B 2A Jsr ReadSector 1085 ; zerujemy licznik mapy 1086 2664 A9 00 LDA #$00 1087 2666 85 81 STA MapCounter+1 1088 2668 A9 04 lda #$04 1089 266A 85 80 STA MapCounter 1090 266C 4C C0 25 JMP GenerateCompressedMap 1091 ; dpisanie bajtu z A do mapy sektorow skompresowanej 1092 266F AddToCompressedMAP 1093 266F 48 PHA 1094 ; wyliczamy adresa 1095 2670 18 CLC 1096 2671 A5 82 LDA CompressedMapCounter 1097 2673 69 80 ADC #CompressedMap 1101 267C 8D 82 26 STA xxxxbla+1 1102 267F 68 PLA 1103 = 2681 xxxxbla=*+1 1104 2680 8D FF FF STA $FFFF 1105 2683 E6 82 INC CompressedMapCounter 1106 2685 D0 02 BNE noinc013 1107 2687 E6 83 INC CompressedMapCounter+1 1108 2689 noinc013 1109 2689 60 RTS 1110 268A FlushBuffer 1111 268A A5 8C LDA SectorsCounter 1112 268C F0 07 BEQ NoFlush 1113 268E 20 6F 26 JSR AddToCompressedMAP 1114 2691 A9 00 LDA #0 1115 2693 85 8C STA SectorsCounter 1116 2695 NoFlush 1117 2695 60 RTS 1118 2696 EndMakingMap 1119 2696 20 8A 26 JSR FlushBuffer 1120 2699 LoaderGo 1121 2699 A0 00 LDY #$00 1122 269B 8C 44 02 STY COLDST 1123 269E A9 01 LDA #$01 1124 26A0 85 09 STA BOOT 1125 26A2 AE 00 07 LDX $700 1126 26A5 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta 1127 26A7 D0 03 BNE NoRunFromDOS 1128 26A9 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! 1129 ; STA $D5EC ; to wylacza SpartaDOS X 1130 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) 1131 26AC NoRunFromDOS 1132 26AC A9 BD LDA #AfterWormStart 1135 26B2 85 0D STA DOSINI+1 1136 ; LDA #>JRESETCD 1137 ; STA DOSVEC+1 1138 ; LDA #TempMEMLO 1159 26D0 6D A3 20 ADC .adr loader.SecLen+1 1160 26D3 8D E8 02 STA MEMLO+1 1161 26D6 85 3E STA CompressedMapPos+1 1162 ; STA pointerMov2b 1163 ; STA APPMHI+1 1164 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora 1165 ; jest to jednoczesnie adres umieszczenia skompresowanej 1166 ; mapy sektorow pliku dla loadera ale MINUS 1 1167 26D8 A5 3D D0 02 C6 3E + DEW CompressedMapPos 1168 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej 1169 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) 1170 26E0 18 CLC 1171 26E1 AD E7 02 LDA MEMLO 1172 ; ADC CompressedMapCounter 1173 ; STA MEMLO 1174 26E4 8D 95 27 STA TurboRelocADDR 1175 26E7 AD E8 02 LDA MEMLO+1 1176 ; ADC CompressedMapCounter+1 1177 ; STA MEMLO+1 1178 26EA 8D 96 27 STA TurboRelocADDR+1 1179 26ED A9 71 LDA #JTESTROM 1182 26F3 85 0D STA DOSINI+1 1183 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) 1184 ; INC $033D ; bajty kontrolne zimnego startu 1185 ; INC $033E ; zmiana ich wartosci wymusza 1186 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) 1187 26F5 A2 00 LDX #$00 1188 26F7 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) 1189 ; STX BOOT 1190 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci 1191 26F9 moveloop1 1192 26F9 BD 00 20 LDA movedproc,X 1193 26FC 9D 00 07 STA $0700,X 1194 26FF BD 00 21 LDA movedproc+$0100,X 1195 2702 9D 00 08 STA $0800,X 1196 2705 E8 INX 1197 2706 D0 F1 BNE moveloop1 1198 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora 1199 /* moveloop2 1200 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy 1201 pointerMov2a=*+2 1202 LDA CompressedMap,x ; kod samomodyfikujacy sie 1203 pointerMov2b=*+2 1204 STA $FFFF,x ; kod samomodyfikujacy sie 1205 LDA CompressedMapCounter 1206 AND CompressedMapCounter+1 1207 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! 1208 BEQ SectorMapReady 1209 INX 1210 BNE moveloop2 1211 inc pointerMov2a 1212 inc pointerMov2b 1213 bne moveloop2 1214 SectorMapReady 1215 */ 1215 1216 2708 20 57 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO 1217 270B 20 C7 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) 1218 1219 270E A2 00 LDX #$00 1220 2710 8A TXA 1221 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) 1222 2711 ClearLoop1 1223 2711 9D 00 01 STA $0100,X ; STOS !!! 1224 2714 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) 1225 2717 9D 00 05 STA $0500,X 1226 271A 9D 00 06 STA $0600,X 1227 271D E0 80 CPX #$80 ;tylko ponad $80 1228 271F 90 02 BCC NoZpage 1229 2721 95 00 STA $00,X ; czyli polowa strony zerowej 1230 2723 NoZpage 1231 2723 E8 INX 1232 2724 D0 EB BNE ClearLoop1 1233 2726 A2 FF LDX #$FF 1234 2728 9A TXS ; "wyzerowanie wskaznika STOSU 1235 1236 ; a tutaj otwieramy kanal 1 CIO do odczytu 1237 1238 2729 A2 10 LDX #16 ; kanal 1 1239 272B A9 03 LDA #COPN ; rozkaz OPEN 1240 272D 9D 42 03 STA ICCOM,X ; COMMAND 1241 2730 A9 04 LDA #$04 ; READ 1242 2732 9D 4A 03 STA ICAUX1,X 1243 2735 A9 00 LDA #$00 1244 2737 9D 4B 03 STA ICAUX2,X 1245 273A A9 4A LDA # FileToOpen 1248 2741 9D 45 03 STA ICBADR+1,X 1249 2744 20 56 E4 JSR CIO 1250 1251 2747 4C D9 07 JMP loader.LoadStart ; po przepisaniu 1252 274A FileToOpen 1253 274A 48 3A 53 43 4F 52 + .BYTE 'H:SCORCH.XEX',0 1254 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba 1255 ; na koniec odpowiednie zmodyfikowanie MEMLO 1256 2757 ADDspeedProc 1257 2757 AD 22 21 LDA USmode 1258 275A F0 5F beq NoHappyLoader 1259 ; wyznaczamy offset procedury 1260 275C 38 SEC 1261 275D A9 BC LDA #HappyUSMovedProc 1265 2767 ED E8 02 SBC MEMLO+1 1266 276A 8D 19 2C STA HappyOffset+1 1267 1268 276D A0 00 LDY #0 1269 276F A2 09 LDX #[$A-1] ;xjsrA - the last 1270 ; relokujemy skoki pod offset z MEMLO 1271 2771 HappyRelocate 1272 2771 38 SEC 1273 2772 BD 04 2C LDA xjsrTableL,x 1274 2775 85 32 STA SecBuffer 1275 2777 BD 0E 2C LDA xjsrTableH,x 1276 277A 85 33 STA SecBuffer+1 1277 277C B1 32 LDA (SecBuffer),y 1278 277E ED 18 2C SBC HappyOffset 1279 2781 91 32 STA (SecBuffer),y 1280 2783 C8 INY 1281 2784 B1 32 LDA (SecBuffer),y 1282 2786 ED 19 2C SBC HappyOffset+1 1283 2789 91 32 STA (SecBuffer),y 1284 278B 88 DEY 1285 278C CA DEX 1286 278D 10 E2 BPL HappyRelocate 1287 1288 278F A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] 1289 2791 label72x 1290 2791 BD BC 27 LDA HappyUSMovedProc,X 1291 = 2795 TurboRelocADDR=*+1 1292 2794 9D 00 0A STA $0A00,X 1293 2797 CA DEX 1294 2798 E0 FF CPX #$FF 1295 279A D0 F5 BNE label72x 1296 279C A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] 1297 279E A2 00 LDX #$00 1298 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. 1299 27A0 label73 1300 27A0 98 TYA 1301 27A1 18 CLC 1302 27A2 6D E7 02 ADC MEMLO 1303 27A5 8D E7 02 STA MEMLO 1304 27A8 8A TXA 1305 27A9 6D E8 02 ADC MEMLO+1 1306 27AC 8D E8 02 STA MEMLO+1 1307 27AF AD 95 27 LDA TurboRelocADDR 1308 27B2 8D 97 07 STA loader.SioJMP+1 ; po przepisaniu 1309 27B5 AD 96 27 LDA TurboRelocADDR+1 1310 27B8 8D 98 07 STA loader.SioJMP+2 ; po przepisaniu 1311 27BB NoHappyLoader 1312 27BB 60 RTS 1313 1314 1315 1316 ; UWAGA !!!!!!!!!!!!!! 1317 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! 1318 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone 1319 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! 1320 27BC HappyUSMovedProc ; 1321 1322 27BC AD 04 03 LDA DBUFA 1323 27BF 85 32 STA SecBuffer 1324 27C1 AD 05 03 LDA DBUFA+1 1325 27C4 85 33 STA SecBuffer+1 1326 1327 27C6 AD 08 03 LDA DBYT 1328 27C9 85 31 STA SecLenUS 1329 1330 27CB 78 SEI 1331 27CC BA TSX 1332 27CD 86 37 STX StackCopy 1333 27CF A9 0D LDA #$0D 1334 27D1 85 34 STA CRETRYZ 1335 ;command retry on zero page 1336 27D3 CommandLoop 1337 = 27D4 HappySpeed = *+1 1338 27D3 A9 28 LDA #$28 ;here goes speed from "?" 1339 27D5 8D 04 D2 STA AUDF3 1340 27D8 A9 34 LDA #$34 1341 27DA 8D 03 D3 STA PBCTL ;ustawienie linii command 1342 27DD A2 80 LDX #$80 1343 27DF DelayLoopCmd 1344 27DF CA DEX 1345 27E0 D0 FD BNE DelayLoopCmd 1346 27E2 8E 06 D2 STX AUDF4 ; zero 1347 27E5 86 35 STX TransmitError 1348 ; pokey init 1349 27E7 A9 23 LDA #$23 1350 27E9 20 5D 28 xjsr1 JSR SecTransReg 1351 ; 1352 1353 27EC 18 CLC 1354 27ED AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) 1355 27F0 6D 01 03 ADC DUNIT ; dodajemy numer stacji 1356 27F3 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) 1357 27F5 85 30 STA CheckSum 1358 27F7 8D 0D D2 STA SEROUT 1359 27FA AD 02 03 LDA DCOMND 1360 27FD 20 73 28 xjsr2 JSR PutSIOByte 1361 2800 AD 0A 03 LDA DAUX1 1362 2803 20 73 28 xjsr3 JSR PutSIOByte 1363 2806 AD 0B 03 LDA DAUX2 1364 2809 20 73 28 xjsr4 JSR PutSIOByte 1365 280C A5 30 LDA CheckSum 1366 280E 20 73 28 xjsr5 JSR PutSIOByte 1367 1368 2811 waitforEndOftransmission 1369 2811 AD 0E D2 LDA IRQST 1370 2814 29 08 AND #$08 1371 2816 D0 F9 BNE waitforEndOftransmission 1372 1373 2818 A9 13 LDA #$13 1374 281A 20 5D 28 xjsr6 JSR SecTransReg 1375 1376 281D A9 3C LDA #$3c 1377 281F 8D 03 D3 STA PBCTL ;command line off 1378 ; two ACK's 1379 2822 A0 02 LDY #2 1380 2824 DoubleACK 1381 2824 20 8F 28 xjsr7 JSR GetSIOByte 1382 2827 C9 44 CMP #$44 1383 2829 B0 19 BCS ErrorHere 1384 282B 88 DEY 1385 282C D0 F6 BNE DoubleACK 1386 1387 ;ldy #0 1388 282E 84 30 STY CheckSum 1389 2830 ReadSectorLoop 1390 2830 20 8F 28 xjsr8 JSR GetSIOByte 1391 2833 91 32 STA (SecBuffer),y 1392 2835 20 87 28 xjsr9 JSR AddCheckSum 1393 2838 C8 INY 1394 2839 C4 31 CPY SecLenUS 1395 283B D0 F3 BNE ReadSectorLoop 1396 1397 283D 20 8F 28 xjsrA JSR GetSIOByte 1398 2840 C5 30 CMP CheckSum 1399 2842 F0 0B BEQ EndOfTransmission 1400 ;error!!! 1401 2844 ErrorHere 1402 2844 A0 90 LDY #$90 1403 2846 84 35 STY TransmitError 1404 2848 A6 37 LDX StackCopy 1405 284A 9A TXS 1406 284B C6 34 DEC CRETRYZ 1407 284D D0 84 BNE CommandLoop 1408 1409 284F EndOfTransmission 1410 284F A9 00 LDA #0 1411 2851 8D 07 D2 STA AUDC4 1412 2854 A5 10 LDA IRQENS 1413 2856 8D 0E D2 STA IRQEN 1414 2859 58 CLI 1415 285A A4 35 LDY TransmitError 1416 285C 60 RTS 1417 1418 285D SecTransReg 1419 285D 8D 0F D2 STA SKCTL 1420 2860 8D 0A D2 STA SKSTRES 1421 2863 A9 38 LDA #$38 1422 2865 8D 0E D2 STA IRQEN 1423 2868 A9 28 LDA #$28 1424 286A 8D 08 D2 STA AUDCTL 1425 286D A9 A8 LDA #$A8 1426 286F 8D 07 D2 STA AUDC4 1427 2872 60 RTS 1428 1429 2873 PutSIOByte 1430 2873 AA TAX 1431 2874 waitforSerial 1432 2874 AD 0E D2 LDA IRQST 1433 2877 29 10 AND #$10 1434 2879 D0 F9 BNE waitforSerial 1435 1436 287B 8D 0E D2 STA IRQEN 1437 287E A9 10 LDA #$10 1438 2880 8D 0E D2 STA IRQEN 1439 1440 2883 8A TXA 1441 2884 8D 0D D2 STA SEROUT 1442 1443 2887 AddCheckSum 1444 2887 18 CLC 1445 2888 65 30 ADC CheckSum 1446 288A 69 00 ADC #0 1447 288C 85 30 STA CheckSum 1448 288E 60 RTS 1449 1450 288F GetSIOByte 1451 288F A2 0A LDX #10 ;acktimeout 1452 2891 ExternalLoop 1453 2891 A9 00 LDA #0 1454 2893 85 36 STA looperka 1455 2895 InternalLoop 1456 2895 AD 0E D2 LDA IRQST 1457 2898 29 20 AND #$20 1458 289A F0 09 BEQ ACKReceive 1459 289C C6 36 DEC looperka 1460 289E D0 F5 BNE InternalLoop 1461 28A0 CA DEX 1462 28A1 D0 EE BNE ExternalLoop 1463 28A3 F0 9F BEQ ErrorHere 1464 28A5 ACKReceive 1465 ; zero we have now 1466 28A5 8D 0E D2 STA IRQST 1467 28A8 A9 20 LDA #$20 1468 28AA 8D 0E D2 STA IRQST 1469 28AD AD 0F D2 LDA SKSTAT 1470 28B0 8D 0A D2 STA SKSTRES 1471 28B3 29 20 AND #$20 1472 28B5 F0 8D BEQ ErrorHere 1473 ; 1474 28B7 AD 0D D2 LDA SERIN 1475 28BA 60 RTS 1476 28BB EndHappyUSProc 1477 1478 1479 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler 1480 28BB blokDanychIO_GetUSSpeed 1481 28BB 31 01 3F 40 .BY $31,$01,"?",$40 1482 28BF D4 27 .WO HappySpeed 1483 28C1 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A 1484 28C7 DirMapEnd 1485 28C7 4C 93 29 JMP label75 1486 28CA label39 1487 28CA 85 DA STA $DA 1488 28CC A5 D0 LDA CurrentFileInfoBuff 1489 28CE 85 DB STA $DB 1490 28D0 A5 D1 LDA CurrentFileInfoBuff+1 1491 28D2 85 DC STA $DC 1492 28D4 20 47 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka 1493 28D7 F0 05 BEQ DiscNotChanged2 1494 28D9 68 PLA 1495 28DA 68 PLA 1496 28DB 4C D4 21 JMP ReadMainDir 1497 28DE DiscNotChanged2 1498 ; odczyt sektora mapy wskazywanego przez DirMapSec 1499 28DE A5 D2 LDA DirMapSect 1500 28E0 8D 43 2A STA blokDanychIO+10 1501 28E3 A5 D3 LDA DirMapSect+1 1502 28E5 8D 44 2A STA blokDanychIO+11 1503 28E8 0D 43 2A ORA blokDanychIO+10 1504 28EB F0 DA BEQ DirMapEnd 1505 28ED A2 2D LDX #>DirMapSectorBuff 1506 28EF A0 80 LDY #DirMapSectorBuff ; -- 1532 291B 65 E3 ADC InMapPointer+1 ; -- 1533 291D 85 E5 STA TempZP+1 ; -- 1534 291F B1 E4 LDA (TempZP),Y 1535 2921 8D 43 2A STA blokDanychIO+10 1536 2924 C8 INY 1537 2925 B1 E4 LDA (TempZP),Y 1538 2927 8D 44 2A STA blokDanychIO+11 1539 292A 0D 43 2A ORA blokDanychIO+10 1540 292D F0 64 BEQ label75 1541 ; i zwiekszenie wskaznika mapy o 2 1542 292F C8 INY 1543 2930 84 E2 STY InMapPointer 1544 2932 D0 02 BNE NoIncH ; -- 1545 2934 E6 E3 INC InMapPointer+1 ; -- 1546 2936 NoIncH 1547 2936 AD E5 02 LDA MEMTOP 1548 2939 38 SEC 1549 293A E5 D0 SBC CurrentFileInfoBuff 1550 293C AD E6 02 LDA MEMTOP+1 1551 293F E5 D1 SBC CurrentFileInfoBuff+1 1552 2941 F0 50 BEQ label75 1553 2943 A4 D0 LDY CurrentFileInfoBuff 1554 2945 A6 D1 LDX CurrentFileInfoBuff+1 1555 2947 20 0B 2A JSR ReadSector 1556 294A A5 D4 LDA $D4 1557 294C 05 D5 ORA $D5 1558 294E D0 16 BNE label79 1559 2950 A0 03 LDY #$03 1560 2952 B1 D0 LDA (CurrentFileInfoBuff),Y 1561 2954 85 D4 STA $D4 1562 2956 C8 INY 1563 2957 B1 D0 LDA (CurrentFileInfoBuff),Y 1564 2959 85 D5 STA $D5 1565 295B C8 INY 1566 295C B1 D0 LDA (CurrentFileInfoBuff),Y 1567 295E F0 06 BEQ label79 1568 2960 A9 FF LDA #$FF 1569 2962 85 D4 STA $D4 1570 2964 85 D5 STA $D5 1571 2966 label79 1572 2966 A5 D0 LDA CurrentFileInfoBuff 1573 2968 18 CLC 1574 2969 6D A2 20 ADC .adr loader.SecLen ; przed przepisaniem 1575 296C 85 D0 STA CurrentFileInfoBuff 1576 296E A5 D1 LDA CurrentFileInfoBuff+1 1577 2970 6D A3 20 ADC .adr loader.SecLen+1 ; przed przepisaniem 1578 2973 85 D1 STA CurrentFileInfoBuff+1 1579 2975 A5 D4 LDA $D4 1580 2977 38 SEC 1581 2978 ED A2 20 SBC .adr loader.SecLen ; przed przepisaniem 1582 297B 85 D4 STA $D4 1583 297D A5 D5 LDA $D5 1584 297F ED A3 20 SBC .adr loader.SecLen+1 ; przed przepisaniem 1585 2982 85 D5 STA $D5 1586 2984 B0 80 BCS label80 1587 2986 A5 D0 LDA CurrentFileInfoBuff 1588 2988 18 CLC 1589 2989 65 D4 ADC $D4 1590 298B 85 D0 STA CurrentFileInfoBuff 1591 298D A5 D1 LDA CurrentFileInfoBuff+1 1592 298F 65 D5 ADC $D5 1593 2991 85 D1 STA CurrentFileInfoBuff+1 1594 2993 label75 1595 2993 A5 DC LDA $DC 1596 2995 C5 D1 CMP CurrentFileInfoBuff+1 1597 2997 90 0B BCC label81 1598 2999 D0 17 BNE label82 1599 299B A5 DB LDA $DB 1600 299D C5 D0 CMP CurrentFileInfoBuff 1601 299F 90 03 BCC label81 1602 29A1 D0 0F BNE label82 1603 29A3 60 RTS 1604 29A4 label81 1605 29A4 A5 DB LDA $DB 1606 29A6 18 CLC 1607 29A7 65 DA ADC $DA 1608 29A9 85 DB STA $DB 1609 29AB 90 E6 BCC label75 1610 29AD E6 DC INC $DC 1611 29AF 4C 93 29 JMP label75 1612 29B2 label82 1613 29B2 A5 DB LDA $DB 1614 29B4 38 SEC 1615 29B5 E5 DA SBC $DA 1616 29B7 85 D0 STA CurrentFileInfoBuff 1617 29B9 A5 DC LDA $DC 1618 29BB E9 00 SBC #$00 1619 29BD 85 D1 STA CurrentFileInfoBuff+1 1620 29BF 60 RTS 1621 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora 1622 29C0 ReadPERCOM 1623 29C0 A9 04 LDA #$04 1624 29C2 8D 45 2A STA DiskRetryCount 1625 29C5 ReadPERCOMretry 1626 29C5 A0 E9 LDY #blokDanychIO_PERCOM 1628 29C9 20 E1 2A JSR Table2DCB 1629 29CC 20 D6 2A JSR GoSIO 1630 29CF 30 08 BMI PercomError 1631 ; blok odczytany - ustawmy dlugosc 1 sektora 1632 29D1 AD 2A 2C LDA PERCOMdata+6 1633 29D4 C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 1634 29D6 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest 1635 29D8 60 RTS 1636 29D9 PercomError 1637 29D9 CE 45 2A DEC DiskRetryCount 1638 29DC D0 E7 BNE ReadPERCOMretry 1639 ; blok nieodczytany - dlugosc 1 sektora na $80 1640 29DE Set1Sect128 1641 29DE A9 00 LDA #$00 1642 29E0 8D 2A 2C STA PERCOMdata+6 1643 29E3 A9 80 LDA #$80 1644 29E5 8D 2B 2C STA PERCOMdata+7 1645 29E8 60 RTS 1646 29E9 blokDanychIO_PERCOM 1647 29E9 31 01 4E 40 .BY $31,$01,$4E,$40 1648 29ED 24 2C .WO PERCOMdata 1649 29EF 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 1650 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) 1651 29F5 ReadFirstSect 1652 29F5 A9 01 LDA #$01 1653 29F7 8D 43 2A STA blokDanychIO+10 1654 29FA A9 00 LDA #$00 1655 29FC 8D 44 2A STA blokDanychIO+11 1656 29FF AD 2A 2C LDA PERCOMdata+6 1657 2A02 8D 42 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b 1658 2A05 AD 2B 2C LDA PERCOMdata+7 1659 2A08 4C 14 2A JMP ReadSector1 1660 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) 1661 ; reszta danych jak nizej (A nie wazne) 1662 2A0B ReadSector 1663 2A0B AD A3 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b 1664 2A0E 8D 42 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b 1665 2A11 AD A2 20 LDA .adr loader.SecLen ; przed przepisaniem 1666 2A14 ReadSector1 1667 2A14 8D 41 2A STA blokDanychIO+8 1668 2A17 8E 3E 2A STX blokDanychIO+5 1669 2A1A 8C 3D 2A STY blokDanychIO+4 1670 2A1D A9 04 LDA #$04 1671 2A1F 8D 45 2A STA DiskRetryCount 1672 2A22 DiskReadRetry 1673 2A22 A0 39 LDY #blokDanychIO 1675 2A26 20 E1 2A JSR Table2DCB 1676 2A29 20 D6 2A JSR GoSIO 1677 2A2C 30 01 BMI label85 1678 2A2E 60 RTS 1679 2A2F label85 1680 2A2F CE 45 2A DEC DiskRetryCount 1681 2A32 D0 EE BNE DiskReadRetry 1682 2A34 68 PLA 1683 2A35 68 PLA 1684 2A36 4C 93 21 JMP ErrorDisplay 1685 2A39 blokDanychIO 1686 2A39 31 01 52 40 .BY $31,$01,$52,$40 1687 2A3D 80 2D .WO DirMapSectorBuff 1688 2A3F 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 1689 2A45 DiskRetryCount 1690 2A45 00 .BY $00 1691 2A46 PrintXY 1692 2A46 68 PLA 1693 2A47 85 C8 STA $C8 1694 2A49 68 PLA 1695 2A4A 85 C9 STA $C9 1696 2A4C A9 00 LDA #$00 1697 2A4E 85 DF STA $DF 1698 2A50 20 C8 2A JSR label87 1699 2A53 48 PHA 1700 2A54 20 C8 2A JSR label87 1701 2A57 85 DE STA $DE 1702 2A59 0A ASL 1703 2A5A 0A ASL 1704 2A5B 18 CLC 1705 2A5C 65 DE ADC $DE 1706 2A5E 0A ASL 1707 2A5F 0A ASL 1708 2A60 26 DF ROL $DF 1709 2A62 0A ASL 1710 2A63 26 DF ROL $DF 1711 2A65 18 CLC 1712 2A66 65 58 ADC SAVMSC 1713 2A68 85 DE STA $DE 1714 2A6A A5 DF LDA $DF 1715 2A6C 65 59 ADC SAVMSC+1 1716 2A6E 85 DF STA $DF 1717 2A70 68 PLA 1718 2A71 A8 TAY 1719 2A72 label92 1720 2A72 20 C8 2A JSR label87 1721 2A75 C9 00 CMP #$00 1722 2A77 F0 48 BEQ label88 1723 2A79 C9 7D CMP #$7D 1724 2A7B F0 21 BEQ label89 1725 2A7D A2 00 LDX #$00 1726 2A7F 86 E0 STX $E0 1727 2A81 C9 80 CMP #$80 1728 2A83 66 E0 ROR $E0 1729 2A85 29 7F AND #$7F 1730 2A87 C9 20 CMP #$20 1731 2A89 B0 04 BCS label90 1732 2A8B 09 40 ORA #$40 1733 2A8D D0 07 BNE label91 1734 2A8F label90 1735 2A8F C9 60 CMP #$60 1736 2A91 B0 03 BCS label91 1737 2A93 38 SEC 1738 2A94 E9 20 SBC #$20 1739 2A96 label91 1740 2A96 05 E0 ORA $E0 1741 2A98 91 DE STA ($DE),Y 1742 2A9A C8 INY 1743 2A9B 4C 72 2A JMP label92 1744 2A9E label89 1745 2A9E 98 TYA 1746 2A9F 48 PHA 1747 2AA0 A5 58 LDA SAVMSC 1748 2AA2 85 E0 STA $E0 1749 2AA4 A9 03 LDA #$03 1750 2AA6 AA TAX 1751 2AA7 18 CLC 1752 2AA8 65 59 ADC SAVMSC+1 1753 2AAA 85 E1 STA $E1 1754 2AAC A0 BF LDY #$BF 1755 2AAE A9 00 LDA #$00 1756 2AB0 label93 1757 2AB0 91 E0 STA ($E0),Y 1758 2AB2 88 DEY 1759 2AB3 C0 FF CPY #$FF 1760 2AB5 D0 F9 BNE label93 1761 2AB7 C6 E1 DEC $E1 1762 2AB9 CA DEX 1763 2ABA 10 F4 BPL label93 1764 2ABC 68 PLA 1765 2ABD A8 TAY 1766 2ABE 4C 72 2A JMP label92 1767 2AC1 label88 1768 2AC1 A5 C9 LDA $C9 1769 2AC3 48 PHA 1770 2AC4 A5 C8 LDA $C8 1771 2AC6 48 PHA 1772 2AC7 60 RTS 1773 2AC8 label87 1774 2AC8 E6 C8 INC $C8 1775 2ACA D0 02 BNE label94 1776 2ACC E6 C9 INC $C9 1777 2ACE label94 1778 2ACE A2 00 LDX #$00 1779 2AD0 A1 C8 LDA ($C8,X) 1780 2AD2 60 RTS 1781 2AD3 GoErrorDisp 1782 2AD3 4C 93 21 JMP ErrorDisplay 1783 ; Skok do Sio lub procedury Turbo 1784 2AD6 GoSIO 1785 2AD6 AC 22 21 LDY USmode 1786 2AD9 F0 03 BEQ StandardSpeed 1787 2ADB 4C BC 27 JMP HappyUSMovedProc ; mozna skakac do tej procki 1788 2ADE StandardSpeed 1789 2ADE 4C 59 E4 JMP JSIOINT 1790 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) 1791 ; do bloku kontroli transmisji szeregowej DCB 1792 2AE1 Table2DCB 1793 2AE1 8C EA 2A STY IOtableAddr+1 1794 2AE4 8E EB 2A STX IOtableAddr+2 1795 2AE7 A2 0B LDX #$0B 1796 2AE9 IOtableAddr 1797 2AE9 BD FF FF LDA $FFFF,X 1798 2AEC 9D 00 03 STA DDEVIC,X 1799 2AEF CA DEX 1800 2AF0 10 F7 BPL IOtableAddr 1801 2AF2 60 RTS 1802 2AF3 Close1 1803 2AF3 A2 10 LDX #$10 1804 2AF5 CloseX 1805 2AF5 A9 0C LDA #$0C 1806 2AF7 9D 42 03 STA ICCMD,X 1807 2AFA 4C 56 E4 JMP JCIOMAIN 1808 2AFD GetKey 1809 2AFD A2 10 LDX #$10 1810 2AFF A9 03 LDA #$03 1811 2B01 9D 42 03 STA ICCMD,X 1812 2B04 A9 04 LDA #$04 1813 2B06 9D 4A 03 STA ICAX1,X 1814 2B09 A9 00 LDA #$00 1815 2B0B 9D 4B 03 STA ICAX2,X 1816 2B0E 9D 49 03 STA ICBUFL+1,X 1817 2B11 A9 FF LDA #$FF 1818 2B13 9D 48 03 STA ICBUFL,X 1819 2B16 A9 44 LDA #Kdriver 1822 2B1D 9D 45 03 STA ICBUFA+1,X 1823 2B20 20 56 E4 JSR JCIOMAIN 1824 2B23 30 1C BMI GKeyError 1825 2B25 A2 10 LDX #$10 1826 2B27 A9 00 LDA #$00 1827 2B29 9D 48 03 STA ICBUFL,X 1828 2B2C 9D 49 03 STA ICBUFL+1,X 1829 2B2F A9 07 LDA #$07 1830 2B31 9D 42 03 STA ICCMD,X 1831 2B34 20 56 E4 JSR JCIOMAIN 1832 2B37 30 08 BMI GKeyError 1833 2B39 48 PHA 1834 2B3A 20 F3 2A JSR Close1 1835 2B3D 30 02 BMI GKeyError 1836 2B3F 68 PLA 1837 2B40 60 RTS 1838 2B41 GKeyError 1839 2B41 4C D3 2A JMP GoErrorDisp 1840 2B44 Kdriver 1841 2B44 4B 3A 9B .BY "K:",$9B 1842 2B47 DiscChangeCheck 1843 2B47 A0 80 LDY #DirMapSectorBuff 1845 2B4B 20 F5 29 JSR ReadFirstSect 1846 2B4E A2 7F LDX #$7F 1847 2B50 label98 1848 2B50 BD 00 2D LDA FirstSectorBuff,X 1849 2B53 DD 80 2D CMP DirMapSectorBuff,X 1850 2B56 D0 05 BNE ChangedD 1851 2B58 CA DEX 1852 2B59 10 F5 BPL label98 1853 2B5B A9 00 LDA #$00 1854 2B5D ChangedD 1855 2B5D 60 RTS 1856 ; obsluga gwiazdki 1857 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * 1858 ; w Y jest ) - X moze lepiej nie ruszac :) 1859 2B5E Asteriks 1860 2B5E A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) 1861 2B60 20 7C 2B JSR GetHexNumber 1862 2B63 8D C5 02 STA COLPF1S ; literki 1863 2B66 C8 INY 1864 2B67 20 7C 2B JSR GetHexNumber 1865 2B6A 8D C6 02 STA COLPF2S ; tlo 1866 2B6D C8 INY 1867 2B6E 20 7C 2B JSR GetHexNumber 1868 2B71 8D C8 02 STA COLBAKS ; ramka 1869 2B74 C8 INY 1870 2B75 20 7C 2B JSR GetHexNumber 1871 2B78 8D 26 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) 1872 2B7B 60 RTS 1873 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX 1874 ; i zamienia na bajt w A 1875 2B7C GetHexNumber 1876 2B7C 20 8C 2B JSR GetHEX4bits 1877 2B7F 0A ASL 1878 2B80 0A ASL 1879 2B81 0A ASL 1880 2B82 0A ASL 1881 2B83 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. 1882 2B85 C8 INY 1883 2B86 20 8C 2B JSR GetHEX4bits 1884 2B89 05 E4 ORA TempZP 1885 2B8B 60 RTS 1886 2B8C GetHEX4bits 1887 2B8C B1 D4 LDA ($D4),Y 1888 2B8E 38 SEC 1889 2B8F E9 30 SBC #'0' 1890 2B91 C9 0A CMP #$0A ; sprawdzmy czy cyfra 1891 2B93 90 02 BCC IsNumber 1892 2B95 E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow 1893 2B97 IsNumber 1894 2B97 60 RTS 1895 ; Ustawia numer satcji wg A 1896 2B98 SeTDriveNR 1897 2B98 C9 09 CMP #$09 1898 2B9A B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry 1899 2B9C 20 BA 2B JSR SeTblokDanychDrive 1900 2B9F 18 CLC 1901 2BA0 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 1902 2BA2 8D D5 22 STA DriveDisp1 1903 2BA5 A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu 1904 2BA7 8D D4 22 STA DriveDisp1-1 1905 2BAA 60 RTS 1906 2BAB SeTDriveLetter 1907 2BAB 20 BA 2B JSR SeTblokDanychDrive 1908 2BAE 18 CLC 1909 2BAF 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu 1910 2BB1 8D D5 22 STA DriveDisp1 1911 2BB4 A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja 1912 2BB6 8D D4 22 STA DriveDisp1-1 1913 2BB9 60 RTS 1914 2BBA SeTblokDanychDrive 1915 2BBA 8D 9B 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem 1916 2BBD 8D 3A 2A STA blokDanychIO+1 1917 2BC0 8D BC 28 STA blokDanychIO_GetUSSpeed+1 1918 2BC3 8D EA 29 STA blokDanychIO_PERCOM+1 1919 2BC6 60 RTS 1920 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku 1921 2BC7 MEMLOprint 1922 2BC7 AD E7 02 LDA MEMLO 1923 2BCA 48 PHA 1924 2BCB 4A LSR 1925 2BCC 4A LSR 1926 2BCD 4A LSR 1927 2BCE 4A LSR 1928 2BCF 20 28 21 JSR bin2AsciiHex 1929 2BD2 8D 00 2C STA MEMLOvalue+2 1930 2BD5 68 PLA 1931 2BD6 20 28 21 JSR bin2AsciiHex 1932 2BD9 8D 01 2C STA MEMLOvalue+3 1933 2BDC AD E8 02 LDA MEMLO+1 1934 2BDF 48 PHA 1935 2BE0 4A LSR 1936 2BE1 4A LSR 1937 2BE2 4A LSR 1938 2BE3 4A LSR 1939 2BE4 20 28 21 JSR bin2AsciiHex 1940 2BE7 8D FE 2B STA MEMLOvalue 1941 2BEA 68 PLA 1942 2BEB 20 28 21 JSR bin2AsciiHex 1943 2BEE 8D FF 2B STA MEMLOvalue+1 1944 2BF1 20 46 2A JSR PrintXY 1945 2BF4 1C 17 .BY 28,23 1946 2BF6 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" 1947 2BFE MEMLOvalue 1948 2BFE 30 30 30 30 .BY "0000" 1949 2C02 00 .BY $00 1950 2C03 60 RTS 1951 1952 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo 1953 1954 2C04 xjsrTableL 1955 2C04 EA FE 04 .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] 1956 2C07 0A 0F .BY <[xjsr4+1],<[xjsr5+1] 1957 2C09 1B 25 31 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] 1958 2C0C 36 3E .BY <[xjsr9+1],<[xjsrA+1] 1959 2C0E xjsrTableH 1960 2C0E 27 27 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] 1961 2C11 28 28 .BY >[xjsr4+1],>[xjsr5+1] 1962 2C13 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] 1963 2C16 28 28 .BY >[xjsr9+1],>[xjsrA+1] 1964 ; miejsce na wyliczony offset o jaki przesuwamy procedure 1965 2C18 HappyOffset 1966 2C18 00 00 .WO $0000 1967 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) 1968 2C1A DensityCodes 1969 2C1A F3 E4 F1 .by +$80,"sdq" 1970 ;.by "SDQ" 1971 ;.by $0e,$15,$a0 1972 2C1D ONtext 1973 2C1D CF CE A0 .BY +$80,"ON " 1974 2C20 OFFtext 1975 2C20 CF C6 C6 .BY +$80,"OFF" 1976 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) 1977 2C23 PDVMASKtemp 1978 2C23 00 .BY $00 1979 ; miejsce na blok PERCOM 1980 2C24 PERCOMdata 1981 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie 1982 = 2C30 FirstSectorsTable=*+12 ; omijamy 12b na percom 1983 ; zostawiamy $30 bajtow wolnego 1984 1985 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow 1986 = 2D00 ProgramEnd=FirstSectorBuff 1987 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu 1988 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu 1989 2C24 FirstRun 1990 ; odnotowujemy stan Shift z Bootowania 1991 2C24 AD 0F D2 LDA SKSTAT 1992 2C27 29 08 and #$08 1993 2C29 D0 03 BNE NoSHIFTboot 1994 2C2B 8D 25 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 1995 2C2E NoSHIFTboot 1996 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie 1997 2C2E AD 01 D3 LDA PORTB 1998 2C31 29 02 AND #$02 1999 2C33 D0 0B BNE BrakBasica 2000 ; jest Basic 2001 2C35 A0 02 LDY #$2 2002 2C37 BASstatprint 2003 2C37 B9 1D 2C LDA ONtext,y 2004 2C3A 99 F0 22 STA BASstatus,y 2005 2C3D 88 DEY 2006 2C3E 10 F7 bpl BASstatprint 2007 2C40 BrakBasica 2008 ; Sprawdzamy istnienie QMEGa 2009 2C40 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy 2010 2C42 testQMEGloop 2011 2C42 B9 01 C0 LDA $C001,y 2012 2C45 D9 75 2C CMP QMEGstring,y 2013 2C48 D0 13 bne brakQMEGa 2014 2C4A 88 dey 2015 2C4B 10 F5 bpl testQMEGloop 2016 ; jest QMEG 2017 2C4D A9 00 LDA #0 2018 2C4F 8D 23 21 STA QMEG 2019 2C52 A0 02 LDY #$2 2020 2C54 Qstatprint 2021 2C54 B9 1D 2C LDA ONtext,y 2022 2C57 99 E8 22 STA QMEGstatus,y 2023 2C5A 88 DEY 2024 2C5B 10 F7 bpl Qstatprint 2025 2C5D brakQMEGa 2026 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi 2027 2C5D AD 00 03 LDA DDEVIC 2028 2C60 18 clc 2029 2C61 6D 01 03 ADC DUNIT 2030 2C64 38 sec 2031 2C65 E9 01 SBC #$01 2032 2C67 29 0F AND #$0F ; zapamietanie numeru urzadzenia 2033 2C69 8D 24 21 STA BootDrive 2034 2C6C 20 98 2B JSR SeTDriveNR 2035 2C6F 20 37 21 JSR EditorOpen 2036 2C72 4C 65 21 JMP mainprog 2037 2C75 QMEGstring 2038 2C75 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 2039 2C7D 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" 2040 ;.OPT List 2041 2042 2043 = 0080 MAPCOUNTER 2043 = 0082 COMPRESSEDMAPCOUNTER 2043 = 0084 MAPCOUNTERMEM 2043 = 0086 PREVFILESECTOR 2043 = 0088 MAPPOSITIONMEM 2043 = 008A SECTOROFFSET 2043 = 008C SECTORSCOUNTER 2043 org $02e0 2044 02E0-02E1> 99 26 .WO LoaderGo 2045 ; .WO START 2046 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) 2047 ; OPT h- 2048 ; org $0000 2049 ; .WO $0000 2050