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-2CE6> 4C 25 + 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 F6 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 BC ldy #blokDanychIO_GetUSSpeed 420 2174 20 E2 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 1E 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 F4 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 47 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 99 2B JSR SeTDriveNR 474 ; ----------------- 475 21D1 4C 65 21 JMP mainprog ; i odpalamy program od nowa 476 21D4 ReadMainDir 477 21D4 20 C1 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 1B 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 5F 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 47 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 31 2C STA FirstSectorsTable,X 798 2469 A5 D1 LDA CurrentFileInfoBuff+1 799 246B 9D 32 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 47 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 47 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 FE 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 AC 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 99 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 31 2C LDA FirstSectorsTable,X 915 2530 85 D4 STA $D4 916 2532 BD 32 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 48 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 44 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 45 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 0C 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 44 2A sta blokDanychIO+$A 1080 2657 AD 81 2D LDA DirMapSectorBuff+1 1081 265A 8D 45 2A sta blokDanychIO+$B 1082 265D A0 80 LDY #DirMapSectorBuff 1084 2661 20 0C 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 96 27 STA TurboRelocADDR 1175 26E7 AD E8 02 LDA MEMLO+1 1176 ; ADC CompressedMapCounter+1 1177 ; STA MEMLO+1 1178 26EA 8D 97 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 58 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO 1217 270B 20 C8 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 28 1A 33 23 2F 32 + .BYTE "H:SCORCH.XEX",155,0 1254 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba 1255 ; na koniec odpowiednie zmodyfikowanie MEMLO 1256 2758 ADDspeedProc 1257 2758 AD 22 21 LDA USmode 1258 275B F0 5F beq NoHappyLoader 1259 ; wyznaczamy offset procedury 1260 275D 38 SEC 1261 275E A9 BD LDA #HappyUSMovedProc 1265 2768 ED E8 02 SBC MEMLO+1 1266 276B 8D 1A 2C STA HappyOffset+1 1267 1268 276E A0 00 LDY #0 1269 2770 A2 09 LDX #[$A-1] ;xjsrA - the last 1270 ; relokujemy skoki pod offset z MEMLO 1271 2772 HappyRelocate 1272 2772 38 SEC 1273 2773 BD 05 2C LDA xjsrTableL,x 1274 2776 85 32 STA SecBuffer 1275 2778 BD 0F 2C LDA xjsrTableH,x 1276 277B 85 33 STA SecBuffer+1 1277 277D B1 32 LDA (SecBuffer),y 1278 277F ED 19 2C SBC HappyOffset 1279 2782 91 32 STA (SecBuffer),y 1280 2784 C8 INY 1281 2785 B1 32 LDA (SecBuffer),y 1282 2787 ED 1A 2C SBC HappyOffset+1 1283 278A 91 32 STA (SecBuffer),y 1284 278C 88 DEY 1285 278D CA DEX 1286 278E 10 E2 BPL HappyRelocate 1287 1288 2790 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] 1289 2792 label72x 1290 2792 BD BD 27 LDA HappyUSMovedProc,X 1291 = 2796 TurboRelocADDR=*+1 1292 2795 9D 00 0A STA $0A00,X 1293 2798 CA DEX 1294 2799 E0 FF CPX #$FF 1295 279B D0 F5 BNE label72x 1296 279D A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] 1297 279F A2 00 LDX #$00 1298 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. 1299 27A1 label73 1300 27A1 98 TYA 1301 27A2 18 CLC 1302 27A3 6D E7 02 ADC MEMLO 1303 27A6 8D E7 02 STA MEMLO 1304 27A9 8A TXA 1305 27AA 6D E8 02 ADC MEMLO+1 1306 27AD 8D E8 02 STA MEMLO+1 1307 27B0 AD 96 27 LDA TurboRelocADDR 1308 27B3 8D 97 07 STA loader.SioJMP+1 ; po przepisaniu 1309 27B6 AD 97 27 LDA TurboRelocADDR+1 1310 27B9 8D 98 07 STA loader.SioJMP+2 ; po przepisaniu 1311 27BC NoHappyLoader 1312 27BC 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 27BD HappyUSMovedProc ; 1321 1322 27BD AD 04 03 LDA DBUFA 1323 27C0 85 32 STA SecBuffer 1324 27C2 AD 05 03 LDA DBUFA+1 1325 27C5 85 33 STA SecBuffer+1 1326 1327 27C7 AD 08 03 LDA DBYT 1328 27CA 85 31 STA SecLenUS 1329 1330 27CC 78 SEI 1331 27CD BA TSX 1332 27CE 86 37 STX StackCopy 1333 27D0 A9 0D LDA #$0D 1334 27D2 85 34 STA CRETRYZ 1335 ;command retry on zero page 1336 27D4 CommandLoop 1337 = 27D5 HappySpeed = *+1 1338 27D4 A9 28 LDA #$28 ;here goes speed from "?" 1339 27D6 8D 04 D2 STA AUDF3 1340 27D9 A9 34 LDA #$34 1341 27DB 8D 03 D3 STA PBCTL ;ustawienie linii command 1342 27DE A2 80 LDX #$80 1343 27E0 DelayLoopCmd 1344 27E0 CA DEX 1345 27E1 D0 FD BNE DelayLoopCmd 1346 27E3 8E 06 D2 STX AUDF4 ; zero 1347 27E6 86 35 STX TransmitError 1348 ; pokey init 1349 27E8 A9 23 LDA #$23 1350 27EA 20 5E 28 xjsr1 JSR SecTransReg 1351 ; 1352 1353 27ED 18 CLC 1354 27EE AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) 1355 27F1 6D 01 03 ADC DUNIT ; dodajemy numer stacji 1356 27F4 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) 1357 27F6 85 30 STA CheckSum 1358 27F8 8D 0D D2 STA SEROUT 1359 27FB AD 02 03 LDA DCOMND 1360 27FE 20 74 28 xjsr2 JSR PutSIOByte 1361 2801 AD 0A 03 LDA DAUX1 1362 2804 20 74 28 xjsr3 JSR PutSIOByte 1363 2807 AD 0B 03 LDA DAUX2 1364 280A 20 74 28 xjsr4 JSR PutSIOByte 1365 280D A5 30 LDA CheckSum 1366 280F 20 74 28 xjsr5 JSR PutSIOByte 1367 1368 2812 waitforEndOftransmission 1369 2812 AD 0E D2 LDA IRQST 1370 2815 29 08 AND #$08 1371 2817 D0 F9 BNE waitforEndOftransmission 1372 1373 2819 A9 13 LDA #$13 1374 281B 20 5E 28 xjsr6 JSR SecTransReg 1375 1376 281E A9 3C LDA #$3c 1377 2820 8D 03 D3 STA PBCTL ;command line off 1378 ; two ACK's 1379 2823 A0 02 LDY #2 1380 2825 DoubleACK 1381 2825 20 90 28 xjsr7 JSR GetSIOByte 1382 2828 C9 44 CMP #$44 1383 282A B0 19 BCS ErrorHere 1384 282C 88 DEY 1385 282D D0 F6 BNE DoubleACK 1386 1387 ;ldy #0 1388 282F 84 30 STY CheckSum 1389 2831 ReadSectorLoop 1390 2831 20 90 28 xjsr8 JSR GetSIOByte 1391 2834 91 32 STA (SecBuffer),y 1392 2836 20 88 28 xjsr9 JSR AddCheckSum 1393 2839 C8 INY 1394 283A C4 31 CPY SecLenUS 1395 283C D0 F3 BNE ReadSectorLoop 1396 1397 283E 20 90 28 xjsrA JSR GetSIOByte 1398 2841 C5 30 CMP CheckSum 1399 2843 F0 0B BEQ EndOfTransmission 1400 ;error!!! 1401 2845 ErrorHere 1402 2845 A0 90 LDY #$90 1403 2847 84 35 STY TransmitError 1404 2849 A6 37 LDX StackCopy 1405 284B 9A TXS 1406 284C C6 34 DEC CRETRYZ 1407 284E D0 84 BNE CommandLoop 1408 1409 2850 EndOfTransmission 1410 2850 A9 00 LDA #0 1411 2852 8D 07 D2 STA AUDC4 1412 2855 A5 10 LDA IRQENS 1413 2857 8D 0E D2 STA IRQEN 1414 285A 58 CLI 1415 285B A4 35 LDY TransmitError 1416 285D 60 RTS 1417 1418 285E SecTransReg 1419 285E 8D 0F D2 STA SKCTL 1420 2861 8D 0A D2 STA SKSTRES 1421 2864 A9 38 LDA #$38 1422 2866 8D 0E D2 STA IRQEN 1423 2869 A9 28 LDA #$28 1424 286B 8D 08 D2 STA AUDCTL 1425 286E A9 A8 LDA #$A8 1426 2870 8D 07 D2 STA AUDC4 1427 2873 60 RTS 1428 1429 2874 PutSIOByte 1430 2874 AA TAX 1431 2875 waitforSerial 1432 2875 AD 0E D2 LDA IRQST 1433 2878 29 10 AND #$10 1434 287A D0 F9 BNE waitforSerial 1435 1436 287C 8D 0E D2 STA IRQEN 1437 287F A9 10 LDA #$10 1438 2881 8D 0E D2 STA IRQEN 1439 1440 2884 8A TXA 1441 2885 8D 0D D2 STA SEROUT 1442 1443 2888 AddCheckSum 1444 2888 18 CLC 1445 2889 65 30 ADC CheckSum 1446 288B 69 00 ADC #0 1447 288D 85 30 STA CheckSum 1448 288F 60 RTS 1449 1450 2890 GetSIOByte 1451 2890 A2 0A LDX #10 ;acktimeout 1452 2892 ExternalLoop 1453 2892 A9 00 LDA #0 1454 2894 85 36 STA looperka 1455 2896 InternalLoop 1456 2896 AD 0E D2 LDA IRQST 1457 2899 29 20 AND #$20 1458 289B F0 09 BEQ ACKReceive 1459 289D C6 36 DEC looperka 1460 289F D0 F5 BNE InternalLoop 1461 28A1 CA DEX 1462 28A2 D0 EE BNE ExternalLoop 1463 28A4 F0 9F BEQ ErrorHere 1464 28A6 ACKReceive 1465 ; zero we have now 1466 28A6 8D 0E D2 STA IRQST 1467 28A9 A9 20 LDA #$20 1468 28AB 8D 0E D2 STA IRQST 1469 28AE AD 0F D2 LDA SKSTAT 1470 28B1 8D 0A D2 STA SKSTRES 1471 28B4 29 20 AND #$20 1472 28B6 F0 8D BEQ ErrorHere 1473 ; 1474 28B8 AD 0D D2 LDA SERIN 1475 28BB 60 RTS 1476 28BC EndHappyUSProc 1477 1478 1479 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler 1480 28BC blokDanychIO_GetUSSpeed 1481 28BC 31 01 3F 40 .BY $31,$01,"?",$40 1482 28C0 D5 27 .WO HappySpeed 1483 28C2 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A 1484 28C8 DirMapEnd 1485 28C8 4C 94 29 JMP label75 1486 28CB label39 1487 28CB 85 DA STA $DA 1488 28CD A5 D0 LDA CurrentFileInfoBuff 1489 28CF 85 DB STA $DB 1490 28D1 A5 D1 LDA CurrentFileInfoBuff+1 1491 28D3 85 DC STA $DC 1492 28D5 20 48 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka 1493 28D8 F0 05 BEQ DiscNotChanged2 1494 28DA 68 PLA 1495 28DB 68 PLA 1496 28DC 4C D4 21 JMP ReadMainDir 1497 28DF DiscNotChanged2 1498 ; odczyt sektora mapy wskazywanego przez DirMapSec 1499 28DF A5 D2 LDA DirMapSect 1500 28E1 8D 44 2A STA blokDanychIO+10 1501 28E4 A5 D3 LDA DirMapSect+1 1502 28E6 8D 45 2A STA blokDanychIO+11 1503 28E9 0D 44 2A ORA blokDanychIO+10 1504 28EC F0 DA BEQ DirMapEnd 1505 28EE A2 2D LDX #>DirMapSectorBuff 1506 28F0 A0 80 LDY #DirMapSectorBuff ; -- 1532 291C 65 E3 ADC InMapPointer+1 ; -- 1533 291E 85 E5 STA TempZP+1 ; -- 1534 2920 B1 E4 LDA (TempZP),Y 1535 2922 8D 44 2A STA blokDanychIO+10 1536 2925 C8 INY 1537 2926 B1 E4 LDA (TempZP),Y 1538 2928 8D 45 2A STA blokDanychIO+11 1539 292B 0D 44 2A ORA blokDanychIO+10 1540 292E F0 64 BEQ label75 1541 ; i zwiekszenie wskaznika mapy o 2 1542 2930 C8 INY 1543 2931 84 E2 STY InMapPointer 1544 2933 D0 02 BNE NoIncH ; -- 1545 2935 E6 E3 INC InMapPointer+1 ; -- 1546 2937 NoIncH 1547 2937 AD E5 02 LDA MEMTOP 1548 293A 38 SEC 1549 293B E5 D0 SBC CurrentFileInfoBuff 1550 293D AD E6 02 LDA MEMTOP+1 1551 2940 E5 D1 SBC CurrentFileInfoBuff+1 1552 2942 F0 50 BEQ label75 1553 2944 A4 D0 LDY CurrentFileInfoBuff 1554 2946 A6 D1 LDX CurrentFileInfoBuff+1 1555 2948 20 0C 2A JSR ReadSector 1556 294B A5 D4 LDA $D4 1557 294D 05 D5 ORA $D5 1558 294F D0 16 BNE label79 1559 2951 A0 03 LDY #$03 1560 2953 B1 D0 LDA (CurrentFileInfoBuff),Y 1561 2955 85 D4 STA $D4 1562 2957 C8 INY 1563 2958 B1 D0 LDA (CurrentFileInfoBuff),Y 1564 295A 85 D5 STA $D5 1565 295C C8 INY 1566 295D B1 D0 LDA (CurrentFileInfoBuff),Y 1567 295F F0 06 BEQ label79 1568 2961 A9 FF LDA #$FF 1569 2963 85 D4 STA $D4 1570 2965 85 D5 STA $D5 1571 2967 label79 1572 2967 A5 D0 LDA CurrentFileInfoBuff 1573 2969 18 CLC 1574 296A 6D A2 20 ADC .adr loader.SecLen ; przed przepisaniem 1575 296D 85 D0 STA CurrentFileInfoBuff 1576 296F A5 D1 LDA CurrentFileInfoBuff+1 1577 2971 6D A3 20 ADC .adr loader.SecLen+1 ; przed przepisaniem 1578 2974 85 D1 STA CurrentFileInfoBuff+1 1579 2976 A5 D4 LDA $D4 1580 2978 38 SEC 1581 2979 ED A2 20 SBC .adr loader.SecLen ; przed przepisaniem 1582 297C 85 D4 STA $D4 1583 297E A5 D5 LDA $D5 1584 2980 ED A3 20 SBC .adr loader.SecLen+1 ; przed przepisaniem 1585 2983 85 D5 STA $D5 1586 2985 B0 80 BCS label80 1587 2987 A5 D0 LDA CurrentFileInfoBuff 1588 2989 18 CLC 1589 298A 65 D4 ADC $D4 1590 298C 85 D0 STA CurrentFileInfoBuff 1591 298E A5 D1 LDA CurrentFileInfoBuff+1 1592 2990 65 D5 ADC $D5 1593 2992 85 D1 STA CurrentFileInfoBuff+1 1594 2994 label75 1595 2994 A5 DC LDA $DC 1596 2996 C5 D1 CMP CurrentFileInfoBuff+1 1597 2998 90 0B BCC label81 1598 299A D0 17 BNE label82 1599 299C A5 DB LDA $DB 1600 299E C5 D0 CMP CurrentFileInfoBuff 1601 29A0 90 03 BCC label81 1602 29A2 D0 0F BNE label82 1603 29A4 60 RTS 1604 29A5 label81 1605 29A5 A5 DB LDA $DB 1606 29A7 18 CLC 1607 29A8 65 DA ADC $DA 1608 29AA 85 DB STA $DB 1609 29AC 90 E6 BCC label75 1610 29AE E6 DC INC $DC 1611 29B0 4C 94 29 JMP label75 1612 29B3 label82 1613 29B3 A5 DB LDA $DB 1614 29B5 38 SEC 1615 29B6 E5 DA SBC $DA 1616 29B8 85 D0 STA CurrentFileInfoBuff 1617 29BA A5 DC LDA $DC 1618 29BC E9 00 SBC #$00 1619 29BE 85 D1 STA CurrentFileInfoBuff+1 1620 29C0 60 RTS 1621 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora 1622 29C1 ReadPERCOM 1623 29C1 A9 04 LDA #$04 1624 29C3 8D 46 2A STA DiskRetryCount 1625 29C6 ReadPERCOMretry 1626 29C6 A0 EA LDY #blokDanychIO_PERCOM 1628 29CA 20 E2 2A JSR Table2DCB 1629 29CD 20 D7 2A JSR GoSIO 1630 29D0 30 08 BMI PercomError 1631 ; blok odczytany - ustawmy dlugosc 1 sektora 1632 29D2 AD 2B 2C LDA PERCOMdata+6 1633 29D5 C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 1634 29D7 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest 1635 29D9 60 RTS 1636 29DA PercomError 1637 29DA CE 46 2A DEC DiskRetryCount 1638 29DD D0 E7 BNE ReadPERCOMretry 1639 ; blok nieodczytany - dlugosc 1 sektora na $80 1640 29DF Set1Sect128 1641 29DF A9 00 LDA #$00 1642 29E1 8D 2B 2C STA PERCOMdata+6 1643 29E4 A9 80 LDA #$80 1644 29E6 8D 2C 2C STA PERCOMdata+7 1645 29E9 60 RTS 1646 29EA blokDanychIO_PERCOM 1647 29EA 31 01 4E 40 .BY $31,$01,$4E,$40 1648 29EE 25 2C .WO PERCOMdata 1649 29F0 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 29F6 ReadFirstSect 1652 29F6 A9 01 LDA #$01 1653 29F8 8D 44 2A STA blokDanychIO+10 1654 29FB A9 00 LDA #$00 1655 29FD 8D 45 2A STA blokDanychIO+11 1656 2A00 AD 2B 2C LDA PERCOMdata+6 1657 2A03 8D 43 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b 1658 2A06 AD 2C 2C LDA PERCOMdata+7 1659 2A09 4C 15 2A JMP ReadSector1 1660 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) 1661 ; reszta danych jak nizej (A nie wazne) 1662 2A0C ReadSector 1663 2A0C AD A3 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b 1664 2A0F 8D 43 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b 1665 2A12 AD A2 20 LDA .adr loader.SecLen ; przed przepisaniem 1666 2A15 ReadSector1 1667 2A15 8D 42 2A STA blokDanychIO+8 1668 2A18 8E 3F 2A STX blokDanychIO+5 1669 2A1B 8C 3E 2A STY blokDanychIO+4 1670 2A1E A9 04 LDA #$04 1671 2A20 8D 46 2A STA DiskRetryCount 1672 2A23 DiskReadRetry 1673 2A23 A0 3A LDY #blokDanychIO 1675 2A27 20 E2 2A JSR Table2DCB 1676 2A2A 20 D7 2A JSR GoSIO 1677 2A2D 30 01 BMI label85 1678 2A2F 60 RTS 1679 2A30 label85 1680 2A30 CE 46 2A DEC DiskRetryCount 1681 2A33 D0 EE BNE DiskReadRetry 1682 2A35 68 PLA 1683 2A36 68 PLA 1684 2A37 4C 93 21 JMP ErrorDisplay 1685 2A3A blokDanychIO 1686 2A3A 31 01 52 40 .BY $31,$01,$52,$40 1687 2A3E 80 2D .WO DirMapSectorBuff 1688 2A40 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 1689 2A46 DiskRetryCount 1690 2A46 00 .BY $00 1691 2A47 PrintXY 1692 2A47 68 PLA 1693 2A48 85 C8 STA $C8 1694 2A4A 68 PLA 1695 2A4B 85 C9 STA $C9 1696 2A4D A9 00 LDA #$00 1697 2A4F 85 DF STA $DF 1698 2A51 20 C9 2A JSR label87 1699 2A54 48 PHA 1700 2A55 20 C9 2A JSR label87 1701 2A58 85 DE STA $DE 1702 2A5A 0A ASL 1703 2A5B 0A ASL 1704 2A5C 18 CLC 1705 2A5D 65 DE ADC $DE 1706 2A5F 0A ASL 1707 2A60 0A ASL 1708 2A61 26 DF ROL $DF 1709 2A63 0A ASL 1710 2A64 26 DF ROL $DF 1711 2A66 18 CLC 1712 2A67 65 58 ADC SAVMSC 1713 2A69 85 DE STA $DE 1714 2A6B A5 DF LDA $DF 1715 2A6D 65 59 ADC SAVMSC+1 1716 2A6F 85 DF STA $DF 1717 2A71 68 PLA 1718 2A72 A8 TAY 1719 2A73 label92 1720 2A73 20 C9 2A JSR label87 1721 2A76 C9 00 CMP #$00 1722 2A78 F0 48 BEQ label88 1723 2A7A C9 7D CMP #$7D 1724 2A7C F0 21 BEQ label89 1725 2A7E A2 00 LDX #$00 1726 2A80 86 E0 STX $E0 1727 2A82 C9 80 CMP #$80 1728 2A84 66 E0 ROR $E0 1729 2A86 29 7F AND #$7F 1730 2A88 C9 20 CMP #$20 1731 2A8A B0 04 BCS label90 1732 2A8C 09 40 ORA #$40 1733 2A8E D0 07 BNE label91 1734 2A90 label90 1735 2A90 C9 60 CMP #$60 1736 2A92 B0 03 BCS label91 1737 2A94 38 SEC 1738 2A95 E9 20 SBC #$20 1739 2A97 label91 1740 2A97 05 E0 ORA $E0 1741 2A99 91 DE STA ($DE),Y 1742 2A9B C8 INY 1743 2A9C 4C 73 2A JMP label92 1744 2A9F label89 1745 2A9F 98 TYA 1746 2AA0 48 PHA 1747 2AA1 A5 58 LDA SAVMSC 1748 2AA3 85 E0 STA $E0 1749 2AA5 A9 03 LDA #$03 1750 2AA7 AA TAX 1751 2AA8 18 CLC 1752 2AA9 65 59 ADC SAVMSC+1 1753 2AAB 85 E1 STA $E1 1754 2AAD A0 BF LDY #$BF 1755 2AAF A9 00 LDA #$00 1756 2AB1 label93 1757 2AB1 91 E0 STA ($E0),Y 1758 2AB3 88 DEY 1759 2AB4 C0 FF CPY #$FF 1760 2AB6 D0 F9 BNE label93 1761 2AB8 C6 E1 DEC $E1 1762 2ABA CA DEX 1763 2ABB 10 F4 BPL label93 1764 2ABD 68 PLA 1765 2ABE A8 TAY 1766 2ABF 4C 73 2A JMP label92 1767 2AC2 label88 1768 2AC2 A5 C9 LDA $C9 1769 2AC4 48 PHA 1770 2AC5 A5 C8 LDA $C8 1771 2AC7 48 PHA 1772 2AC8 60 RTS 1773 2AC9 label87 1774 2AC9 E6 C8 INC $C8 1775 2ACB D0 02 BNE label94 1776 2ACD E6 C9 INC $C9 1777 2ACF label94 1778 2ACF A2 00 LDX #$00 1779 2AD1 A1 C8 LDA ($C8,X) 1780 2AD3 60 RTS 1781 2AD4 GoErrorDisp 1782 2AD4 4C 93 21 JMP ErrorDisplay 1783 ; Skok do Sio lub procedury Turbo 1784 2AD7 GoSIO 1785 2AD7 AC 22 21 LDY USmode 1786 2ADA F0 03 BEQ StandardSpeed 1787 2ADC 4C BD 27 JMP HappyUSMovedProc ; mozna skakac do tej procki 1788 2ADF StandardSpeed 1789 2ADF 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 2AE2 Table2DCB 1793 2AE2 8C EB 2A STY IOtableAddr+1 1794 2AE5 8E EC 2A STX IOtableAddr+2 1795 2AE8 A2 0B LDX #$0B 1796 2AEA IOtableAddr 1797 2AEA BD FF FF LDA $FFFF,X 1798 2AED 9D 00 03 STA DDEVIC,X 1799 2AF0 CA DEX 1800 2AF1 10 F7 BPL IOtableAddr 1801 2AF3 60 RTS 1802 2AF4 Close1 1803 2AF4 A2 10 LDX #$10 1804 2AF6 CloseX 1805 2AF6 A9 0C LDA #$0C 1806 2AF8 9D 42 03 STA ICCMD,X 1807 2AFB 4C 56 E4 JMP JCIOMAIN 1808 2AFE GetKey 1809 2AFE A2 10 LDX #$10 1810 2B00 A9 03 LDA #$03 1811 2B02 9D 42 03 STA ICCMD,X 1812 2B05 A9 04 LDA #$04 1813 2B07 9D 4A 03 STA ICAX1,X 1814 2B0A A9 00 LDA #$00 1815 2B0C 9D 4B 03 STA ICAX2,X 1816 2B0F 9D 49 03 STA ICBUFL+1,X 1817 2B12 A9 FF LDA #$FF 1818 2B14 9D 48 03 STA ICBUFL,X 1819 2B17 A9 45 LDA #Kdriver 1822 2B1E 9D 45 03 STA ICBUFA+1,X 1823 2B21 20 56 E4 JSR JCIOMAIN 1824 2B24 30 1C BMI GKeyError 1825 2B26 A2 10 LDX #$10 1826 2B28 A9 00 LDA #$00 1827 2B2A 9D 48 03 STA ICBUFL,X 1828 2B2D 9D 49 03 STA ICBUFL+1,X 1829 2B30 A9 07 LDA #$07 1830 2B32 9D 42 03 STA ICCMD,X 1831 2B35 20 56 E4 JSR JCIOMAIN 1832 2B38 30 08 BMI GKeyError 1833 2B3A 48 PHA 1834 2B3B 20 F4 2A JSR Close1 1835 2B3E 30 02 BMI GKeyError 1836 2B40 68 PLA 1837 2B41 60 RTS 1838 2B42 GKeyError 1839 2B42 4C D4 2A JMP GoErrorDisp 1840 2B45 Kdriver 1841 2B45 4B 3A 9B .BY "K:",$9B 1842 2B48 DiscChangeCheck 1843 2B48 A0 80 LDY #DirMapSectorBuff 1845 2B4C 20 F6 29 JSR ReadFirstSect 1846 2B4F A2 7F LDX #$7F 1847 2B51 label98 1848 2B51 BD 00 2D LDA FirstSectorBuff,X 1849 2B54 DD 80 2D CMP DirMapSectorBuff,X 1850 2B57 D0 05 BNE ChangedD 1851 2B59 CA DEX 1852 2B5A 10 F5 BPL label98 1853 2B5C A9 00 LDA #$00 1854 2B5E ChangedD 1855 2B5E 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 2B5F Asteriks 1860 2B5F A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) 1861 2B61 20 7D 2B JSR GetHexNumber 1862 2B64 8D C5 02 STA COLPF1S ; literki 1863 2B67 C8 INY 1864 2B68 20 7D 2B JSR GetHexNumber 1865 2B6B 8D C6 02 STA COLPF2S ; tlo 1866 2B6E C8 INY 1867 2B6F 20 7D 2B JSR GetHexNumber 1868 2B72 8D C8 02 STA COLBAKS ; ramka 1869 2B75 C8 INY 1870 2B76 20 7D 2B JSR GetHexNumber 1871 2B79 8D 26 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) 1872 2B7C 60 RTS 1873 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX 1874 ; i zamienia na bajt w A 1875 2B7D GetHexNumber 1876 2B7D 20 8D 2B JSR GetHEX4bits 1877 2B80 0A ASL 1878 2B81 0A ASL 1879 2B82 0A ASL 1880 2B83 0A ASL 1881 2B84 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. 1882 2B86 C8 INY 1883 2B87 20 8D 2B JSR GetHEX4bits 1884 2B8A 05 E4 ORA TempZP 1885 2B8C 60 RTS 1886 2B8D GetHEX4bits 1887 2B8D B1 D4 LDA ($D4),Y 1888 2B8F 38 SEC 1889 2B90 E9 30 SBC #'0' 1890 2B92 C9 0A CMP #$0A ; sprawdzmy czy cyfra 1891 2B94 90 02 BCC IsNumber 1892 2B96 E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow 1893 2B98 IsNumber 1894 2B98 60 RTS 1895 ; Ustawia numer satcji wg A 1896 2B99 SeTDriveNR 1897 2B99 C9 09 CMP #$09 1898 2B9B B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry 1899 2B9D 20 BB 2B JSR SeTblokDanychDrive 1900 2BA0 18 CLC 1901 2BA1 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 1902 2BA3 8D D5 22 STA DriveDisp1 1903 2BA6 A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu 1904 2BA8 8D D4 22 STA DriveDisp1-1 1905 2BAB 60 RTS 1906 2BAC SeTDriveLetter 1907 2BAC 20 BB 2B JSR SeTblokDanychDrive 1908 2BAF 18 CLC 1909 2BB0 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu 1910 2BB2 8D D5 22 STA DriveDisp1 1911 2BB5 A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja 1912 2BB7 8D D4 22 STA DriveDisp1-1 1913 2BBA 60 RTS 1914 2BBB SeTblokDanychDrive 1915 2BBB 8D 9B 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem 1916 2BBE 8D 3B 2A STA blokDanychIO+1 1917 2BC1 8D BD 28 STA blokDanychIO_GetUSSpeed+1 1918 2BC4 8D EB 29 STA blokDanychIO_PERCOM+1 1919 2BC7 60 RTS 1920 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku 1921 2BC8 MEMLOprint 1922 2BC8 AD E7 02 LDA MEMLO 1923 2BCB 48 PHA 1924 2BCC 4A LSR 1925 2BCD 4A LSR 1926 2BCE 4A LSR 1927 2BCF 4A LSR 1928 2BD0 20 28 21 JSR bin2AsciiHex 1929 2BD3 8D 01 2C STA MEMLOvalue+2 1930 2BD6 68 PLA 1931 2BD7 20 28 21 JSR bin2AsciiHex 1932 2BDA 8D 02 2C STA MEMLOvalue+3 1933 2BDD AD E8 02 LDA MEMLO+1 1934 2BE0 48 PHA 1935 2BE1 4A LSR 1936 2BE2 4A LSR 1937 2BE3 4A LSR 1938 2BE4 4A LSR 1939 2BE5 20 28 21 JSR bin2AsciiHex 1940 2BE8 8D FF 2B STA MEMLOvalue 1941 2BEB 68 PLA 1942 2BEC 20 28 21 JSR bin2AsciiHex 1943 2BEF 8D 00 2C STA MEMLOvalue+1 1944 2BF2 20 47 2A JSR PrintXY 1945 2BF5 1C 17 .BY 28,23 1946 2BF7 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" 1947 2BFF MEMLOvalue 1948 2BFF 30 30 30 30 .BY "0000" 1949 2C03 00 .BY $00 1950 2C04 60 RTS 1951 1952 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo 1953 1954 2C05 xjsrTableL 1955 2C05 EB FF 05 .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] 1956 2C08 0B 10 .BY <[xjsr4+1],<[xjsr5+1] 1957 2C0A 1C 26 32 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] 1958 2C0D 37 3F .BY <[xjsr9+1],<[xjsrA+1] 1959 2C0F xjsrTableH 1960 2C0F 27 27 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] 1961 2C12 28 28 .BY >[xjsr4+1],>[xjsr5+1] 1962 2C14 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] 1963 2C17 28 28 .BY >[xjsr9+1],>[xjsrA+1] 1964 ; miejsce na wyliczony offset o jaki przesuwamy procedure 1965 2C19 HappyOffset 1966 2C19 00 00 .WO $0000 1967 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) 1968 2C1B DensityCodes 1969 2C1B F3 E4 F1 .by +$80,"sdq" 1970 ;.by "SDQ" 1971 ;.by $0e,$15,$a0 1972 2C1E ONtext 1973 2C1E CF CE A0 .BY +$80,"ON " 1974 2C21 OFFtext 1975 2C21 CF C6 C6 .BY +$80,"OFF" 1976 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) 1977 2C24 PDVMASKtemp 1978 2C24 00 .BY $00 1979 ; miejsce na blok PERCOM 1980 2C25 PERCOMdata 1981 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie 1982 = 2C31 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 2C25 FirstRun 1990 ; odnotowujemy stan Shift z Bootowania 1991 2C25 AD 0F D2 LDA SKSTAT 1992 2C28 29 08 and #$08 1993 2C2A D0 03 BNE NoSHIFTboot 1994 2C2C 8D 25 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 1995 2C2F NoSHIFTboot 1996 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie 1997 2C2F AD 01 D3 LDA PORTB 1998 2C32 29 02 AND #$02 1999 2C34 D0 0B BNE BrakBasica 2000 ; jest Basic 2001 2C36 A0 02 LDY #$2 2002 2C38 BASstatprint 2003 2C38 B9 1E 2C LDA ONtext,y 2004 2C3B 99 F0 22 STA BASstatus,y 2005 2C3E 88 DEY 2006 2C3F 10 F7 bpl BASstatprint 2007 2C41 BrakBasica 2008 ; Sprawdzamy istnienie QMEGa 2009 2C41 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy 2010 2C43 testQMEGloop 2011 2C43 B9 01 C0 LDA $C001,y 2012 2C46 D9 76 2C CMP QMEGstring,y 2013 2C49 D0 13 bne brakQMEGa 2014 2C4B 88 dey 2015 2C4C 10 F5 bpl testQMEGloop 2016 ; jest QMEG 2017 2C4E A9 00 LDA #0 2018 2C50 8D 23 21 STA QMEG 2019 2C53 A0 02 LDY #$2 2020 2C55 Qstatprint 2021 2C55 B9 1E 2C LDA ONtext,y 2022 2C58 99 E8 22 STA QMEGstatus,y 2023 2C5B 88 DEY 2024 2C5C 10 F7 bpl Qstatprint 2025 2C5E brakQMEGa 2026 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi 2027 2C5E AD 00 03 LDA DDEVIC 2028 2C61 18 clc 2029 2C62 6D 01 03 ADC DUNIT 2030 2C65 38 sec 2031 2C66 E9 01 SBC #$01 2032 2C68 29 0F AND #$0F ; zapamietanie numeru urzadzenia 2033 2C6A 8D 24 21 STA BootDrive 2034 2C6D 20 99 2B JSR SeTDriveNR 2035 2C70 20 37 21 JSR EditorOpen 2036 2C73 4C 65 21 JMP mainprog 2037 2C76 QMEGstring 2038 2C76 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 2039 2C7E 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