From bbbac047831aec0a031a28038c0be433d3fb8669 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Tue, 14 May 2024 10:04:10 +0200 Subject: [PATCH] No ZP variables in loader and opty --- loaderFN.asm | 60 +- loaderFN.lab | 472 +++--- loaderFN.lst | 3908 +++++++++++++++++++++++++------------------------- loaderFN.xex | Bin 3292 -> 3316 bytes 4 files changed, 2209 insertions(+), 2231 deletions(-) diff --git a/loaderFN.asm b/loaderFN.asm index 10a3c31..be2e82c 100644 --- a/loaderFN.asm +++ b/loaderFN.asm @@ -76,16 +76,10 @@ DOSINI = $0c IRQENS = $10 -; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) +; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane - niestety teraz sa) -; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku -InBlockAddr = $64 ; word -; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) -ToBlockEnd = $66 ; word -BlockLen = $66 ; word ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH ToFileEndL = $28 -BlockATemp = $68 CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku CheckSUM = $30 @@ -193,11 +187,15 @@ START movedproc .local loader, $0700 -; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 -; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych -; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO -ToFileEndH - .WO $0000 +; adres poczatkowy pamieci do ktorej zapisujemy kolejny ladowany blok pliku +InBlockAddr + .WO 00 ; word +; dlugosc ladowanego bloku +BlockLen + .WO 00 ; word +; zmienna tymczasowa potrzebna do obliczenia dlugosci bloku +BlockATemp + .WO 00 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym JSR GoInitAddr FileNextBlock @@ -257,24 +255,11 @@ FileGetBlockStart JMP GetFile2Bytes ; pobranie dwoch bajtow GoInitAddr JMP ($02E2) -SioJMP - JSR JSIOINT - ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie - RTS -blokDanychIO_Loader - .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 -; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) -SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 -SectorNumber - .WO $0000 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu PHA LDA #<(JRESETWM-1) PHA -;WaitLine0 -; LDA VCOUNT -; bne WaitLine0 JMP ($02E0) Jrts RTS @@ -294,10 +279,6 @@ GetFileBytes STA ICBUFL+1,x JMP CIO -; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X -; potrzebny do obslugi sektorow wiekszych od 256b -InSectorCountH - .BY $00 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz ; w tym miejscu potem bedzie bufor @@ -306,6 +287,21 @@ InSectorCountH zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie FirstMapSectorNr .WO $0000 +blokDanychIO_Loader + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 +SectorNumber + .WO $0000 +; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 +; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych +; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO +ToFileEndH + .WO $0000 ; do usuniecia +SioJMP + JSR JSIOINT + ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS LoadStart ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP LDY MEMLO @@ -331,15 +327,9 @@ LastMemPageClear CPY #$FF BNE LastMemPageClear ; wyczyszczona, wiec .... - LDA tempToFileEndL - STA ToFileEndL LDA #$FF STA KBCODES INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) - LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora - LDA Seclen+1 ; -- - STA InSectorCountH ; -- obsluga sektorow ponad 256b - ;jmp * JMP FileNextBlock ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera diff --git a/loaderFN.lab b/loaderFN.lab index c53bcbe..f99fcb9 100644 --- a/loaderFN.lab +++ b/loaderFN.lab @@ -1,4 +1,4 @@ -mads 2.1.7 build 3 (13 Sep 23) +mads 2.1.6 build 65 (4 Jun 23) Label table: 00 0247 PDVMASK 00 0340 IOCB @@ -70,11 +70,7 @@ Label table: 00 000A DOSVEC 00 000C DOSINI 00 0010 IRQENS -00 0064 INBLOCKADDR -00 0066 TOBLOCKEND -00 0066 BLOCKLEN 00 0028 TOFILEENDL -00 0068 BLOCKATEMP 00 003D COMPRESSEDMAPPOS 00 0030 CHECKSUM 00 0031 SECLENUS @@ -130,246 +126,248 @@ Label table: 00 E471 JTESTROM 00 E474 JRESETWM 00 E477 JRESETCD -00 07BE FILESECBUFF -00 07BE TEMPMEMLO +00 07D2 FILESECBUFF +00 07D2 TEMPMEMLO 00 1FFD START 00 2000 MOVEDPROC 00 0700 LOADER -00 0700 LOADER.TOFILEENDH -00 0702 LOADER.FILEINIT -00 0705 LOADER.FILENEXTBLOCK -00 071A LOADER.FILENOFFFFHEAD -00 074D LOADER.WHATISIT -00 075C LOADER.FILENOFIRSTBLOCK -00 0766 LOADER.BLOCKREADLOOP -00 076F LOADER.FILEGETBLOCKSTART -00 077A LOADER.GOINITADDR -00 077D LOADER.SIOJMP -00 0781 LOADER.BLOKDANYCHIO_LOADER -00 0789 LOADER.SECLEN -00 078B LOADER.SECTORNUMBER -00 078D LOADER.ENDOFFILE -00 0796 LOADER.JRTS -00 0797 LOADER.GETFILE2BYTES -00 079F LOADER.GETFILEBYTES -00 07BD LOADER.INSECTORCOUNTH -00 07BE LOADER.ZZZZZZ -00 07BE LOADER.FIRSTMAPSECTORNR -00 07C0 LOADER.LOADSTART -00 07C9 LOADER.OUTMEMCLEARLOOP -00 07CB LOADER.INMEMCLEARLOOP -00 07E7 LOADER.LASTMEMPAGECLEAR -00 0808 LOADER.TEMPTOFILEENDL -00 2109 JAKIETURBO -00 2109 USMODE -00 210A QMEG -00 210B BOOTDRIVE -00 210C BOOTSHIFT -00 210D FOLDERTURBO -00 210E NEWCOLORS -00 210F BIN2ASCIIHEX -00 211A LABELKA -00 211B EDRIVER -00 211E EDITOROPEN -00 214C MAINPROG -00 216A USSPEED -00 216C USSTATPRINT -00 2175 NOUSSPEED -00 2178 ERROR148 -00 217A ERRORDISPLAY -00 21A1 ERRORNUMHEX -00 21A9 WAITKLOOP -00 21BB READMAINDIR -00 21D4 SPARTADISK -00 21DF SEKTOR128B -00 21F1 READDIR -00 222A LABEL46 -00 2238 LABEL40 -00 2246 LABEL43 -00 2253 PROGNAME -00 225E LABEL42 -00 2269 LABEL45 -00 226C DATFILEFOUND -00 228C LABEL47 -00 22A3 TOSTARTOFDIR -00 22B4 STATUSBARPRINT -00 22BA DENSITYDISPLAY -00 22BC DRIVEDISP1 -00 22CF QMEGSTATUS -00 22D7 BASSTATUS -00 22DE USSTATUS -00 235A LABEL68 -00 2368 NOLASTFILEINDIR -00 2372 LABEL50 -00 237C LABEL51 -00 23A3 LABEL53 -00 23AB LABEL56 -00 23B4 LABEL55 -00 23B7 LASTFILESPAGEJUMP -00 23BA LABEL54 -00 23BD LABEL52 -00 23CF LABEL65 -00 23DD LABEL60 -00 23EB COMPARENAMES -00 23ED CHECKING62 -00 23F9 REPLACINGNAME -00 2405 CHECKNEXTNAME -00 2410 LABEL64 -00 2413 GAMENAMEPRINT -00 241F YPOSGAMENAME -00 2420 GAMEKEYSYMBOL -00 2423 GAMENAME -00 2460 LABEL66 -00 246B LABEL59 -00 2476 LABEL69 -00 2479 MAINDIRKEY -00 247C UPDIRKEY -00 248C ESCKEY -00 2499 NOSHIFTESC -00 24A0 TOSTARTOFDIRJUMP -00 24A3 SPACEKEY -00 24AA CONTARROWSPRINT -00 24BB LASTFILESPAGE -00 24BD KEYBOARDPROC -00 24CF COLORSALREADYSET -00 24F4 NOCTRLLETTER -00 2505 NONUMBER -00 250B BIGLETTERS -00 2532 SUBDIRTEXT -00 253B GOTOLOADER -00 2543 DISKNOTCHANGED1 -00 254F SETTURBOOFF -00 2552 NOSHIFT +00 0700 LOADER.INBLOCKADDR +00 0702 LOADER.BLOCKLEN +00 0704 LOADER.BLOCKATEMP +00 0706 LOADER.FILEINIT +00 0709 LOADER.FILENEXTBLOCK +00 0720 LOADER.FILENOFFFFHEAD +00 0765 LOADER.WHATISIT +00 0776 LOADER.FILENOFIRSTBLOCK +00 0780 LOADER.BLOCKREADLOOP +00 078C LOADER.FILEGETBLOCKSTART +00 0799 LOADER.GOINITADDR +00 079C LOADER.ENDOFFILE +00 07A5 LOADER.JRTS +00 07A6 LOADER.GETFILE2BYTES +00 07B0 LOADER.GETFILEBYTES +00 07D2 LOADER.ZZZZZZ +00 07D2 LOADER.FIRSTMAPSECTORNR +00 07D4 LOADER.BLOKDANYCHIO_LOADER +00 07DC LOADER.SECLEN +00 07DE LOADER.SECTORNUMBER +00 07E0 LOADER.TOFILEENDH +00 07E2 LOADER.SIOJMP +00 07E6 LOADER.LOADSTART +00 07EF LOADER.OUTMEMCLEARLOOP +00 07F1 LOADER.INMEMCLEARLOOP +00 080D LOADER.LASTMEMPAGECLEAR +00 0820 LOADER.TEMPTOFILEENDL +00 2121 JAKIETURBO +00 2121 USMODE +00 2122 QMEG +00 2123 BOOTDRIVE +00 2124 BOOTSHIFT +00 2125 FOLDERTURBO +00 2126 NEWCOLORS +00 2127 BIN2ASCIIHEX +00 2132 LABELKA +00 2133 EDRIVER +00 2136 EDITOROPEN +00 2164 MAINPROG +00 2182 USSPEED +00 2184 USSTATPRINT +00 218D NOUSSPEED +00 2190 ERROR148 +00 2192 ERRORDISPLAY +00 21B9 ERRORNUMHEX +00 21C1 WAITKLOOP +00 21D3 READMAINDIR +00 21EC SPARTADISK +00 21F7 SEKTOR128B +00 2209 READDIR +00 2242 LABEL46 +00 2250 LABEL40 +00 225E LABEL43 +00 226B PROGNAME +00 2276 LABEL42 +00 2281 LABEL45 +00 2284 DATFILEFOUND +00 22A4 LABEL47 +00 22BB TOSTARTOFDIR +00 22CC STATUSBARPRINT +00 22D2 DENSITYDISPLAY +00 22D4 DRIVEDISP1 +00 22E7 QMEGSTATUS +00 22EF BASSTATUS +00 22F6 USSTATUS +00 2372 LABEL68 +00 2380 NOLASTFILEINDIR +00 238A LABEL50 +00 2394 LABEL51 +00 23BB LABEL53 +00 23C3 LABEL56 +00 23CC LABEL55 +00 23CF LASTFILESPAGEJUMP +00 23D2 LABEL54 +00 23D5 LABEL52 +00 23E7 LABEL65 +00 23F5 LABEL60 +00 2403 COMPARENAMES +00 2405 CHECKING62 +00 2411 REPLACINGNAME +00 241D CHECKNEXTNAME +00 2428 LABEL64 +00 242B GAMENAMEPRINT +00 2437 YPOSGAMENAME +00 2438 GAMEKEYSYMBOL +00 243B GAMENAME +00 2478 LABEL66 +00 2483 LABEL59 +00 248E LABEL69 +00 2491 MAINDIRKEY +00 2494 UPDIRKEY +00 24A4 ESCKEY +00 24B1 NOSHIFTESC +00 24B8 TOSTARTOFDIRJUMP +00 24BB SPACEKEY +00 24C2 CONTARROWSPRINT +00 24D3 LASTFILESPAGE +00 24D5 KEYBOARDPROC +00 24E7 COLORSALREADYSET +00 250C NOCTRLLETTER +00 251D NONUMBER +00 2523 BIGLETTERS +00 254A SUBDIRTEXT +00 2553 GOTOLOADER +00 255B DISKNOTCHANGED1 +00 2567 SETTURBOOFF +00 256A NOSHIFT 00 2F80 COMPRESSEDMAP -00 25A7 GENERATECOMPRESSEDMAP -00 25E6 JUMPFORWARD -00 25F3 OFFSETTOBIG -00 2609 GETNEXTMAPWORD -00 2614 SECTOR00 -00 261F OPS01 -00 262B NOTEQAL01 -00 2656 ADDTOCOMPRESSEDMAP -00 2668 XXXXBLA -00 2670 NOINC013 -00 2671 FLUSHBUFFER -00 267C NOFLUSH -00 267D ENDMAKINGMAP -00 2680 LOADERGO -00 2693 NORUNFROMDOS -00 26A4 AFTERWORMSTART -00 26E0 MOVELOOP1 -00 26F8 CLEARLOOP1 -00 270A NOZPAGE -00 2731 FILETOOPEN -00 273E ADDSPEEDPROC -00 2758 HAPPYRELOCATE -00 2778 LABEL72X -00 277C TURBORELOCADDR -00 2787 LABEL73 -00 27A2 NOHAPPYLOADER -00 27A3 HAPPYUSMOVEDPROC -00 27BA COMMANDLOOP -00 27BB HAPPYSPEED -00 27C6 DELAYLOOPCMD -00 27D0 XJSR1 -00 27E4 XJSR2 -00 27EA XJSR3 -00 27F0 XJSR4 -00 27F5 XJSR5 -00 27F8 WAITFORENDOFTRANSMISSION -00 2801 XJSR6 -00 280B DOUBLEACK -00 280B XJSR7 -00 2817 READSECTORLOOP -00 2817 XJSR8 -00 281C XJSR9 -00 2824 XJSRA -00 282B ERRORHERE -00 2836 ENDOFTRANSMISSION -00 2844 SECTRANSREG -00 285A PUTSIOBYTE -00 285B WAITFORSERIAL -00 286E ADDCHECKSUM -00 2876 GETSIOBYTE -00 2878 EXTERNALLOOP -00 287C INTERNALLOOP -00 288C ACKRECEIVE -00 28A2 ENDHAPPYUSPROC -00 28A2 BLOKDANYCHIO_GETUSSPEED -00 28AE DIRMAPEND -00 28B1 LABEL39 -00 28C5 DISCNOTCHANGED2 -00 28ED LABEL80 -00 28FB NONEXTMAPSECTOR -00 291D NOINCH -00 294D LABEL79 -00 297A LABEL75 -00 298B LABEL81 -00 2999 LABEL82 -00 29A7 READPERCOM -00 29AC READPERCOMRETRY -00 29C0 PERCOMERROR -00 29C5 SET1SECT128 -00 29D0 BLOKDANYCHIO_PERCOM -00 29DC READFIRSTSECT -00 29F2 READSECTOR -00 29FB READSECTOR1 -00 2A09 DISKREADRETRY -00 2A16 LABEL85 -00 2A20 BLOKDANYCHIO -00 2A2C DISKRETRYCOUNT -00 2A2D PRINTXY -00 2A59 LABEL92 -00 2A76 LABEL90 -00 2A7D LABEL91 -00 2A85 LABEL89 -00 2A97 LABEL93 -00 2AA8 LABEL88 -00 2AAF LABEL87 -00 2AB5 LABEL94 -00 2ABA GOERRORDISP -00 2ABD GOSIO -00 2AC5 STANDARDSPEED -00 2AC8 TABLE2DCB -00 2AD0 IOTABLEADDR -00 2ADA CLOSE1 -00 2ADC CLOSEX -00 2AE4 GETKEY -00 2B28 GKEYERROR -00 2B2B KDRIVER -00 2B2E DISCCHANGECHECK -00 2B37 LABEL98 -00 2B44 CHANGEDD -00 2B45 ASTERIKS -00 2B63 GETHEXNUMBER -00 2B73 GETHEX4BITS -00 2B7E ISNUMBER -00 2B7F SETDRIVENR -00 2B92 SETDRIVELETTER -00 2BA1 SETBLOKDANYCHDRIVE -00 2BAE MEMLOPRINT -00 2BE5 MEMLOVALUE -00 2BEB XJSRTABLEL -00 2BF5 XJSRTABLEH -00 2BFF HAPPYOFFSET -00 2C01 DENSITYCODES -00 2C04 ONTEXT -00 2C07 OFFTEXT -00 2C0A PDVMASKTEMP -00 2C0B PERCOMDATA -00 2C17 FIRSTSECTORSTABLE +00 25BF GENERATECOMPRESSEDMAP +00 25FE JUMPFORWARD +00 260B OFFSETTOBIG +00 2621 GETNEXTMAPWORD +00 262C SECTOR00 +00 2637 OPS01 +00 2643 NOTEQAL01 +00 266E ADDTOCOMPRESSEDMAP +00 2680 XXXXBLA +00 2688 NOINC013 +00 2689 FLUSHBUFFER +00 2694 NOFLUSH +00 2695 ENDMAKINGMAP +00 2698 LOADERGO +00 26AB NORUNFROMDOS +00 26BC AFTERWORMSTART +00 26F8 MOVELOOP1 +00 2710 CLEARLOOP1 +00 2722 NOZPAGE +00 2749 FILETOOPEN +00 2756 ADDSPEEDPROC +00 2770 HAPPYRELOCATE +00 2790 LABEL72X +00 2794 TURBORELOCADDR +00 279F LABEL73 +00 27BA NOHAPPYLOADER +00 27BB HAPPYUSMOVEDPROC +00 27D2 COMMANDLOOP +00 27D3 HAPPYSPEED +00 27DE DELAYLOOPCMD +00 27E8 XJSR1 +00 27FC XJSR2 +00 2802 XJSR3 +00 2808 XJSR4 +00 280D XJSR5 +00 2810 WAITFORENDOFTRANSMISSION +00 2819 XJSR6 +00 2823 DOUBLEACK +00 2823 XJSR7 +00 282F READSECTORLOOP +00 282F XJSR8 +00 2834 XJSR9 +00 283C XJSRA +00 2843 ERRORHERE +00 284E ENDOFTRANSMISSION +00 285C SECTRANSREG +00 2872 PUTSIOBYTE +00 2873 WAITFORSERIAL +00 2886 ADDCHECKSUM +00 288E GETSIOBYTE +00 2890 EXTERNALLOOP +00 2894 INTERNALLOOP +00 28A4 ACKRECEIVE +00 28BA ENDHAPPYUSPROC +00 28BA BLOKDANYCHIO_GETUSSPEED +00 28C6 DIRMAPEND +00 28C9 LABEL39 +00 28DD DISCNOTCHANGED2 +00 2905 LABEL80 +00 2913 NONEXTMAPSECTOR +00 2935 NOINCH +00 2965 LABEL79 +00 2992 LABEL75 +00 29A3 LABEL81 +00 29B1 LABEL82 +00 29BF READPERCOM +00 29C4 READPERCOMRETRY +00 29D8 PERCOMERROR +00 29DD SET1SECT128 +00 29E8 BLOKDANYCHIO_PERCOM +00 29F4 READFIRSTSECT +00 2A0A READSECTOR +00 2A13 READSECTOR1 +00 2A21 DISKREADRETRY +00 2A2E LABEL85 +00 2A38 BLOKDANYCHIO +00 2A44 DISKRETRYCOUNT +00 2A45 PRINTXY +00 2A71 LABEL92 +00 2A8E LABEL90 +00 2A95 LABEL91 +00 2A9D LABEL89 +00 2AAF LABEL93 +00 2AC0 LABEL88 +00 2AC7 LABEL87 +00 2ACD LABEL94 +00 2AD2 GOERRORDISP +00 2AD5 GOSIO +00 2ADD STANDARDSPEED +00 2AE0 TABLE2DCB +00 2AE8 IOTABLEADDR +00 2AF2 CLOSE1 +00 2AF4 CLOSEX +00 2AFC GETKEY +00 2B40 GKEYERROR +00 2B43 KDRIVER +00 2B46 DISCCHANGECHECK +00 2B4F LABEL98 +00 2B5C CHANGEDD +00 2B5D ASTERIKS +00 2B7B GETHEXNUMBER +00 2B8B GETHEX4BITS +00 2B96 ISNUMBER +00 2B97 SETDRIVENR +00 2BAA SETDRIVELETTER +00 2BB9 SETBLOKDANYCHDRIVE +00 2BC6 MEMLOPRINT +00 2BFD MEMLOVALUE +00 2C03 XJSRTABLEL +00 2C0D XJSRTABLEH +00 2C17 HAPPYOFFSET +00 2C19 DENSITYCODES +00 2C1C ONTEXT +00 2C1F OFFTEXT +00 2C22 PDVMASKTEMP +00 2C23 PERCOMDATA +00 2C2F FIRSTSECTORSTABLE 00 2D00 FIRSTSECTORBUFF 00 2D00 PROGRAMEND 00 2D80 DIRMAPSECTORBUFF 00 2F80 DIRSECTORBUFF -00 2C0B FIRSTRUN -00 2C15 NOSHIFTBOOT -00 2C1E BASSTATPRINT -00 2C27 BRAKBASICA -00 2C29 TESTQMEGLOOP -00 2C3B QSTATPRINT -00 2C44 BRAKQMEGA -00 2C5C QMEGSTRING +00 2C23 FIRSTRUN +00 2C2D NOSHIFTBOOT +00 2C36 BASSTATPRINT +00 2C3F BRAKBASICA +00 2C41 TESTQMEGLOOP +00 2C53 QSTATPRINT +00 2C5C BRAKQMEGA +00 2C74 QMEGSTRING 00 0080 MAPCOUNTER 00 0082 COMPRESSEDMAPCOUNTER 00 0084 MAPCOUNTERMEM diff --git a/loaderFN.lst b/loaderFN.lst index b28ffdd..39eebfb 100644 --- a/loaderFN.lst +++ b/loaderFN.lst @@ -1,4 +1,4 @@ -mads 2.1.7 build 3 (13 Sep 23) +mads 2.1.6 build 65 (4 Jun 23) Source: loaderFN.asm 1 ;MICRO SPARTA DOS 4.7 2 @@ -173,1967 +173,1957 @@ Source: SYSEQU.ASM 76 = 0010 IRQENS = $10 77 78 - 79 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) + 79 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane - niestety teraz sa) 80 - 81 ; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku - 82 = 0064 InBlockAddr = $64 ; word - 83 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) - 84 = 0066 ToBlockEnd = $66 ; word - 85 = 0066 BlockLen = $66 ; word - 86 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH - 87 = 0028 ToFileEndL = $28 - 88 = 0068 BlockATemp = $68 - 89 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku - 90 - 91 = 0030 CheckSUM = $30 - 92 = 0031 SecLenUS = $31 - 93 = 0032 SecBuffer = $32 - 94 = 0034 CRETRYZ = $34 - 95 = 0035 TransmitError =$35 - 96 = 0036 Looperka = $36 - 97 = 0037 StackCopy = $37 - 98 - 99 - 100 = 0058 SAVMSC = $58 - 101 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego - 102 ; katalog - 103 = 00CA CurrentDirBuf = $CA - 104 ; adres konca tego bufora (2 bajty) - 105 = 00CC CurrentDirBufEnd = $CC - 106 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji - 107 ; o obrabianym pliku (skok co $17) - 108 = 00D0 CurrentFileInfoBuff = $D0 - 109 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) - 110 = 00D2 DirMapSect = $D2 - 111 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu - 112 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji - 113 ; ma byc wyswietlany katalog od poczatku - 114 = 00D6 LastFilesPageFlag = $D6 - 115 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony - 116 ; zawiera liczbe widocznych na ekranie plikow (1 bajt) - 117 = 00D9 NamesOnScreen = $D9 - 118 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna - 119 ; wczesniej byl 1 bajt w $D6 - 120 = 00E2 InMapPointer = $E2 - 121 ; zmienna tymczasowa na ZP (2 bajty) - 122 = 00E4 TempZP = $E4 - 123 - 124 = 020A VSERIN = $020a - 125 = 02C5 COLPF1S = $02c5 - 126 = 02C6 COLPF2S = $02c6 - 127 = 02C8 COLBAKS = $02c8 + 81 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH + 82 = 0028 ToFileEndL = $28 + 83 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku + 84 + 85 = 0030 CheckSUM = $30 + 86 = 0031 SecLenUS = $31 + 87 = 0032 SecBuffer = $32 + 88 = 0034 CRETRYZ = $34 + 89 = 0035 TransmitError =$35 + 90 = 0036 Looperka = $36 + 91 = 0037 StackCopy = $37 + 92 + 93 + 94 = 0058 SAVMSC = $58 + 95 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego + 96 ; katalog + 97 = 00CA CurrentDirBuf = $CA + 98 ; adres konca tego bufora (2 bajty) + 99 = 00CC CurrentDirBufEnd = $CC + 100 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji + 101 ; o obrabianym pliku (skok co $17) + 102 = 00D0 CurrentFileInfoBuff = $D0 + 103 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) + 104 = 00D2 DirMapSect = $D2 + 105 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu + 106 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji + 107 ; ma byc wyswietlany katalog od poczatku + 108 = 00D6 LastFilesPageFlag = $D6 + 109 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony + 110 ; zawiera liczbe widocznych na ekranie plikow (1 bajt) + 111 = 00D9 NamesOnScreen = $D9 + 112 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna + 113 ; wczesniej byl 1 bajt w $D6 + 114 = 00E2 InMapPointer = $E2 + 115 ; zmienna tymczasowa na ZP (2 bajty) + 116 = 00E4 TempZP = $E4 + 117 + 118 = 020A VSERIN = $020a + 119 = 02C5 COLPF1S = $02c5 + 120 = 02C6 COLPF2S = $02c6 + 121 = 02C8 COLBAKS = $02c8 + 122 + 123 = 0244 COLDST = $0244 + 124 ;MEMTOP = $02e5 + 125 ;MEMLO = $02e7 + 126 + 127 = 02FC KBCODES = $02fc 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 + 129 = 0300 DDEVIC = $0300 + 130 = 0301 DUNIT = $0301 + 131 = 0302 DCOMND = $0302 + 132 = 0304 DBUFA = $0304 + 133 = 0308 DBYT = $0308 + 134 = 030A DAUX1 = $030a + 135 = 030B DAUX2 = $030b + 136 + 137 = 0342 ICCMD = $0342 + 138 = 0344 ICBUFA = $0344 + 139 ;ICBUFA+1 = $0345 + 140 = 0348 ICBUFL = $0348 + 141 ;ICBUFL+1 = $0349 + 142 = 034A ICAX1 = $034a + 143 = 034B ICAX2 = $034b + 144 + 145 = 03FA GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta + 146 + 147 = D204 AUDF3 = $d204 + 148 = D206 AUDF4 = $d206 + 149 = D207 AUDC4 = $d207 + 150 = D208 AUDCTL = $d208 + 151 = D20A SKSTRES = $d20a + 152 = D20D SEROUT = $D20d + 153 = D20D SERIN = $D20d + 154 = D20E IRQEN = $D20e + 155 = D20E IRQST = $D20e + 156 + 157 + 158 = D20F SKSTAT = $d20f + 159 = D20F SKCTL = $d20f + 160 + 161 + 162 = D303 PBCTL = $d303 + 163 = D301 PORTB = $d301 + 164 + 165 = D40B VCOUNT = $D40B 166 - 167 - 168 = D303 PBCTL = $d303 - 169 = D301 PORTB = $d301 - 170 - 171 = D40B VCOUNT = $D40B + 167 = E456 JCIOMAIN = $e456 + 168 = E459 JSIOINT = $e459 + 169 = E471 JTESTROM = $e471 + 170 = E474 JRESETWM = $e474 + 171 = E477 JRESETCD = $e477 172 - 173 = E456 JCIOMAIN = $e456 - 174 = E459 JSIOINT = $e459 - 175 = E471 JTESTROM = $e471 - 176 = E474 JRESETWM = $e474 - 177 = E477 JRESETCD = $e477 - 178 - 179 org $1FFD - 180 - 181 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura - 182 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! - 183 = 07BE FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu - 184 = 07BE TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) - 185 - 186 START - 187 FFFF> 1FFD-2CCC> 4C 0B + JMP FirstRun ;1FFD 4C 70 21 - 188 - 189 - 190 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu - 191 ; do wczytania !!!!!! - 192 - 193 2000 movedproc - 194 0700 .local loader, $0700 - 195 - 196 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 - 197 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych - 198 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO - 199 0700 ToFileEndH - 200 0700 00 00 .WO $0000 - 201 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym - 202 0702 20 7A 07 JSR GoInitAddr - 203 0705 FileNextBlock - 204 ; wczytanie kolejnego bloku binarnego - 205 0705 20 6F 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) - 206 0708 C0 88 CPY #$88 ; czy EOF - 207 070A D0 03 4C 8D 07 jeq EndOfFile - 208 070F A5 64 LDA InBlockAddr - 209 0711 25 65 AND InBlockAddr+1 - 210 0713 C9 FF CMP #$FF ; jesli oba sa $FF to..... - 211 0715 D0 03 BNE FileNoFFFFHead - 212 0717 20 6F 07 JSR FileGetBlockStart ; pobranie jeszcze raz - 213 071A FileNoFFFFHead - 214 071A A5 64 85 68 A5 65 + mwa InBlockAddr BlockATemp ; zapamietanie adresu poczatkowego bloku (na chwile) - 215 0722 A9 66 LDA #BlockLen - 218 0728 85 65 sta InBlockAddr+1 - 219 072A 20 97 07 JSR GetFile2Bytes ; pobranie dwoch bajtow - ; Pobranie adresu konca ladowanego bloku - 220 072D C0 88 CPY #$88 ; czy EOF - 221 072F F0 5C beq EndOfFile - 222 ; wyliczenie długości bloku programu binarnego - 223 0731 38 sec - 224 0732 A5 66 lda BlockLen - 225 0734 E5 68 sbc BlockATemp - 226 0736 85 66 sta BlockLen - 227 0738 A5 67 lda BlockLen+1 - 228 073A E5 69 sbc BlockATemp+1 - 229 073C 85 67 sta BlockLen+1 - 230 073E E6 66 D0 02 E6 67 inw BlockLen - 231 0744 A5 68 85 64 A5 69 + mwa BlockATemp InBlockAddr ; odtworzenie adresu poczatkowego bloku - 232 074C 38 SEC - 233 074D WhatIsIt - 234 074D B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y - 235 ; ktory tylko wylacza skok !!! - 236 074F CE 4D 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! - 237 0752 A5 64 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ - 238 0754 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu - 239 0757 A5 65 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem - 240 0759 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). - 241 075C FileNoFirstBlock - 242 075C A9 96 LDA #Jrts ; jesli nie jest to blok z adresem inicjacji - 245 0763 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie - 246 - 247 0766 BlockReadLoop ;; petla odczytujaca z pliku blok binarny - 248 0766 20 9F 07 JSR GetFileBytes - 249 0769 C0 88 CPY #$88 ; czy EOF - 250 076B F0 20 beq EndOfFile - 251 076D D0 93 jne FileInit ; koniec bloku - skok pod adres inicjalizacji - 252 076F FileGetBlockStart - 253 076F A9 64 LDA #InBlockAddr - 256 0775 85 65 sta InBlockAddr+1 - 257 0777 4C 97 07 JMP GetFile2Bytes ; pobranie dwoch bajtow - 258 077A GoInitAddr - 259 077A 6C E2 02 JMP ($02E2) - 260 077D SioJMP - 261 077D 20 59 E4 JSR JSIOINT - 262 ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie - 263 0780 60 RTS - 264 0781 blokDanychIO_Loader - 265 0781 31 01 52 40 BE 07 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 - 266 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) - 267 = 0789 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 - 268 078B SectorNumber - 269 078B 00 00 .WO $0000 - 270 078D EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku - 271 078D A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu - 272 078F 48 PHA - 273 0790 A9 73 LDA #<(JRESETWM-1) - 274 0792 48 PHA - 275 ;WaitLine0 - 276 ; LDA VCOUNT - 277 ; bne WaitLine0 - 278 0793 6C E0 02 JMP ($02E0) - 279 0796 Jrts - 280 0796 60 RTS - 281 0797 GetFile2Bytes - 282 0797 A9 02 85 66 A9 00 + mwa #2 BlockLen - 283 079F GetFileBytes - 284 079F A2 10 LDX #16 ; kanal 1 - 285 07A1 A9 07 LDA #CGBINR ; rozkaz BGET - 286 07A3 9D 42 03 STA ICCOM,X ; COMMAND - 287 07A6 A5 64 LDA InBlockAddr - 288 07A8 9D 44 03 STA ICBUFA,x - 289 07AB A5 65 LDA InBlockAddr+1 - 290 07AD 9D 45 03 STA ICBUFA+1,x - 291 07B0 A5 66 LDA BlockLen - 292 07B2 9D 48 03 STA ICBUFL,x - 293 07B5 A5 67 LDA BlockLen+1 - 294 07B7 9D 49 03 STA ICBUFL+1,x - 295 07BA 4C 56 E4 JMP CIO - 296 - 297 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X - 298 ; potrzebny do obslugi sektorow wiekszych od 256b - 299 07BD InSectorCountH - 300 07BD 00 .BY $00 - 301 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 - 302 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz - 303 ; w tym miejscu potem bedzie bufor - 304 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora - 305 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania - 306 07BE zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie - 307 07BE FirstMapSectorNr - 308 07BE 00 00 .WO $0000 - 309 07C0 LoadStart - 310 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP - 311 07C0 AC E7 02 LDY MEMLO - 312 07C3 AD E8 02 LDA MEMLO+1 - 313 07C6 8D CD 07 STA InMemClearLoop+2 - 314 07C9 OutMemClearLoop - 315 07C9 A9 00 LDA #$00 - 316 07CB InMemClearLoop - 317 07CB 99 00 09 STA $0900,Y - 318 07CE C8 INY - 319 07CF D0 FA BNE InMemClearLoop - 320 07D1 EE CD 07 INC InMemClearLoop+2 - 321 07D4 AD CD 07 LDA InMemClearLoop+2 - 322 07D7 CD E6 02 CMP MEMTOP+1 - 323 07DA 90 ED BCC OutMemClearLoop - 324 07DC AD E6 02 LDA MEMTOP+1 - 325 07DF 8D E9 07 STA LastMemPageClear+2 - 326 07E2 AC E5 02 LDY MEMTOP - 327 07E5 A9 00 LDA #$00 - 328 07E7 LastMemPageClear - 329 07E7 99 00 80 STA $8000,Y - 330 07EA 88 DEY - 331 07EB C0 FF CPY #$FF - 332 07ED D0 F8 BNE LastMemPageClear - 333 ; wyczyszczona, wiec .... - 334 07EF AD 08 08 LDA tempToFileEndL - 335 07F2 85 28 STA ToFileEndL - 336 07F4 A9 FF LDA #$FF - 337 07F6 8D FC 02 STA KBCODES - 338 07F9 EE 4D 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) - 339 07FC AE 89 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora - 340 07FF AD 8A 07 LDA Seclen+1 ; -- - 341 0802 8D BD 07 STA InSectorCountH ; -- obsluga sektorow ponad 256b - 342 ;jmp * - 343 0805 4C 05 07 JMP FileNextBlock - 344 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku - 345 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera - 346 0808 tempToFileEndL - 347 0808 00 .BY $00 - 348 .endl - 349 2109 JAkieTurbo - 350 2109 USmode - 351 2109 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed - 352 210A QMEG - 353 210A 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG - 354 210B BootDrive - 355 210B 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi - 356 210C BootShift - 357 210C 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety - 358 210D FolderTurbo - 359 210D 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT - 360 210E NewColors - 361 210E 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano - 362 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) - 363 210F bin2AsciiHex - 364 210F 29 0F AND #$0F - 365 2111 09 30 ORA #$30 - 366 2113 C9 3A CMP #$3A - 367 2115 90 03 BCC labelka - 368 2117 18 CLC - 369 2118 69 07 ADC #$07 - 370 211A labelka - 371 211A 60 RTS - 372 211B Edriver - 373 211B 45 3A 9B .BY "E:",$9b - 374 211E EditorOpen - 375 ; otwarcie ekranu !!! - 376 211E A2 00 LDX #$00 ; kanal nr 0 - 377 2120 20 DC 2A JSR CloseX ; najpierw Zamkniecie Ekranu - 378 2123 30 55 BMI ErrorDisplay - 379 2125 A2 00 LDX #$00 ; kanal nr 0 - 380 2127 A9 03 LDA #$03 - 381 2129 9D 42 03 STA ICCMD,X - 382 212C A9 0C LDA #$0C - 383 212E 9D 4A 03 STA ICAX1,X - 384 2131 9D 48 03 STA ICBUFL,X - 385 2134 A9 00 LDA #$00 - 386 2136 9D 4B 03 STA ICAX2,X - 387 2139 9D 49 03 STA ICBUFL+1,X - 388 213C A9 1B LDA #Edriver - 391 2143 9D 45 03 STA ICBUFA+1,X - 392 2146 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 - 393 2149 30 2F BMI ErrorDisplay - 394 214B 60 RTS - 395 - 396 214C mainprog - 397 214C AD 0A 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US - 398 214F 2D 0C 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza - 399 2152 8D 09 21 STA USmode - 400 2155 F0 1E BEQ NoUSSpeed - 401 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler - 402 2157 A0 A2 ldy #blokDanychIO_GetUSSpeed - 404 215B 20 C8 2A jsr Table2DCB - 405 215E 20 59 E4 jsr JSIOINT ; wysylamy "?" - 406 2161 10 07 bpl USSpeed - 407 2163 A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage - 408 2165 8D 09 21 sta USmode - 409 2168 F0 0B beq NoUSSpeed - 410 216A USSpeed - 411 216A A0 02 LDY #$2 - 412 216C USstatprint - 413 216C B9 04 2C LDA ONtext,y - 414 216F 99 DE 22 STA USstatus,y - 415 2172 88 DEY - 416 2173 10 F7 bpl USstatprint - 417 - 418 2175 NoUSSpeed - 419 2175 4C BB 21 JMP ReadMainDir - 420 2178 Error148 - 421 2178 A0 94 LDY #$94 ; kod bledu do Y - 422 ; wyswietlenie komunikatu o bledzie - kod bledu w Y - 423 217A ErrorDisplay - 424 217A 98 TYA - 425 217B 48 PHA - 426 217C 20 DA 2A JSR Close1 - 427 217F 68 PLA - 428 2180 48 PHA - 429 2181 4A LSR - 430 2182 4A LSR - 431 2183 4A LSR - 432 2184 4A LSR - 433 2185 20 0F 21 JSR bin2AsciiHex ; 4 starsze bity na HEX - 434 2188 8D A1 21 STA ErrorNumHex - 435 218B 68 PLA - 436 218C 20 0F 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX - 437 218F 8D A2 21 STA ErrorNumHex+1 - 438 2192 20 2D 2A JSR PrintXY - 439 2195 00 00 .BY $00,$00 - 440 2197 7D .BY $7d ; kod czyszczenia ekranu - 441 2198 45 52 52 4F 52 20 + .BY "ERROR - $" - 442 21A1 ErrorNumHex - 443 21A1 30 30 00 .BY "00",$00 - 444 ; czekamy na dowolny klawisz - 445 21A4 A9 FF LDA #$FF - 446 21A6 8D FC 02 STA KBCODES - 447 21A9 WaitKloop - 448 21A9 AE FC 02 LDX KBCODES - 449 21AC E8 INX - 450 21AD F0 FA BEQ WaitKloop - 451 21AF 8D FC 02 STA KBCODES ; w A jest $FF - 452 ; ------------------ - 453 ; na wypadek wybrania nieistniejacej stacji - 454 ; po bledzie przechodzimy na te z ktorej sie ladowalismy - 455 21B2 AD 0B 21 LDA BootDrive - 456 ;LDA #1 - 457 21B5 20 7F 2B JSR SeTDriveNR - 458 ; ----------------- - 459 21B8 4C 4C 21 JMP mainprog ; i odpalamy program od nowa - 460 21BB ReadMainDir - 461 21BB 20 A7 29 JSR ReadPERCOM - 462 21BE A2 2D LDX #>FirstSectorBuff - 463 21C0 A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) - 472 21D2 D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki - 473 21D4 SpartaDisk - 474 21D4 A2 00 LDX #$00 - 475 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 - 476 21D6 AD 1F 2D LDA FirstSectorBuff+$1F - 477 21D9 30 04 BMI Sektor128b - 478 21DB AA TAX - 479 21DC A9 00 LDA #$00 - 480 21DE E8 INX ; i wyliczenie starszego bajtu - 481 21DF Sektor128b - 482 21DF 8D 89 20 STA .adr loader.SecLen ; przed przepisaniem - 483 21E2 8E 8A 20 STX .adr loader.SecLen+1 ; przed przepisaniem - 484 ; pokazanie na ekranie - 485 21E5 BD 01 2C LDA DensityCodes,X - 486 21E8 8D BA 22 STA DensityDisplay - 487 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu - 488 21EB AC 09 2D LDY FirstSectorBuff+$09 - 489 21EE AE 0A 2D LDX FirstSectorBuff+$0A - 490 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x - 491 21F1 ReadDIR - 492 ; ustawienie znacznika wlaczenia Turbo dla katalogu - 493 21F1 A9 01 LDA #$01 - 494 21F3 8D 0D 21 STA FolderTurbo - 495 21F6 84 D2 STY DirMapSect - 496 21F8 86 D3 STX DirMapSect+1 - 497 21FA A9 2F LDA #>DirSectorBuff - 498 21FC 85 D1 STA CurrentFileInfoBuff+1 - 499 21FE 85 CB STA CurrentDirBuf+1 - 500 2200 A9 80 LDA #" - 642 2340 3A 4D 61 69 6E 20 + .BY ":Main Dir. " - 643 234C BC .BY +$80,"<" - 644 234D 3A 55 50 2D 44 49 + .BY ":UP-DIR." - 645 2355 00 .BY $00 - 646 2356 A9 00 LDA #$00 - 647 2358 85 D9 STA NamesOnScreen - 648 235A label68 - 649 235A A5 D1 LDA CurrentFileInfoBuff+1 - 650 235C C5 CD CMP CurrentDirBufEnd+1 - 651 235E 90 08 BCC NoLastFileInDir - 652 2360 D0 55 BNE LastFilesPageJump - 653 2362 A5 D0 LDA CurrentFileInfoBuff - 654 2364 C5 CC CMP CurrentDirBufEnd - 655 2366 B0 4F BCS LastFilesPageJump - 656 2368 NoLastFileInDir - 657 2368 A0 00 LDY #$00 - 658 236A B1 D0 LDA (CurrentFileInfoBuff),Y - 659 236C F0 49 BEQ LastFilesPageJump - 660 236E A2 22 LDX #$22 - 661 2370 A9 20 LDA #$20 ; spacja - 662 2372 label50 - 663 2372 9D 23 24 STA GameName,X - 664 2375 CA DEX - 665 2376 10 FA BPL label50 - 666 2378 A0 10 LDY #$10 - 667 237A A2 0A LDX #$0A - 668 237C label51 - 669 237C B1 D0 LDA (CurrentFileInfoBuff),Y - 670 237E 9D 23 24 STA GameName,X - 671 2381 88 DEY - 672 2382 CA DEX - 673 2383 10 F7 BPL label51 - 674 2385 A5 D9 LDA NamesOnScreen - 675 2387 18 CLC - 676 2388 69 41 ADC #$41 ; literka "A" - 677 238A 8D 20 24 STA GameKeySymbol - 678 238D A5 D8 LDA $D8 - 679 238F D0 2C BNE label52 - 680 2391 A0 00 LDY #$00 - 681 ; status sprawdzanego pliku - 682 2393 B1 D0 LDA (CurrentFileInfoBuff),Y - 683 2395 29 19 AND #$19 - 684 2397 C9 09 CMP #$09 - 685 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" - 686 2399 F0 08 BEQ label53 - 687 239B A6 D7 LDX $D7 - 688 239D F0 1B BEQ label54 - 689 239F C9 08 CMP #$08 - 690 23A1 D0 17 BNE label54 - 691 23A3 label53 - 692 ; jeszcze raz status sprawdzanego pliku - 693 23A3 B1 D0 LDA (CurrentFileInfoBuff),Y - 694 23A5 29 20 AND #$20 - 695 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) - 696 23A7 F0 0B BEQ label55 - 697 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") - 698 23A9 A2 08 LDX #$08 - 699 23AB label56 - 700 23AB BD 32 25 LDA SubDirText,X - 701 23AE 8D 2F 24 STA GameName+12 - 702 23B1 CA DEX - 703 23B2 10 F7 BPL label56 - 704 23B4 label55 - 705 23B4 4C 13 24 JMP GameNamePrint - 706 23B7 LastFilesPageJump - 707 23B7 4C BB 24 JMP LastFilesPage - 708 23BA label54 - 709 23BA 4C 6B 24 JMP label59 - 710 23BD label52 - 711 23BD A0 00 LDY #$00 - 712 23BF B1 D0 LDA (CurrentFileInfoBuff),Y - 713 23C1 29 18 AND #$18 - 714 23C3 C9 08 CMP #$08 - 715 23C5 D0 F3 BNE label54 - 716 23C7 A5 CC LDA CurrentDirBufEnd - 717 23C9 85 D4 STA $D4 - 718 23CB A5 CD LDA CurrentDirBufEnd+1 - 719 23CD 85 D5 STA $D5 - 720 23CF label65 - 721 23CF A5 D5 LDA $D5 - 722 23D1 C5 CF CMP $CF - 723 23D3 90 08 BCC label60 - 724 23D5 D0 E3 BNE label54 - 725 23D7 A5 D4 LDA $D4 - 726 23D9 C5 CE CMP $CE - 727 23DB B0 DD BCS label54 - 728 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy - 729 23DD label60 - 730 23DD A0 00 LDY #$00 - 731 23DF B1 D4 LDA ($D4),Y - 732 23E1 C9 2A CMP #'*' - 733 23E3 D0 06 BNE CompareNames - 734 23E5 8D 0E 21 STA NewColors - 735 23E8 20 45 2B JSR Asteriks - 736 23EB CompareNames - 737 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT - 738 23EB A0 0A LDY #$0A ; 8+3 znaki - 739 23ED Checking62 - 740 23ED B1 D4 LDA ($D4),Y - 741 23EF D9 23 24 CMP GameName,Y - 742 23F2 D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw - 743 23F4 88 DEY - 744 23F5 10 F6 BPL Checking62 - 745 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku - 746 23F7 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku - 747 23F9 ReplacingName - 748 23F9 B1 D4 LDA ($D4),Y - 749 23FB 99 18 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania - 750 23FE C8 INY - 751 23FF C0 2E CPY #$2E - 752 2401 90 F6 BCC ReplacingName - 753 2403 B0 0E BCS GameNamePrint - 754 2405 CheckNextName - 755 2405 A5 D4 LDA $D4 - 756 2407 18 CLC - 757 2408 69 2E ADC #$2E - 758 240A 85 D4 STA $D4 - 759 240C 90 02 BCC label64 - 760 240E E6 D5 INC $D5 - 761 2410 label64 - 762 2410 4C CF 23 JMP label65 - 763 2413 GameNamePrint - 764 2413 A5 D9 LDA NamesOnScreen - 765 2415 18 CLC - 766 2416 69 02 ADC #$02 - 767 2418 8D 1F 24 STA YposGameName - 768 241B 20 2D 2A JSR PrintXY - 769 241E 01 .BY $01 - 770 241F YposGameName - 771 241F 02 .BY $02 - 772 2420 GameKeySymbol - 773 2420 41 29 20 .BY "A) " - 774 2423 GameName - 775 2423 20 20 20 20 20 20 + .BY " " - 776 2446 00 .BY $00 - 777 2447 A5 D9 LDA NamesOnScreen - 778 2449 0A ASL - 779 244A AA TAX - 780 244B A5 D0 LDA CurrentFileInfoBuff - 781 244D 9D 17 2C STA FirstSectorsTable,X - 782 2450 A5 D1 LDA CurrentFileInfoBuff+1 - 783 2452 9D 18 2C STA FirstSectorsTable+1,X - 784 2455 A5 D0 LDA CurrentFileInfoBuff - 785 2457 18 CLC - 786 2458 69 17 ADC #$17 - 787 245A 85 D0 STA CurrentFileInfoBuff - 788 245C 90 02 BCC label66 - 789 245E E6 D1 INC CurrentFileInfoBuff+1 - 790 2460 label66 - 791 2460 E6 D9 INC NamesOnScreen - 792 2462 A5 D9 LDA NamesOnScreen - 793 2464 C9 13 CMP #$13 - 794 2466 B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie - 795 2468 4C 5A 23 JMP label68 - 796 246B label59 - 797 246B A5 D0 LDA CurrentFileInfoBuff - 798 246D 18 CLC - 799 246E 69 17 ADC #$17 - 800 2470 85 D0 STA CurrentFileInfoBuff - 801 2472 90 02 BCC label69 - 802 2474 E6 D1 INC CurrentFileInfoBuff+1 - 803 2476 label69 - 804 2476 4C 5A 23 JMP label68 - 805 2479 MainDirKEY - 806 2479 4C BB 21 JMP ReadMainDir - 807 247C UpDirKEY - 808 247C A0 02 LDY #$02 - 809 247E B1 CA LDA (CurrentDirBuf),Y - 810 2480 AA TAX - 811 2481 88 DEY - 812 2482 11 CA ORA (CurrentDirBuf),Y - 813 2484 F0 37 BEQ KeyboardProc - 814 2486 B1 CA LDA (CurrentDirBuf),Y - 815 2488 A8 TAY - 816 2489 4C F1 21 JMP ReadDIR - 817 248C EscKEY - 818 ; sprawdzmy czy z Shift - 819 248C AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! - 820 248F 29 08 and #$08 - 821 2491 D0 06 BNE NoSHIFTEsc - 822 2493 20 1E 21 JSR EditorOpen - 823 2496 6C 0A 00 JMP (DOSVEC) - 824 2499 NoSHIFTEsc - 825 2499 A2 00 LDX #$00 - 826 249B 86 D8 STX $D8 - 827 249D E8 INX - 828 249E 86 D7 STX $D7 - 829 24A0 ToStartOfDirJump - 830 24A0 4C A3 22 JMP ToStartOfDir - 831 24A3 SpaceKEY - 832 24A3 A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy - 833 24A5 D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku - 834 24A7 4C B4 22 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej - 835 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie - 836 24AA ContArrowsPrint - 837 24AA 20 2D 2A JSR PrintXY - 838 24AD 01 15 .BY $01,$15 - 839 24AF 1D .BY $1D ; strzalka w dol - 840 24B0 00 .BY $00 - 841 24B1 20 2D 2A JSR PrintXY - 842 24B4 0E 15 .BY $0E,$15 - 843 24B6 1D .BY $1D ; strzalka w dol - 844 24B7 00 .BY $00 - 845 24B8 4C BD 24 JMP KeyboardProc - 846 24BB LastFilesPage - 847 24BB E6 D6 INC LastFilesPageFlag - 848 24BD KeyboardProc - 849 24BD AD 0E 21 LDA NewColors - 850 24C0 D0 0D BNE ColorsAlreadySet - 851 24C2 A9 C4 LDA #$C4 ; ustawienie koloru tła i liter - 852 24C4 8D C6 02 STA COLPF2S - 853 24C7 8D C8 02 STA COLBAKS - 854 24CA A9 CA LDA #$CA - 855 24CC 8D C5 02 STA COLPF1S - 856 24CF ColorsAlreadySet - 857 24CF 20 E4 2A JSR GetKey - 858 24D2 29 7F AND #%01111111 ; eliminujemy invers - 859 24D4 F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu - 860 24D6 C9 3E CMP #$3E ; ">" - 861 24D8 F0 9F BEQ MainDirKEY - 862 24DA C9 3C CMP #$3C ; "<" - 863 24DC F0 9E BEQ UpDirKEY - 864 24DE C9 7E CMP #$7E ; BackSpace - 865 24E0 F0 9A BEQ UpDirKEY - 866 24E2 C9 1B CMP #$1B ; Esc - 867 24E4 F0 A6 BEQ EscKEY - 868 24E6 C9 20 CMP #$20 ; Spacja - 869 24E8 F0 B9 BEQ SpaceKEY - 870 ; ---------------- - 871 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) - 872 24EA C9 10 CMP #$10 - 873 24EC B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) - 874 24EE 20 92 2B JSR SeTDriveLetter - 875 24F1 4C 4C 21 JMP mainprog - 876 24F4 noCtrlLetter - 877 ; sprawdzenie klawiszy 1-8 - 878 24F4 C9 31 CMP #'1' - 879 24F6 90 0D BCC NoNumber - 880 24F8 C9 39 CMP #'9' - 881 24FA B0 09 BCS NoNumber - 882 24FC 38 SEC - 883 24FD E9 30 SBC #'0' - 884 24FF 20 7F 2B JSR SeTDriveNR - 885 2502 4C 4C 21 JMP mainprog - 886 ; ----------------- - 887 2505 NoNumber - 888 2505 C9 61 CMP #'a' ; czy nie ma capsa - 889 2507 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany - 890 2509 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) - 891 250B BigLetters - 892 250B 38 SEC - 893 250C E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy - 894 250E C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie - 895 2510 B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz - 896 2512 0A ASL - 897 2513 AA TAX - 898 2514 BD 17 2C LDA FirstSectorsTable,X - 899 2517 85 D4 STA $D4 - 900 2519 BD 18 2C LDA FirstSectorsTable+1,X - 901 251C 85 D5 STA $D5 - 902 251E A0 00 LDY #$00 - 903 2520 B1 D4 LDA ($D4),Y - 904 2522 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik - 905 2524 F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader - 906 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran - 907 2526 A0 02 LDY #$02 - 908 2528 B1 D4 LDA ($D4),Y - 909 252A AA TAX - 910 252B 88 DEY - 911 252C B1 D4 LDA ($D4),Y - 912 252E A8 TAY - 913 252F 4C F1 21 JMP ReadDIR - 914 2532 SubDirText - 915 2532 3C 53 55 42 2D 44 + .BY "" - 916 253B GOtoLoader - 917 253B 20 2E 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka - 918 253E F0 03 BEQ DiskNotChanged1 - 919 2540 4C BB 21 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego - 920 2543 DiskNotChanged1 - 921 2543 AD 0D 21 LDA FolderTurbo - 922 2546 F0 07 BEQ SetTurboOFF - 923 2548 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! - 924 254B 29 08 and #$08 - 925 254D D0 03 BNE NoSHIFT - 926 254F SetTurboOFF - 927 254F 8D 09 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 - 928 2552 NoSHIFT - 929 2552 A0 01 LDY #$01 - 930 2554 B1 D4 LDA ($D4),Y - 931 2556 8D BE 20 STA .adr loader.FirstMapSectorNr ; przed przepisaniem - 932 2559 8D 2A 2A sta blokDanychIO+$A ; od razu do bloku IOCB - 933 255C C8 INY - 934 255D B1 D4 LDA ($D4),Y - 935 255F 8D BF 20 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem - 936 2562 8D 2B 2A sta blokDanychIO+$B ; od razu do bloku IOCB - 937 2565 C8 INY - 938 2566 B1 D4 LDA ($D4),Y - 939 2568 49 FF EOR #$FF - 940 256A 8D 08 21 STA .adr loader.tempToFileEndL - 941 256D C8 INY - 942 256E B1 D4 LDA ($D4),Y - 943 2570 49 FF EOR #$FF - 944 2572 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem - 945 2575 C8 INY - 946 2576 B1 D4 LDA ($D4),Y - 947 2578 49 FF EOR #$FF - 948 257A 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem - 949 ; wszystko zapamietane mozna robic mape sektorow.... - 950 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu - 951 ; czyli DirSectorBuff - 952 ; sektor mapy przed kompresja leci do DirMapSectorBuff - 953 ; UWAGA - 954 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi - 955 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! - 956 = 2F80 CompressedMap = DirSectorBuff - 957 ; czytamy pierwszy sektor mapy - 958 257D A0 80 LDY #DirMapSectorBuff - 960 2581 20 F2 29 Jsr ReadSector - 961 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! - 962 2584 A9 00 LDA #00 - 963 2586 85 82 STA CompressedMapCounter - 964 2588 85 83 STA CompressedMapCounter+1 - 965 258A 20 56 26 JSR AddToCompressedMAP - 966 258D AD 84 2D LDA DirMapSectorBuff+4 - 967 2590 85 86 STA PrevFileSector - 968 2592 20 56 26 JSR AddToCompressedMAP - 969 2595 AD 85 2D LDA DirMapSectorBuff+5 - 970 2598 85 87 sta PrevFileSector+1 - 971 259A 20 56 26 JSR AddToCompressedMAP - 972 ; Inicjujemy liczniki - 973 259D .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 - 974 259D .zpvar PrevFileSector, MapPositionMem .word - 975 259D .zpvar SectorOffset .word - 976 259D .zpvar SectorsCounter .byte - 977 259D A9 00 LDA #$00 - 978 259F 85 81 STA MapCounter+1 - 979 25A1 85 8C STA SectorsCounter - 980 25A3 A9 06 lda #$06 - 981 25A5 85 80 STA MapCounter - 982 25A7 GenerateCompressedMap - 983 25A7 18 CLC - 984 25A8 A9 80 LDA #DirMapSectorBuff - 988 25B0 65 81 ADC MapCounter+1 - 989 25B2 85 89 STA MAPPositionMem+1 - 990 25B4 A2 00 LDX #0 - 991 25B6 A0 01 LDY #1 - 992 25B8 A1 88 LDA (MAPPositionMem,x) - 993 25BA 11 88 ORA (MAPPositionMem),y - 994 25BC F0 56 BEQ Sector00 - 995 25BE 38 SEC - 996 25BF A1 88 LDA (MAPPositionMem,x) - 997 25C1 E5 86 SBC PrevFileSector - 998 25C3 85 8A STA SectorOffset - 999 25C5 B1 88 LDA (MAPPositionMem),y - 1000 25C7 E5 87 SBC PrevFileSector+1 - 1001 25C9 85 8B STA SectorOffset+1 - 1002 ; mamy odstep miedzy poprzednim a nastepnym sektorem - 1003 25CB D0 26 BNE OffsetToBig - 1004 25CD A5 8A LDA SectorOffset - 1005 25CF 30 22 BMI OffsetToBig ; max przeskok 127 sektorow - 1006 25D1 C9 01 CMP #$01 - 1007 25D3 D0 11 BNE JumpForward - 1008 ; kolejny sektor - 1009 ; zwiekszamy wiec licznik - 1010 25D5 E6 8C inc SectorsCounter - 1011 25D7 A5 8C LDA SectorsCounter - 1012 25D9 C9 7F CMP #%01111111 - 1013 25DB D0 2C BNE GetNextMapWord - 1014 ; tu licznik dotarl do konca zerujemy go - 1015 ; dodajemy wpis do skompresowanej mapy i gotowe - 1016 25DD 20 56 26 JSR AddToCompressedMAP - 1017 25E0 A9 00 LDA #0 - 1018 25E2 85 8C STA SectorsCounter - 1019 25E4 F0 23 BEQ GetNextMapWord - 1020 ; ominiecie wyznaczonej ilości sektorów (w A) - 1021 25E6 JumpForward - 1022 25E6 20 71 26 JSR FlushBuffer - 1023 25E9 A5 8A LDA SectorOffset - 1024 25EB 09 80 ORA #%10000000 - 1025 25ED 20 56 26 JSR AddToCompressedMAP - 1026 25F0 4C 09 26 JMP GetNextMapWord - 1027 ; wyznaczenie skoku do nowego sektora pliku - 1028 25F3 OffsetToBig - 1029 25F3 20 71 26 JSR FlushBuffer - 1030 25F6 A9 00 LDA #0 - 1031 25F8 20 56 26 JSR AddToCompressedMAP - 1032 25FB A0 00 LDY #00 - 1033 25FD B1 88 LDA (MAPPositionMem),y - 1034 25FF 20 56 26 JSR AddToCompressedMAP - 1035 2602 A0 01 LDY #01 - 1036 2604 B1 88 LDA (MAPPositionMem),y - 1037 2606 20 56 26 JSR AddToCompressedMAP - 1038 2609 GetNextMapWord - 1039 ; zapamietanie numeru obecnego sektora do porownania potem - 1040 2609 A0 00 LDY #00 - 1041 260B B1 88 LDA (MAPPositionMem),y - 1042 260D 85 86 STA PrevFileSector - 1043 260F C8 INY - 1044 2610 B1 88 LDA (MAPPositionMem),y - 1045 2612 85 87 STA PrevFileSector+1 - 1046 2614 Sector00 - 1047 2614 18 A5 80 69 02 85 + ADW MapCounter #2 - 1048 261F ops01 - 1049 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala - 1050 261F A5 81 LDA MapCounter+1 - 1051 2621 CD 8A 20 CMP .adr loader.SecLen+1 - 1052 2624 D0 05 bne noteqal01 - 1053 2626 A5 80 LDA MapCounter - 1054 2628 CD 89 20 CMP .adr loader.SecLen - 1055 262B noteqal01 - 1056 262B F0 03 4C A7 25 JNE GenerateCompressedMap - 1057 ; czytamy nastepny sektor mapy - 1058 ; sprawdzmy czy nie koniec - 1059 2630 AD 80 2D LDA DirMapSectorBuff - 1060 2633 0D 81 2D ORA DirMapSectorBuff+1 - 1061 2636 F0 45 BEQ EndMakingMap - 1062 2638 AD 80 2D LDA DirMapSectorBuff - 1063 263B 8D 2A 2A sta blokDanychIO+$A - 1064 263E AD 81 2D LDA DirMapSectorBuff+1 - 1065 2641 8D 2B 2A sta blokDanychIO+$B - 1066 2644 A0 80 LDY #DirMapSectorBuff - 1068 2648 20 F2 29 Jsr ReadSector - 1069 ; zerujemy licznik mapy - 1070 264B A9 00 LDA #$00 - 1071 264D 85 81 STA MapCounter+1 - 1072 264F A9 04 lda #$04 - 1073 2651 85 80 STA MapCounter - 1074 2653 4C A7 25 JMP GenerateCompressedMap - 1075 ; dpisanie bajtu z A do mapy sektorow skompresowanej - 1076 2656 AddToCompressedMAP - 1077 2656 48 PHA - 1078 ; wyliczamy adresa - 1079 2657 18 CLC - 1080 2658 A5 82 LDA CompressedMapCounter - 1081 265A 69 80 ADC #CompressedMap - 1085 2663 8D 69 26 STA xxxxbla+1 - 1086 2666 68 PLA - 1087 = 2668 xxxxbla=*+1 - 1088 2667 8D FF FF STA $FFFF - 1089 266A E6 82 INC CompressedMapCounter - 1090 266C D0 02 BNE noinc013 - 1091 266E E6 83 INC CompressedMapCounter+1 - 1092 2670 noinc013 - 1093 2670 60 RTS - 1094 2671 FlushBuffer - 1095 2671 A5 8C LDA SectorsCounter - 1096 2673 F0 07 BEQ NoFlush - 1097 2675 20 56 26 JSR AddToCompressedMAP - 1098 2678 A9 00 LDA #0 - 1099 267A 85 8C STA SectorsCounter - 1100 267C NoFlush - 1101 267C 60 RTS - 1102 267D EndMakingMap - 1103 267D 20 71 26 JSR FlushBuffer - 1104 2680 LoaderGo - 1105 2680 A0 00 LDY #$00 - 1106 2682 8C 44 02 STY COLDST - 1107 2685 A9 01 LDA #$01 - 1108 2687 85 09 STA BOOT - 1109 2689 AE 00 07 LDX $700 - 1110 268C E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta - 1111 268E D0 03 BNE NoRunFromDOS - 1112 2690 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! - 1113 ; STA $D5EC ; to wylacza SpartaDOS X - 1114 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) - 1115 2693 NoRunFromDOS - 1116 2693 A9 A4 LDA #AfterWormStart - 1119 2699 85 0D STA DOSINI+1 - 1120 ; LDA #>JRESETCD - 1121 ; STA DOSVEC+1 - 1122 ; LDA #TempMEMLO - 1143 26B7 6D 8A 20 ADC .adr loader.SecLen+1 - 1144 26BA 8D E8 02 STA MEMLO+1 - 1145 26BD 85 3E STA CompressedMapPos+1 - 1146 ; STA pointerMov2b - 1147 ; STA APPMHI+1 - 1148 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora - 1149 ; jest to jednoczesnie adres umieszczenia skompresowanej - 1150 ; mapy sektorow pliku dla loadera ale MINUS 1 - 1151 26BF A5 3D D0 02 C6 3E + DEW CompressedMapPos - 1152 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej - 1153 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) - 1154 26C7 18 CLC - 1155 26C8 AD E7 02 LDA MEMLO - 1156 ; ADC CompressedMapCounter - 1157 ; STA MEMLO - 1158 26CB 8D 7C 27 STA TurboRelocADDR - 1159 26CE AD E8 02 LDA MEMLO+1 - 1160 ; ADC CompressedMapCounter+1 - 1161 ; STA MEMLO+1 - 1162 26D1 8D 7D 27 STA TurboRelocADDR+1 - 1163 26D4 A9 71 LDA #JTESTROM - 1166 26DA 85 0D STA DOSINI+1 - 1167 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) - 1168 ; INC $033D ; bajty kontrolne zimnego startu - 1169 ; INC $033E ; zmiana ich wartosci wymusza - 1170 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) - 1171 26DC A2 00 LDX #$00 - 1172 26DE 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) - 1173 ; STX BOOT - 1174 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci - 1175 26E0 moveloop1 - 1176 26E0 BD 00 20 LDA movedproc,X - 1177 26E3 9D 00 07 STA $0700,X - 1178 26E6 BD 00 21 LDA movedproc+$0100,X - 1179 26E9 9D 00 08 STA $0800,X - 1180 26EC E8 INX - 1181 26ED D0 F1 BNE moveloop1 - 1182 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora - 1183 /* moveloop2 - 1184 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy - 1185 pointerMov2a=*+2 - 1186 LDA CompressedMap,x ; kod samomodyfikujacy sie - 1187 pointerMov2b=*+2 - 1188 STA $FFFF,x ; kod samomodyfikujacy sie - 1189 LDA CompressedMapCounter - 1190 AND CompressedMapCounter+1 - 1191 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! - 1192 BEQ SectorMapReady - 1193 INX - 1194 BNE moveloop2 - 1195 inc pointerMov2a - 1196 inc pointerMov2b - 1197 bne moveloop2 - 1198 SectorMapReady - 1199 */ - 1199 - 1200 26EF 20 3E 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO - 1201 26F2 20 AE 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) - 1202 - 1203 26F5 A2 00 LDX #$00 - 1204 26F7 8A TXA - 1205 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) - 1206 26F8 ClearLoop1 - 1207 26F8 9D 00 01 STA $0100,X ; STOS !!! - 1208 26FB 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) - 1209 26FE 9D 00 05 STA $0500,X - 1210 2701 9D 00 06 STA $0600,X - 1211 2704 E0 80 CPX #$80 ;tylko ponad $80 - 1212 2706 90 02 BCC NoZpage - 1213 2708 95 00 STA $00,X ; czyli polowa strony zerowej - 1214 270A NoZpage - 1215 270A E8 INX - 1216 270B D0 EB BNE ClearLoop1 - 1217 270D A2 FF LDX #$FF - 1218 270F 9A TXS ; "wyzerowanie wskaznika STOSU - 1219 - 1220 ; a tutaj otwieramy kanal 1 CIO do odczytu - 1221 - 1222 2710 A2 10 LDX #16 ; kanal 1 - 1223 2712 A9 03 LDA #COPN ; rozkaz OPEN - 1224 2714 9D 42 03 STA ICCOM,X ; COMMAND - 1225 2717 A9 04 LDA #$04 ; READ - 1226 2719 9D 4A 03 STA ICAUX1,X - 1227 271C A9 00 LDA #$00 - 1228 271E 9D 4B 03 STA ICAUX2,X - 1229 2721 A9 31 LDA # FileToOpen - 1232 2728 9D 45 03 STA ICBADR+1,X - 1233 272B 20 56 E4 JSR CIO - 1234 - 1235 272E 4C C0 07 JMP loader.LoadStart ; po przepisaniu - 1236 2731 FileToOpen - 1237 2731 48 3A 53 43 4F 52 + .BYTE 'H:SCORCH.XEX',0 - 1238 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba - 1239 ; na koniec odpowiednie zmodyfikowanie MEMLO - 1240 273E ADDspeedProc - 1241 273E AD 09 21 LDA USmode - 1242 2741 F0 5F beq NoHappyLoader - 1243 ; wyznaczamy offset procedury - 1244 2743 38 SEC - 1245 2744 A9 A3 LDA #HappyUSMovedProc - 1249 274E ED E8 02 SBC MEMLO+1 - 1250 2751 8D 00 2C STA HappyOffset+1 - 1251 - 1252 2754 A0 00 LDY #0 - 1253 2756 A2 09 LDX #[$A-1] ;xjsrA - the last - 1254 ; relokujemy skoki pod offset z MEMLO - 1255 2758 HappyRelocate - 1256 2758 38 SEC - 1257 2759 BD EB 2B LDA xjsrTableL,x - 1258 275C 85 32 STA SecBuffer - 1259 275E BD F5 2B LDA xjsrTableH,x - 1260 2761 85 33 STA SecBuffer+1 - 1261 2763 B1 32 LDA (SecBuffer),y - 1262 2765 ED FF 2B SBC HappyOffset - 1263 2768 91 32 STA (SecBuffer),y - 1264 276A C8 INY - 1265 276B B1 32 LDA (SecBuffer),y - 1266 276D ED 00 2C SBC HappyOffset+1 - 1267 2770 91 32 STA (SecBuffer),y - 1268 2772 88 DEY - 1269 2773 CA DEX - 1270 2774 10 E2 BPL HappyRelocate - 1271 - 1272 2776 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] - 1273 2778 label72x - 1274 2778 BD A3 27 LDA HappyUSMovedProc,X - 1275 = 277C TurboRelocADDR=*+1 - 1276 277B 9D 00 0A STA $0A00,X - 1277 277E CA DEX - 1278 277F E0 FF CPX #$FF - 1279 2781 D0 F5 BNE label72x - 1280 2783 A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] - 1281 2785 A2 00 LDX #$00 - 1282 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. - 1283 2787 label73 - 1284 2787 98 TYA - 1285 2788 18 CLC - 1286 2789 6D E7 02 ADC MEMLO - 1287 278C 8D E7 02 STA MEMLO - 1288 278F 8A TXA - 1289 2790 6D E8 02 ADC MEMLO+1 - 1290 2793 8D E8 02 STA MEMLO+1 - 1291 2796 AD 7C 27 LDA TurboRelocADDR - 1292 2799 8D 7E 07 STA loader.SioJMP+1 ; po przepisaniu - 1293 279C AD 7D 27 LDA TurboRelocADDR+1 - 1294 279F 8D 7F 07 STA loader.SioJMP+2 ; po przepisaniu - 1295 27A2 NoHappyLoader - 1296 27A2 60 RTS - 1297 - 1298 - 1299 - 1300 ; UWAGA !!!!!!!!!!!!!! - 1301 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! - 1302 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone - 1303 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! - 1304 27A3 HappyUSMovedProc ; - 1305 - 1306 27A3 AD 04 03 LDA DBUFA - 1307 27A6 85 32 STA SecBuffer - 1308 27A8 AD 05 03 LDA DBUFA+1 - 1309 27AB 85 33 STA SecBuffer+1 - 1310 - 1311 27AD AD 08 03 LDA DBYT - 1312 27B0 85 31 STA SecLenUS - 1313 - 1314 27B2 78 SEI - 1315 27B3 BA TSX - 1316 27B4 86 37 STX StackCopy - 1317 27B6 A9 0D LDA #$0D - 1318 27B8 85 34 STA CRETRYZ - 1319 ;command retry on zero page - 1320 27BA CommandLoop - 1321 = 27BB HappySpeed = *+1 - 1322 27BA A9 28 LDA #$28 ;here goes speed from "?" - 1323 27BC 8D 04 D2 STA AUDF3 - 1324 27BF A9 34 LDA #$34 - 1325 27C1 8D 03 D3 STA PBCTL ;ustawienie linii command - 1326 27C4 A2 80 LDX #$80 - 1327 27C6 DelayLoopCmd - 1328 27C6 CA DEX - 1329 27C7 D0 FD BNE DelayLoopCmd - 1330 27C9 8E 06 D2 STX AUDF4 ; zero - 1331 27CC 86 35 STX TransmitError - 1332 ; pokey init - 1333 27CE A9 23 LDA #$23 - 1334 27D0 20 44 28 xjsr1 JSR SecTransReg - 1335 ; - 1336 - 1337 27D3 18 CLC - 1338 27D4 AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) - 1339 27D7 6D 01 03 ADC DUNIT ; dodajemy numer stacji - 1340 27DA 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) - 1341 27DC 85 30 STA CheckSum - 1342 27DE 8D 0D D2 STA SEROUT - 1343 27E1 AD 02 03 LDA DCOMND - 1344 27E4 20 5A 28 xjsr2 JSR PutSIOByte - 1345 27E7 AD 0A 03 LDA DAUX1 - 1346 27EA 20 5A 28 xjsr3 JSR PutSIOByte - 1347 27ED AD 0B 03 LDA DAUX2 - 1348 27F0 20 5A 28 xjsr4 JSR PutSIOByte - 1349 27F3 A5 30 LDA CheckSum - 1350 27F5 20 5A 28 xjsr5 JSR PutSIOByte - 1351 - 1352 27F8 waitforEndOftransmission - 1353 27F8 AD 0E D2 LDA IRQST - 1354 27FB 29 08 AND #$08 - 1355 27FD D0 F9 BNE waitforEndOftransmission - 1356 - 1357 27FF A9 13 LDA #$13 - 1358 2801 20 44 28 xjsr6 JSR SecTransReg - 1359 - 1360 2804 A9 3C LDA #$3c - 1361 2806 8D 03 D3 STA PBCTL ;command line off - 1362 ; two ACK's - 1363 2809 A0 02 LDY #2 - 1364 280B DoubleACK - 1365 280B 20 76 28 xjsr7 JSR GetSIOByte - 1366 280E C9 44 CMP #$44 - 1367 2810 B0 19 BCS ErrorHere - 1368 2812 88 DEY - 1369 2813 D0 F6 BNE DoubleACK + 173 org $1FFD + 174 + 175 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura + 176 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! + 177 = 07D2 FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu + 178 = 07D2 TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) + 179 + 180 START + 181 FFFF> 1FFD-2CE4> 4C 23 + JMP FirstRun ;1FFD 4C 70 21 + 182 + 183 + 184 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu + 185 ; do wczytania !!!!!! + 186 + 187 2000 movedproc + 188 0700 .local loader, $0700 + 189 + 190 ; adres poczatkowy pamieci do ktorej zapisujemy kolejny ladowany blok pliku + 191 0700 InBlockAddr + 192 0700 00 00 .WO 00 ; word + 193 ; dlugosc ladowanego bloku + 194 0702 BlockLen + 195 0702 00 00 .WO 00 ; word + 196 ; zmienna tymczasowa potrzebna do obliczenia dlugosci bloku + 197 0704 BlockATemp + 198 0704 00 00 .WO 00 + 199 0706 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + 200 0706 20 99 07 JSR GoInitAddr + 201 0709 FileNextBlock + 202 ; wczytanie kolejnego bloku binarnego + 203 0709 20 8C 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) + 204 070C C0 88 CPY #$88 ; czy EOF + 205 070E D0 03 4C 9C 07 jeq EndOfFile + 206 0713 AD 00 07 LDA InBlockAddr + 207 0716 2D 01 07 AND InBlockAddr+1 + 208 0719 C9 FF CMP #$FF ; jesli oba sa $FF to..... + 209 071B D0 03 BNE FileNoFFFFHead + 210 071D 20 8C 07 JSR FileGetBlockStart ; pobranie jeszcze raz + 211 0720 FileNoFFFFHead + 212 0720 AD 00 07 8D 04 07 + mwa InBlockAddr BlockATemp ; zapamietanie adresu poczatkowego bloku (na chwile) + 213 072C A9 02 LDA #BlockLen + 216 0733 8D 01 07 sta InBlockAddr+1 + 217 0736 20 A6 07 JSR GetFile2Bytes ; pobranie dwoch bajtow - ; Pobranie adresu konca ladowanego bloku + 218 0739 C0 88 CPY #$88 ; czy EOF + 219 073B F0 5F beq EndOfFile + 220 ; wyliczenie długości bloku programu binarnego + 221 073D 38 sec + 222 073E AD 02 07 lda BlockLen + 223 0741 ED 04 07 sbc BlockATemp + 224 0744 8D 02 07 sta BlockLen + 225 0747 AD 03 07 lda BlockLen+1 + 226 074A ED 05 07 sbc BlockATemp+1 + 227 074D 8D 03 07 sta BlockLen+1 + 228 0750 EE 02 07 D0 03 EE + inw BlockLen + 229 0758 AD 04 07 8D 00 07 + mwa BlockATemp InBlockAddr ; odtworzenie adresu poczatkowego bloku + 230 0764 38 SEC + 231 0765 WhatIsIt + 232 0765 B0 0F BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y + 233 ; ktory tylko wylacza skok !!! + 234 0767 CE 65 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! + 235 076A AD 00 07 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ + 236 076D 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu + 237 0770 AD 01 07 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem + 238 0773 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). + 239 0776 FileNoFirstBlock + 240 0776 A9 A5 LDA #Jrts ; jesli nie jest to blok z adresem inicjacji + 243 077D 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie + 244 + 245 0780 BlockReadLoop ;; petla odczytujaca z pliku blok binarny + 246 0780 20 B0 07 JSR GetFileBytes + 247 0783 C0 88 CPY #$88 ; czy EOF + 248 0785 F0 15 beq EndOfFile + 249 0787 F0 03 4C 06 07 jne FileInit ; koniec bloku - skok pod adres inicjalizacji + 250 078C FileGetBlockStart + 251 078C A9 00 LDA #InBlockAddr + 254 0793 8D 01 07 sta InBlockAddr+1 + 255 0796 4C A6 07 JMP GetFile2Bytes ; pobranie dwoch bajtow + 256 0799 GoInitAddr + 257 0799 6C E2 02 JMP ($02E2) + 258 079C EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + 259 079C A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu + 260 079E 48 PHA + 261 079F A9 73 LDA #<(JRESETWM-1) + 262 07A1 48 PHA + 263 07A2 6C E0 02 JMP ($02E0) + 264 07A5 Jrts + 265 07A5 60 RTS + 266 07A6 GetFile2Bytes + 267 07A6 A9 02 8D 02 07 A9 + mwa #2 BlockLen + 268 07B0 GetFileBytes + 269 07B0 A2 10 LDX #16 ; kanal 1 + 270 07B2 A9 07 LDA #CGBINR ; rozkaz BGET + 271 07B4 9D 42 03 STA ICCOM,X ; COMMAND + 272 07B7 AD 00 07 LDA InBlockAddr + 273 07BA 9D 44 03 STA ICBUFA,x + 274 07BD AD 01 07 LDA InBlockAddr+1 + 275 07C0 9D 45 03 STA ICBUFA+1,x + 276 07C3 AD 02 07 LDA BlockLen + 277 07C6 9D 48 03 STA ICBUFL,x + 278 07C9 AD 03 07 LDA BlockLen+1 + 279 07CC 9D 49 03 STA ICBUFL+1,x + 280 07CF 4C 56 E4 JMP CIO + 281 + 282 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 + 283 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz + 284 ; w tym miejscu potem bedzie bufor + 285 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora + 286 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania + 287 07D2 zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie + 288 07D2 FirstMapSectorNr + 289 07D2 00 00 .WO $0000 + 290 07D4 blokDanychIO_Loader + 291 07D4 31 01 52 40 D2 07 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 + 292 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) + 293 = 07DC SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 + 294 07DE SectorNumber + 295 07DE 00 00 .WO $0000 + 296 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 + 297 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych + 298 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO + 299 07E0 ToFileEndH + 300 07E0 00 00 .WO $0000 ; do usuniecia + 301 07E2 SioJMP + 302 07E2 20 59 E4 JSR JSIOINT + 303 ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + 304 07E5 60 RTS + 305 07E6 LoadStart + 306 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + 307 07E6 AC E7 02 LDY MEMLO + 308 07E9 AD E8 02 LDA MEMLO+1 + 309 07EC 8D F3 07 STA InMemClearLoop+2 + 310 07EF OutMemClearLoop + 311 07EF A9 00 LDA #$00 + 312 07F1 InMemClearLoop + 313 07F1 99 00 09 STA $0900,Y + 314 07F4 C8 INY + 315 07F5 D0 FA BNE InMemClearLoop + 316 07F7 EE F3 07 INC InMemClearLoop+2 + 317 07FA AD F3 07 LDA InMemClearLoop+2 + 318 07FD CD E6 02 CMP MEMTOP+1 + 319 0800 90 ED BCC OutMemClearLoop + 320 0802 AD E6 02 LDA MEMTOP+1 + 321 0805 8D 0F 08 STA LastMemPageClear+2 + 322 0808 AC E5 02 LDY MEMTOP + 323 080B A9 00 LDA #$00 + 324 080D LastMemPageClear + 325 080D 99 00 80 STA $8000,Y + 326 0810 88 DEY + 327 0811 C0 FF CPY #$FF + 328 0813 D0 F8 BNE LastMemPageClear + 329 ; wyczyszczona, wiec .... + 330 0815 A9 FF LDA #$FF + 331 0817 8D FC 02 STA KBCODES + 332 081A EE 65 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) + 333 081D 4C 09 07 JMP FileNextBlock + 334 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku + 335 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera + 336 0820 tempToFileEndL + 337 0820 00 .BY $00 + 338 .endl + 339 2121 JAkieTurbo + 340 2121 USmode + 341 2121 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed + 342 2122 QMEG + 343 2122 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG + 344 2123 BootDrive + 345 2123 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi + 346 2124 BootShift + 347 2124 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety + 348 2125 FolderTurbo + 349 2125 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT + 350 2126 NewColors + 351 2126 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano + 352 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) + 353 2127 bin2AsciiHex + 354 2127 29 0F AND #$0F + 355 2129 09 30 ORA #$30 + 356 212B C9 3A CMP #$3A + 357 212D 90 03 BCC labelka + 358 212F 18 CLC + 359 2130 69 07 ADC #$07 + 360 2132 labelka + 361 2132 60 RTS + 362 2133 Edriver + 363 2133 45 3A 9B .BY "E:",$9b + 364 2136 EditorOpen + 365 ; otwarcie ekranu !!! + 366 2136 A2 00 LDX #$00 ; kanal nr 0 + 367 2138 20 F4 2A JSR CloseX ; najpierw Zamkniecie Ekranu + 368 213B 30 55 BMI ErrorDisplay + 369 213D A2 00 LDX #$00 ; kanal nr 0 + 370 213F A9 03 LDA #$03 + 371 2141 9D 42 03 STA ICCMD,X + 372 2144 A9 0C LDA #$0C + 373 2146 9D 4A 03 STA ICAX1,X + 374 2149 9D 48 03 STA ICBUFL,X + 375 214C A9 00 LDA #$00 + 376 214E 9D 4B 03 STA ICAX2,X + 377 2151 9D 49 03 STA ICBUFL+1,X + 378 2154 A9 33 LDA #Edriver + 381 215B 9D 45 03 STA ICBUFA+1,X + 382 215E 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 + 383 2161 30 2F BMI ErrorDisplay + 384 2163 60 RTS + 385 + 386 2164 mainprog + 387 2164 AD 22 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US + 388 2167 2D 24 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza + 389 216A 8D 21 21 STA USmode + 390 216D F0 1E BEQ NoUSSpeed + 391 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler + 392 216F A0 BA ldy #blokDanychIO_GetUSSpeed + 394 2173 20 E0 2A jsr Table2DCB + 395 2176 20 59 E4 jsr JSIOINT ; wysylamy "?" + 396 2179 10 07 bpl USSpeed + 397 217B A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage + 398 217D 8D 21 21 sta USmode + 399 2180 F0 0B beq NoUSSpeed + 400 2182 USSpeed + 401 2182 A0 02 LDY #$2 + 402 2184 USstatprint + 403 2184 B9 1C 2C LDA ONtext,y + 404 2187 99 F6 22 STA USstatus,y + 405 218A 88 DEY + 406 218B 10 F7 bpl USstatprint + 407 + 408 218D NoUSSpeed + 409 218D 4C D3 21 JMP ReadMainDir + 410 2190 Error148 + 411 2190 A0 94 LDY #$94 ; kod bledu do Y + 412 ; wyswietlenie komunikatu o bledzie - kod bledu w Y + 413 2192 ErrorDisplay + 414 2192 98 TYA + 415 2193 48 PHA + 416 2194 20 F2 2A JSR Close1 + 417 2197 68 PLA + 418 2198 48 PHA + 419 2199 4A LSR + 420 219A 4A LSR + 421 219B 4A LSR + 422 219C 4A LSR + 423 219D 20 27 21 JSR bin2AsciiHex ; 4 starsze bity na HEX + 424 21A0 8D B9 21 STA ErrorNumHex + 425 21A3 68 PLA + 426 21A4 20 27 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX + 427 21A7 8D BA 21 STA ErrorNumHex+1 + 428 21AA 20 45 2A JSR PrintXY + 429 21AD 00 00 .BY $00,$00 + 430 21AF 7D .BY $7d ; kod czyszczenia ekranu + 431 21B0 45 52 52 4F 52 20 + .BY "ERROR - $" + 432 21B9 ErrorNumHex + 433 21B9 30 30 00 .BY "00",$00 + 434 ; czekamy na dowolny klawisz + 435 21BC A9 FF LDA #$FF + 436 21BE 8D FC 02 STA KBCODES + 437 21C1 WaitKloop + 438 21C1 AE FC 02 LDX KBCODES + 439 21C4 E8 INX + 440 21C5 F0 FA BEQ WaitKloop + 441 21C7 8D FC 02 STA KBCODES ; w A jest $FF + 442 ; ------------------ + 443 ; na wypadek wybrania nieistniejacej stacji + 444 ; po bledzie przechodzimy na te z ktorej sie ladowalismy + 445 21CA AD 23 21 LDA BootDrive + 446 ;LDA #1 + 447 21CD 20 97 2B JSR SeTDriveNR + 448 ; ----------------- + 449 21D0 4C 64 21 JMP mainprog ; i odpalamy program od nowa + 450 21D3 ReadMainDir + 451 21D3 20 BF 29 JSR ReadPERCOM + 452 21D6 A2 2D LDX #>FirstSectorBuff + 453 21D8 A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) + 462 21EA D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki + 463 21EC SpartaDisk + 464 21EC A2 00 LDX #$00 + 465 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 + 466 21EE AD 1F 2D LDA FirstSectorBuff+$1F + 467 21F1 30 04 BMI Sektor128b + 468 21F3 AA TAX + 469 21F4 A9 00 LDA #$00 + 470 21F6 E8 INX ; i wyliczenie starszego bajtu + 471 21F7 Sektor128b + 472 21F7 8D DC 20 STA .adr loader.SecLen ; przed przepisaniem + 473 21FA 8E DD 20 STX .adr loader.SecLen+1 ; przed przepisaniem + 474 ; pokazanie na ekranie + 475 21FD BD 19 2C LDA DensityCodes,X + 476 2200 8D D2 22 STA DensityDisplay + 477 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + 478 2203 AC 09 2D LDY FirstSectorBuff+$09 + 479 2206 AE 0A 2D LDX FirstSectorBuff+$0A + 480 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x + 481 2209 ReadDIR + 482 ; ustawienie znacznika wlaczenia Turbo dla katalogu + 483 2209 A9 01 LDA #$01 + 484 220B 8D 25 21 STA FolderTurbo + 485 220E 84 D2 STY DirMapSect + 486 2210 86 D3 STX DirMapSect+1 + 487 2212 A9 2F LDA #>DirSectorBuff + 488 2214 85 D1 STA CurrentFileInfoBuff+1 + 489 2216 85 CB STA CurrentDirBuf+1 + 490 2218 A9 80 LDA #" + 632 2358 3A 4D 61 69 6E 20 + .BY ":Main Dir. " + 633 2364 BC .BY +$80,"<" + 634 2365 3A 55 50 2D 44 49 + .BY ":UP-DIR." + 635 236D 00 .BY $00 + 636 236E A9 00 LDA #$00 + 637 2370 85 D9 STA NamesOnScreen + 638 2372 label68 + 639 2372 A5 D1 LDA CurrentFileInfoBuff+1 + 640 2374 C5 CD CMP CurrentDirBufEnd+1 + 641 2376 90 08 BCC NoLastFileInDir + 642 2378 D0 55 BNE LastFilesPageJump + 643 237A A5 D0 LDA CurrentFileInfoBuff + 644 237C C5 CC CMP CurrentDirBufEnd + 645 237E B0 4F BCS LastFilesPageJump + 646 2380 NoLastFileInDir + 647 2380 A0 00 LDY #$00 + 648 2382 B1 D0 LDA (CurrentFileInfoBuff),Y + 649 2384 F0 49 BEQ LastFilesPageJump + 650 2386 A2 22 LDX #$22 + 651 2388 A9 20 LDA #$20 ; spacja + 652 238A label50 + 653 238A 9D 3B 24 STA GameName,X + 654 238D CA DEX + 655 238E 10 FA BPL label50 + 656 2390 A0 10 LDY #$10 + 657 2392 A2 0A LDX #$0A + 658 2394 label51 + 659 2394 B1 D0 LDA (CurrentFileInfoBuff),Y + 660 2396 9D 3B 24 STA GameName,X + 661 2399 88 DEY + 662 239A CA DEX + 663 239B 10 F7 BPL label51 + 664 239D A5 D9 LDA NamesOnScreen + 665 239F 18 CLC + 666 23A0 69 41 ADC #$41 ; literka "A" + 667 23A2 8D 38 24 STA GameKeySymbol + 668 23A5 A5 D8 LDA $D8 + 669 23A7 D0 2C BNE label52 + 670 23A9 A0 00 LDY #$00 + 671 ; status sprawdzanego pliku + 672 23AB B1 D0 LDA (CurrentFileInfoBuff),Y + 673 23AD 29 19 AND #$19 + 674 23AF C9 09 CMP #$09 + 675 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + 676 23B1 F0 08 BEQ label53 + 677 23B3 A6 D7 LDX $D7 + 678 23B5 F0 1B BEQ label54 + 679 23B7 C9 08 CMP #$08 + 680 23B9 D0 17 BNE label54 + 681 23BB label53 + 682 ; jeszcze raz status sprawdzanego pliku + 683 23BB B1 D0 LDA (CurrentFileInfoBuff),Y + 684 23BD 29 20 AND #$20 + 685 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + 686 23BF F0 0B BEQ label55 + 687 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + 688 23C1 A2 08 LDX #$08 + 689 23C3 label56 + 690 23C3 BD 4A 25 LDA SubDirText,X + 691 23C6 8D 47 24 STA GameName+12 + 692 23C9 CA DEX + 693 23CA 10 F7 BPL label56 + 694 23CC label55 + 695 23CC 4C 2B 24 JMP GameNamePrint + 696 23CF LastFilesPageJump + 697 23CF 4C D3 24 JMP LastFilesPage + 698 23D2 label54 + 699 23D2 4C 83 24 JMP label59 + 700 23D5 label52 + 701 23D5 A0 00 LDY #$00 + 702 23D7 B1 D0 LDA (CurrentFileInfoBuff),Y + 703 23D9 29 18 AND #$18 + 704 23DB C9 08 CMP #$08 + 705 23DD D0 F3 BNE label54 + 706 23DF A5 CC LDA CurrentDirBufEnd + 707 23E1 85 D4 STA $D4 + 708 23E3 A5 CD LDA CurrentDirBufEnd+1 + 709 23E5 85 D5 STA $D5 + 710 23E7 label65 + 711 23E7 A5 D5 LDA $D5 + 712 23E9 C5 CF CMP $CF + 713 23EB 90 08 BCC label60 + 714 23ED D0 E3 BNE label54 + 715 23EF A5 D4 LDA $D4 + 716 23F1 C5 CE CMP $CE + 717 23F3 B0 DD BCS label54 + 718 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy + 719 23F5 label60 + 720 23F5 A0 00 LDY #$00 + 721 23F7 B1 D4 LDA ($D4),Y + 722 23F9 C9 2A CMP #'*' + 723 23FB D0 06 BNE CompareNames + 724 23FD 8D 26 21 STA NewColors + 725 2400 20 5D 2B JSR Asteriks + 726 2403 CompareNames + 727 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT + 728 2403 A0 0A LDY #$0A ; 8+3 znaki + 729 2405 Checking62 + 730 2405 B1 D4 LDA ($D4),Y + 731 2407 D9 3B 24 CMP GameName,Y + 732 240A D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw + 733 240C 88 DEY + 734 240D 10 F6 BPL Checking62 + 735 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + 736 240F A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku + 737 2411 ReplacingName + 738 2411 B1 D4 LDA ($D4),Y + 739 2413 99 30 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania + 740 2416 C8 INY + 741 2417 C0 2E CPY #$2E + 742 2419 90 F6 BCC ReplacingName + 743 241B B0 0E BCS GameNamePrint + 744 241D CheckNextName + 745 241D A5 D4 LDA $D4 + 746 241F 18 CLC + 747 2420 69 2E ADC #$2E + 748 2422 85 D4 STA $D4 + 749 2424 90 02 BCC label64 + 750 2426 E6 D5 INC $D5 + 751 2428 label64 + 752 2428 4C E7 23 JMP label65 + 753 242B GameNamePrint + 754 242B A5 D9 LDA NamesOnScreen + 755 242D 18 CLC + 756 242E 69 02 ADC #$02 + 757 2430 8D 37 24 STA YposGameName + 758 2433 20 45 2A JSR PrintXY + 759 2436 01 .BY $01 + 760 2437 YposGameName + 761 2437 02 .BY $02 + 762 2438 GameKeySymbol + 763 2438 41 29 20 .BY "A) " + 764 243B GameName + 765 243B 20 20 20 20 20 20 + .BY " " + 766 245E 00 .BY $00 + 767 245F A5 D9 LDA NamesOnScreen + 768 2461 0A ASL + 769 2462 AA TAX + 770 2463 A5 D0 LDA CurrentFileInfoBuff + 771 2465 9D 2F 2C STA FirstSectorsTable,X + 772 2468 A5 D1 LDA CurrentFileInfoBuff+1 + 773 246A 9D 30 2C STA FirstSectorsTable+1,X + 774 246D A5 D0 LDA CurrentFileInfoBuff + 775 246F 18 CLC + 776 2470 69 17 ADC #$17 + 777 2472 85 D0 STA CurrentFileInfoBuff + 778 2474 90 02 BCC label66 + 779 2476 E6 D1 INC CurrentFileInfoBuff+1 + 780 2478 label66 + 781 2478 E6 D9 INC NamesOnScreen + 782 247A A5 D9 LDA NamesOnScreen + 783 247C C9 13 CMP #$13 + 784 247E B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + 785 2480 4C 72 23 JMP label68 + 786 2483 label59 + 787 2483 A5 D0 LDA CurrentFileInfoBuff + 788 2485 18 CLC + 789 2486 69 17 ADC #$17 + 790 2488 85 D0 STA CurrentFileInfoBuff + 791 248A 90 02 BCC label69 + 792 248C E6 D1 INC CurrentFileInfoBuff+1 + 793 248E label69 + 794 248E 4C 72 23 JMP label68 + 795 2491 MainDirKEY + 796 2491 4C D3 21 JMP ReadMainDir + 797 2494 UpDirKEY + 798 2494 A0 02 LDY #$02 + 799 2496 B1 CA LDA (CurrentDirBuf),Y + 800 2498 AA TAX + 801 2499 88 DEY + 802 249A 11 CA ORA (CurrentDirBuf),Y + 803 249C F0 37 BEQ KeyboardProc + 804 249E B1 CA LDA (CurrentDirBuf),Y + 805 24A0 A8 TAY + 806 24A1 4C 09 22 JMP ReadDIR + 807 24A4 EscKEY + 808 ; sprawdzmy czy z Shift + 809 24A4 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! + 810 24A7 29 08 and #$08 + 811 24A9 D0 06 BNE NoSHIFTEsc + 812 24AB 20 36 21 JSR EditorOpen + 813 24AE 6C 0A 00 JMP (DOSVEC) + 814 24B1 NoSHIFTEsc + 815 24B1 A2 00 LDX #$00 + 816 24B3 86 D8 STX $D8 + 817 24B5 E8 INX + 818 24B6 86 D7 STX $D7 + 819 24B8 ToStartOfDirJump + 820 24B8 4C BB 22 JMP ToStartOfDir + 821 24BB SpaceKEY + 822 24BB A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy + 823 24BD D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku + 824 24BF 4C CC 22 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej + 825 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie + 826 24C2 ContArrowsPrint + 827 24C2 20 45 2A JSR PrintXY + 828 24C5 01 15 .BY $01,$15 + 829 24C7 1D .BY $1D ; strzalka w dol + 830 24C8 00 .BY $00 + 831 24C9 20 45 2A JSR PrintXY + 832 24CC 0E 15 .BY $0E,$15 + 833 24CE 1D .BY $1D ; strzalka w dol + 834 24CF 00 .BY $00 + 835 24D0 4C D5 24 JMP KeyboardProc + 836 24D3 LastFilesPage + 837 24D3 E6 D6 INC LastFilesPageFlag + 838 24D5 KeyboardProc + 839 24D5 AD 26 21 LDA NewColors + 840 24D8 D0 0D BNE ColorsAlreadySet + 841 24DA A9 C4 LDA #$C4 ; ustawienie koloru tła i liter + 842 24DC 8D C6 02 STA COLPF2S + 843 24DF 8D C8 02 STA COLBAKS + 844 24E2 A9 CA LDA #$CA + 845 24E4 8D C5 02 STA COLPF1S + 846 24E7 ColorsAlreadySet + 847 24E7 20 FC 2A JSR GetKey + 848 24EA 29 7F AND #%01111111 ; eliminujemy invers + 849 24EC F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + 850 24EE C9 3E CMP #$3E ; ">" + 851 24F0 F0 9F BEQ MainDirKEY + 852 24F2 C9 3C CMP #$3C ; "<" + 853 24F4 F0 9E BEQ UpDirKEY + 854 24F6 C9 7E CMP #$7E ; BackSpace + 855 24F8 F0 9A BEQ UpDirKEY + 856 24FA C9 1B CMP #$1B ; Esc + 857 24FC F0 A6 BEQ EscKEY + 858 24FE C9 20 CMP #$20 ; Spacja + 859 2500 F0 B9 BEQ SpaceKEY + 860 ; ---------------- + 861 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + 862 2502 C9 10 CMP #$10 + 863 2504 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + 864 2506 20 AA 2B JSR SeTDriveLetter + 865 2509 4C 64 21 JMP mainprog + 866 250C noCtrlLetter + 867 ; sprawdzenie klawiszy 1-8 + 868 250C C9 31 CMP #'1' + 869 250E 90 0D BCC NoNumber + 870 2510 C9 39 CMP #'9' + 871 2512 B0 09 BCS NoNumber + 872 2514 38 SEC + 873 2515 E9 30 SBC #'0' + 874 2517 20 97 2B JSR SeTDriveNR + 875 251A 4C 64 21 JMP mainprog + 876 ; ----------------- + 877 251D NoNumber + 878 251D C9 61 CMP #'a' ; czy nie ma capsa + 879 251F 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany + 880 2521 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) + 881 2523 BigLetters + 882 2523 38 SEC + 883 2524 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy + 884 2526 C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie + 885 2528 B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz + 886 252A 0A ASL + 887 252B AA TAX + 888 252C BD 2F 2C LDA FirstSectorsTable,X + 889 252F 85 D4 STA $D4 + 890 2531 BD 30 2C LDA FirstSectorsTable+1,X + 891 2534 85 D5 STA $D5 + 892 2536 A0 00 LDY #$00 + 893 2538 B1 D4 LDA ($D4),Y + 894 253A 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik + 895 253C F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader + 896 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran + 897 253E A0 02 LDY #$02 + 898 2540 B1 D4 LDA ($D4),Y + 899 2542 AA TAX + 900 2543 88 DEY + 901 2544 B1 D4 LDA ($D4),Y + 902 2546 A8 TAY + 903 2547 4C 09 22 JMP ReadDIR + 904 254A SubDirText + 905 254A 3C 53 55 42 2D 44 + .BY "" + 906 2553 GOtoLoader + 907 2553 20 46 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 908 2556 F0 03 BEQ DiskNotChanged1 + 909 2558 4C D3 21 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego + 910 255B DiskNotChanged1 + 911 255B AD 25 21 LDA FolderTurbo + 912 255E F0 07 BEQ SetTurboOFF + 913 2560 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + 914 2563 29 08 and #$08 + 915 2565 D0 03 BNE NoSHIFT + 916 2567 SetTurboOFF + 917 2567 8D 21 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 + 918 256A NoSHIFT + 919 256A A0 01 LDY #$01 + 920 256C B1 D4 LDA ($D4),Y + 921 256E 8D D2 20 STA .adr loader.FirstMapSectorNr ; przed przepisaniem + 922 2571 8D 42 2A sta blokDanychIO+$A ; od razu do bloku IOCB + 923 2574 C8 INY + 924 2575 B1 D4 LDA ($D4),Y + 925 2577 8D D3 20 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + 926 257A 8D 43 2A sta blokDanychIO+$B ; od razu do bloku IOCB + 927 257D C8 INY + 928 257E B1 D4 LDA ($D4),Y + 929 2580 49 FF EOR #$FF + 930 2582 8D 20 21 STA .adr loader.tempToFileEndL + 931 2585 C8 INY + 932 2586 B1 D4 LDA ($D4),Y + 933 2588 49 FF EOR #$FF + 934 258A 8D E0 20 STA .adr loader.ToFileEndH ; przed przepisaniem + 935 258D C8 INY + 936 258E B1 D4 LDA ($D4),Y + 937 2590 49 FF EOR #$FF + 938 2592 8D E1 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem + 939 ; wszystko zapamietane mozna robic mape sektorow.... + 940 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu + 941 ; czyli DirSectorBuff + 942 ; sektor mapy przed kompresja leci do DirMapSectorBuff + 943 ; UWAGA + 944 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi + 945 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! + 946 = 2F80 CompressedMap = DirSectorBuff + 947 ; czytamy pierwszy sektor mapy + 948 2595 A0 80 LDY #DirMapSectorBuff + 950 2599 20 0A 2A Jsr ReadSector + 951 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! + 952 259C A9 00 LDA #00 + 953 259E 85 82 STA CompressedMapCounter + 954 25A0 85 83 STA CompressedMapCounter+1 + 955 25A2 20 6E 26 JSR AddToCompressedMAP + 956 25A5 AD 84 2D LDA DirMapSectorBuff+4 + 957 25A8 85 86 STA PrevFileSector + 958 25AA 20 6E 26 JSR AddToCompressedMAP + 959 25AD AD 85 2D LDA DirMapSectorBuff+5 + 960 25B0 85 87 sta PrevFileSector+1 + 961 25B2 20 6E 26 JSR AddToCompressedMAP + 962 ; Inicjujemy liczniki + 963 25B5 .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 + 964 25B5 .zpvar PrevFileSector, MapPositionMem .word + 965 25B5 .zpvar SectorOffset .word + 966 25B5 .zpvar SectorsCounter .byte + 967 25B5 A9 00 LDA #$00 + 968 25B7 85 81 STA MapCounter+1 + 969 25B9 85 8C STA SectorsCounter + 970 25BB A9 06 lda #$06 + 971 25BD 85 80 STA MapCounter + 972 25BF GenerateCompressedMap + 973 25BF 18 CLC + 974 25C0 A9 80 LDA #DirMapSectorBuff + 978 25C8 65 81 ADC MapCounter+1 + 979 25CA 85 89 STA MAPPositionMem+1 + 980 25CC A2 00 LDX #0 + 981 25CE A0 01 LDY #1 + 982 25D0 A1 88 LDA (MAPPositionMem,x) + 983 25D2 11 88 ORA (MAPPositionMem),y + 984 25D4 F0 56 BEQ Sector00 + 985 25D6 38 SEC + 986 25D7 A1 88 LDA (MAPPositionMem,x) + 987 25D9 E5 86 SBC PrevFileSector + 988 25DB 85 8A STA SectorOffset + 989 25DD B1 88 LDA (MAPPositionMem),y + 990 25DF E5 87 SBC PrevFileSector+1 + 991 25E1 85 8B STA SectorOffset+1 + 992 ; mamy odstep miedzy poprzednim a nastepnym sektorem + 993 25E3 D0 26 BNE OffsetToBig + 994 25E5 A5 8A LDA SectorOffset + 995 25E7 30 22 BMI OffsetToBig ; max przeskok 127 sektorow + 996 25E9 C9 01 CMP #$01 + 997 25EB D0 11 BNE JumpForward + 998 ; kolejny sektor + 999 ; zwiekszamy wiec licznik + 1000 25ED E6 8C inc SectorsCounter + 1001 25EF A5 8C LDA SectorsCounter + 1002 25F1 C9 7F CMP #%01111111 + 1003 25F3 D0 2C BNE GetNextMapWord + 1004 ; tu licznik dotarl do konca zerujemy go + 1005 ; dodajemy wpis do skompresowanej mapy i gotowe + 1006 25F5 20 6E 26 JSR AddToCompressedMAP + 1007 25F8 A9 00 LDA #0 + 1008 25FA 85 8C STA SectorsCounter + 1009 25FC F0 23 BEQ GetNextMapWord + 1010 ; ominiecie wyznaczonej ilości sektorów (w A) + 1011 25FE JumpForward + 1012 25FE 20 89 26 JSR FlushBuffer + 1013 2601 A5 8A LDA SectorOffset + 1014 2603 09 80 ORA #%10000000 + 1015 2605 20 6E 26 JSR AddToCompressedMAP + 1016 2608 4C 21 26 JMP GetNextMapWord + 1017 ; wyznaczenie skoku do nowego sektora pliku + 1018 260B OffsetToBig + 1019 260B 20 89 26 JSR FlushBuffer + 1020 260E A9 00 LDA #0 + 1021 2610 20 6E 26 JSR AddToCompressedMAP + 1022 2613 A0 00 LDY #00 + 1023 2615 B1 88 LDA (MAPPositionMem),y + 1024 2617 20 6E 26 JSR AddToCompressedMAP + 1025 261A A0 01 LDY #01 + 1026 261C B1 88 LDA (MAPPositionMem),y + 1027 261E 20 6E 26 JSR AddToCompressedMAP + 1028 2621 GetNextMapWord + 1029 ; zapamietanie numeru obecnego sektora do porownania potem + 1030 2621 A0 00 LDY #00 + 1031 2623 B1 88 LDA (MAPPositionMem),y + 1032 2625 85 86 STA PrevFileSector + 1033 2627 C8 INY + 1034 2628 B1 88 LDA (MAPPositionMem),y + 1035 262A 85 87 STA PrevFileSector+1 + 1036 262C Sector00 + 1037 262C 18 A5 80 69 02 85 + ADW MapCounter #2 + 1038 2637 ops01 + 1039 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala + 1040 2637 A5 81 LDA MapCounter+1 + 1041 2639 CD DD 20 CMP .adr loader.SecLen+1 + 1042 263C D0 05 bne noteqal01 + 1043 263E A5 80 LDA MapCounter + 1044 2640 CD DC 20 CMP .adr loader.SecLen + 1045 2643 noteqal01 + 1046 2643 F0 03 4C BF 25 JNE GenerateCompressedMap + 1047 ; czytamy nastepny sektor mapy + 1048 ; sprawdzmy czy nie koniec + 1049 2648 AD 80 2D LDA DirMapSectorBuff + 1050 264B 0D 81 2D ORA DirMapSectorBuff+1 + 1051 264E F0 45 BEQ EndMakingMap + 1052 2650 AD 80 2D LDA DirMapSectorBuff + 1053 2653 8D 42 2A sta blokDanychIO+$A + 1054 2656 AD 81 2D LDA DirMapSectorBuff+1 + 1055 2659 8D 43 2A sta blokDanychIO+$B + 1056 265C A0 80 LDY #DirMapSectorBuff + 1058 2660 20 0A 2A Jsr ReadSector + 1059 ; zerujemy licznik mapy + 1060 2663 A9 00 LDA #$00 + 1061 2665 85 81 STA MapCounter+1 + 1062 2667 A9 04 lda #$04 + 1063 2669 85 80 STA MapCounter + 1064 266B 4C BF 25 JMP GenerateCompressedMap + 1065 ; dpisanie bajtu z A do mapy sektorow skompresowanej + 1066 266E AddToCompressedMAP + 1067 266E 48 PHA + 1068 ; wyliczamy adresa + 1069 266F 18 CLC + 1070 2670 A5 82 LDA CompressedMapCounter + 1071 2672 69 80 ADC #CompressedMap + 1075 267B 8D 81 26 STA xxxxbla+1 + 1076 267E 68 PLA + 1077 = 2680 xxxxbla=*+1 + 1078 267F 8D FF FF STA $FFFF + 1079 2682 E6 82 INC CompressedMapCounter + 1080 2684 D0 02 BNE noinc013 + 1081 2686 E6 83 INC CompressedMapCounter+1 + 1082 2688 noinc013 + 1083 2688 60 RTS + 1084 2689 FlushBuffer + 1085 2689 A5 8C LDA SectorsCounter + 1086 268B F0 07 BEQ NoFlush + 1087 268D 20 6E 26 JSR AddToCompressedMAP + 1088 2690 A9 00 LDA #0 + 1089 2692 85 8C STA SectorsCounter + 1090 2694 NoFlush + 1091 2694 60 RTS + 1092 2695 EndMakingMap + 1093 2695 20 89 26 JSR FlushBuffer + 1094 2698 LoaderGo + 1095 2698 A0 00 LDY #$00 + 1096 269A 8C 44 02 STY COLDST + 1097 269D A9 01 LDA #$01 + 1098 269F 85 09 STA BOOT + 1099 26A1 AE 00 07 LDX $700 + 1100 26A4 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta + 1101 26A6 D0 03 BNE NoRunFromDOS + 1102 26A8 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! + 1103 ; STA $D5EC ; to wylacza SpartaDOS X + 1104 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) + 1105 26AB NoRunFromDOS + 1106 26AB A9 BC LDA #AfterWormStart + 1109 26B1 85 0D STA DOSINI+1 + 1110 ; LDA #>JRESETCD + 1111 ; STA DOSVEC+1 + 1112 ; LDA #TempMEMLO + 1133 26CF 6D DD 20 ADC .adr loader.SecLen+1 + 1134 26D2 8D E8 02 STA MEMLO+1 + 1135 26D5 85 3E STA CompressedMapPos+1 + 1136 ; STA pointerMov2b + 1137 ; STA APPMHI+1 + 1138 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora + 1139 ; jest to jednoczesnie adres umieszczenia skompresowanej + 1140 ; mapy sektorow pliku dla loadera ale MINUS 1 + 1141 26D7 A5 3D D0 02 C6 3E + DEW CompressedMapPos + 1142 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej + 1143 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) + 1144 26DF 18 CLC + 1145 26E0 AD E7 02 LDA MEMLO + 1146 ; ADC CompressedMapCounter + 1147 ; STA MEMLO + 1148 26E3 8D 94 27 STA TurboRelocADDR + 1149 26E6 AD E8 02 LDA MEMLO+1 + 1150 ; ADC CompressedMapCounter+1 + 1151 ; STA MEMLO+1 + 1152 26E9 8D 95 27 STA TurboRelocADDR+1 + 1153 26EC A9 71 LDA #JTESTROM + 1156 26F2 85 0D STA DOSINI+1 + 1157 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) + 1158 ; INC $033D ; bajty kontrolne zimnego startu + 1159 ; INC $033E ; zmiana ich wartosci wymusza + 1160 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) + 1161 26F4 A2 00 LDX #$00 + 1162 26F6 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) + 1163 ; STX BOOT + 1164 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci + 1165 26F8 moveloop1 + 1166 26F8 BD 00 20 LDA movedproc,X + 1167 26FB 9D 00 07 STA $0700,X + 1168 26FE BD 00 21 LDA movedproc+$0100,X + 1169 2701 9D 00 08 STA $0800,X + 1170 2704 E8 INX + 1171 2705 D0 F1 BNE moveloop1 + 1172 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora + 1173 /* moveloop2 + 1174 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy + 1175 pointerMov2a=*+2 + 1176 LDA CompressedMap,x ; kod samomodyfikujacy sie + 1177 pointerMov2b=*+2 + 1178 STA $FFFF,x ; kod samomodyfikujacy sie + 1179 LDA CompressedMapCounter + 1180 AND CompressedMapCounter+1 + 1181 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! + 1182 BEQ SectorMapReady + 1183 INX + 1184 BNE moveloop2 + 1185 inc pointerMov2a + 1186 inc pointerMov2b + 1187 bne moveloop2 + 1188 SectorMapReady + 1189 */ + 1189 + 1190 2707 20 56 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + 1191 270A 20 C6 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 1192 + 1193 270D A2 00 LDX #$00 + 1194 270F 8A TXA + 1195 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) + 1196 2710 ClearLoop1 + 1197 2710 9D 00 01 STA $0100,X ; STOS !!! + 1198 2713 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) + 1199 2716 9D 00 05 STA $0500,X + 1200 2719 9D 00 06 STA $0600,X + 1201 271C E0 80 CPX #$80 ;tylko ponad $80 + 1202 271E 90 02 BCC NoZpage + 1203 2720 95 00 STA $00,X ; czyli polowa strony zerowej + 1204 2722 NoZpage + 1205 2722 E8 INX + 1206 2723 D0 EB BNE ClearLoop1 + 1207 2725 A2 FF LDX #$FF + 1208 2727 9A TXS ; "wyzerowanie wskaznika STOSU + 1209 + 1210 ; a tutaj otwieramy kanal 1 CIO do odczytu + 1211 + 1212 2728 A2 10 LDX #16 ; kanal 1 + 1213 272A A9 03 LDA #COPN ; rozkaz OPEN + 1214 272C 9D 42 03 STA ICCOM,X ; COMMAND + 1215 272F A9 04 LDA #$04 ; READ + 1216 2731 9D 4A 03 STA ICAUX1,X + 1217 2734 A9 00 LDA #$00 + 1218 2736 9D 4B 03 STA ICAUX2,X + 1219 2739 A9 49 LDA # FileToOpen + 1222 2740 9D 45 03 STA ICBADR+1,X + 1223 2743 20 56 E4 JSR CIO + 1224 + 1225 2746 4C E6 07 JMP loader.LoadStart ; po przepisaniu + 1226 2749 FileToOpen + 1227 2749 48 3A 53 43 4F 52 + .BYTE 'H:SCORCH.XEX',0 + 1228 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba + 1229 ; na koniec odpowiednie zmodyfikowanie MEMLO + 1230 2756 ADDspeedProc + 1231 2756 AD 21 21 LDA USmode + 1232 2759 F0 5F beq NoHappyLoader + 1233 ; wyznaczamy offset procedury + 1234 275B 38 SEC + 1235 275C A9 BB LDA #HappyUSMovedProc + 1239 2766 ED E8 02 SBC MEMLO+1 + 1240 2769 8D 18 2C STA HappyOffset+1 + 1241 + 1242 276C A0 00 LDY #0 + 1243 276E A2 09 LDX #[$A-1] ;xjsrA - the last + 1244 ; relokujemy skoki pod offset z MEMLO + 1245 2770 HappyRelocate + 1246 2770 38 SEC + 1247 2771 BD 03 2C LDA xjsrTableL,x + 1248 2774 85 32 STA SecBuffer + 1249 2776 BD 0D 2C LDA xjsrTableH,x + 1250 2779 85 33 STA SecBuffer+1 + 1251 277B B1 32 LDA (SecBuffer),y + 1252 277D ED 17 2C SBC HappyOffset + 1253 2780 91 32 STA (SecBuffer),y + 1254 2782 C8 INY + 1255 2783 B1 32 LDA (SecBuffer),y + 1256 2785 ED 18 2C SBC HappyOffset+1 + 1257 2788 91 32 STA (SecBuffer),y + 1258 278A 88 DEY + 1259 278B CA DEX + 1260 278C 10 E2 BPL HappyRelocate + 1261 + 1262 278E A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] + 1263 2790 label72x + 1264 2790 BD BB 27 LDA HappyUSMovedProc,X + 1265 = 2794 TurboRelocADDR=*+1 + 1266 2793 9D 00 0A STA $0A00,X + 1267 2796 CA DEX + 1268 2797 E0 FF CPX #$FF + 1269 2799 D0 F5 BNE label72x + 1270 279B A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] + 1271 279D A2 00 LDX #$00 + 1272 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. + 1273 279F label73 + 1274 279F 98 TYA + 1275 27A0 18 CLC + 1276 27A1 6D E7 02 ADC MEMLO + 1277 27A4 8D E7 02 STA MEMLO + 1278 27A7 8A TXA + 1279 27A8 6D E8 02 ADC MEMLO+1 + 1280 27AB 8D E8 02 STA MEMLO+1 + 1281 27AE AD 94 27 LDA TurboRelocADDR + 1282 27B1 8D E3 07 STA loader.SioJMP+1 ; po przepisaniu + 1283 27B4 AD 95 27 LDA TurboRelocADDR+1 + 1284 27B7 8D E4 07 STA loader.SioJMP+2 ; po przepisaniu + 1285 27BA NoHappyLoader + 1286 27BA 60 RTS + 1287 + 1288 + 1289 + 1290 ; UWAGA !!!!!!!!!!!!!! + 1291 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! + 1292 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone + 1293 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! + 1294 27BB HappyUSMovedProc ; + 1295 + 1296 27BB AD 04 03 LDA DBUFA + 1297 27BE 85 32 STA SecBuffer + 1298 27C0 AD 05 03 LDA DBUFA+1 + 1299 27C3 85 33 STA SecBuffer+1 + 1300 + 1301 27C5 AD 08 03 LDA DBYT + 1302 27C8 85 31 STA SecLenUS + 1303 + 1304 27CA 78 SEI + 1305 27CB BA TSX + 1306 27CC 86 37 STX StackCopy + 1307 27CE A9 0D LDA #$0D + 1308 27D0 85 34 STA CRETRYZ + 1309 ;command retry on zero page + 1310 27D2 CommandLoop + 1311 = 27D3 HappySpeed = *+1 + 1312 27D2 A9 28 LDA #$28 ;here goes speed from "?" + 1313 27D4 8D 04 D2 STA AUDF3 + 1314 27D7 A9 34 LDA #$34 + 1315 27D9 8D 03 D3 STA PBCTL ;ustawienie linii command + 1316 27DC A2 80 LDX #$80 + 1317 27DE DelayLoopCmd + 1318 27DE CA DEX + 1319 27DF D0 FD BNE DelayLoopCmd + 1320 27E1 8E 06 D2 STX AUDF4 ; zero + 1321 27E4 86 35 STX TransmitError + 1322 ; pokey init + 1323 27E6 A9 23 LDA #$23 + 1324 27E8 20 5C 28 xjsr1 JSR SecTransReg + 1325 ; + 1326 + 1327 27EB 18 CLC + 1328 27EC AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + 1329 27EF 6D 01 03 ADC DUNIT ; dodajemy numer stacji + 1330 27F2 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + 1331 27F4 85 30 STA CheckSum + 1332 27F6 8D 0D D2 STA SEROUT + 1333 27F9 AD 02 03 LDA DCOMND + 1334 27FC 20 72 28 xjsr2 JSR PutSIOByte + 1335 27FF AD 0A 03 LDA DAUX1 + 1336 2802 20 72 28 xjsr3 JSR PutSIOByte + 1337 2805 AD 0B 03 LDA DAUX2 + 1338 2808 20 72 28 xjsr4 JSR PutSIOByte + 1339 280B A5 30 LDA CheckSum + 1340 280D 20 72 28 xjsr5 JSR PutSIOByte + 1341 + 1342 2810 waitforEndOftransmission + 1343 2810 AD 0E D2 LDA IRQST + 1344 2813 29 08 AND #$08 + 1345 2815 D0 F9 BNE waitforEndOftransmission + 1346 + 1347 2817 A9 13 LDA #$13 + 1348 2819 20 5C 28 xjsr6 JSR SecTransReg + 1349 + 1350 281C A9 3C LDA #$3c + 1351 281E 8D 03 D3 STA PBCTL ;command line off + 1352 ; two ACK's + 1353 2821 A0 02 LDY #2 + 1354 2823 DoubleACK + 1355 2823 20 8E 28 xjsr7 JSR GetSIOByte + 1356 2826 C9 44 CMP #$44 + 1357 2828 B0 19 BCS ErrorHere + 1358 282A 88 DEY + 1359 282B D0 F6 BNE DoubleACK + 1360 + 1361 ;ldy #0 + 1362 282D 84 30 STY CheckSum + 1363 282F ReadSectorLoop + 1364 282F 20 8E 28 xjsr8 JSR GetSIOByte + 1365 2832 91 32 STA (SecBuffer),y + 1366 2834 20 86 28 xjsr9 JSR AddCheckSum + 1367 2837 C8 INY + 1368 2838 C4 31 CPY SecLenUS + 1369 283A D0 F3 BNE ReadSectorLoop 1370 - 1371 ;ldy #0 - 1372 2815 84 30 STY CheckSum - 1373 2817 ReadSectorLoop - 1374 2817 20 76 28 xjsr8 JSR GetSIOByte - 1375 281A 91 32 STA (SecBuffer),y - 1376 281C 20 6E 28 xjsr9 JSR AddCheckSum - 1377 281F C8 INY - 1378 2820 C4 31 CPY SecLenUS - 1379 2822 D0 F3 BNE ReadSectorLoop - 1380 - 1381 2824 20 76 28 xjsrA JSR GetSIOByte - 1382 2827 C5 30 CMP CheckSum - 1383 2829 F0 0B BEQ EndOfTransmission - 1384 ;error!!! - 1385 282B ErrorHere - 1386 282B A0 90 LDY #$90 - 1387 282D 84 35 STY TransmitError - 1388 282F A6 37 LDX StackCopy - 1389 2831 9A TXS - 1390 2832 C6 34 DEC CRETRYZ - 1391 2834 D0 84 BNE CommandLoop - 1392 - 1393 2836 EndOfTransmission - 1394 2836 A9 00 LDA #0 - 1395 2838 8D 07 D2 STA AUDC4 - 1396 283B A5 10 LDA IRQENS - 1397 283D 8D 0E D2 STA IRQEN - 1398 2840 58 CLI - 1399 2841 A4 35 LDY TransmitError - 1400 2843 60 RTS - 1401 - 1402 2844 SecTransReg - 1403 2844 8D 0F D2 STA SKCTL - 1404 2847 8D 0A D2 STA SKSTRES - 1405 284A A9 38 LDA #$38 - 1406 284C 8D 0E D2 STA IRQEN - 1407 284F A9 28 LDA #$28 - 1408 2851 8D 08 D2 STA AUDCTL - 1409 2854 A9 A8 LDA #$A8 - 1410 2856 8D 07 D2 STA AUDC4 - 1411 2859 60 RTS - 1412 - 1413 285A PutSIOByte - 1414 285A AA TAX - 1415 285B waitforSerial - 1416 285B AD 0E D2 LDA IRQST - 1417 285E 29 10 AND #$10 - 1418 2860 D0 F9 BNE waitforSerial - 1419 - 1420 2862 8D 0E D2 STA IRQEN - 1421 2865 A9 10 LDA #$10 - 1422 2867 8D 0E D2 STA IRQEN + 1371 283C 20 8E 28 xjsrA JSR GetSIOByte + 1372 283F C5 30 CMP CheckSum + 1373 2841 F0 0B BEQ EndOfTransmission + 1374 ;error!!! + 1375 2843 ErrorHere + 1376 2843 A0 90 LDY #$90 + 1377 2845 84 35 STY TransmitError + 1378 2847 A6 37 LDX StackCopy + 1379 2849 9A TXS + 1380 284A C6 34 DEC CRETRYZ + 1381 284C D0 84 BNE CommandLoop + 1382 + 1383 284E EndOfTransmission + 1384 284E A9 00 LDA #0 + 1385 2850 8D 07 D2 STA AUDC4 + 1386 2853 A5 10 LDA IRQENS + 1387 2855 8D 0E D2 STA IRQEN + 1388 2858 58 CLI + 1389 2859 A4 35 LDY TransmitError + 1390 285B 60 RTS + 1391 + 1392 285C SecTransReg + 1393 285C 8D 0F D2 STA SKCTL + 1394 285F 8D 0A D2 STA SKSTRES + 1395 2862 A9 38 LDA #$38 + 1396 2864 8D 0E D2 STA IRQEN + 1397 2867 A9 28 LDA #$28 + 1398 2869 8D 08 D2 STA AUDCTL + 1399 286C A9 A8 LDA #$A8 + 1400 286E 8D 07 D2 STA AUDC4 + 1401 2871 60 RTS + 1402 + 1403 2872 PutSIOByte + 1404 2872 AA TAX + 1405 2873 waitforSerial + 1406 2873 AD 0E D2 LDA IRQST + 1407 2876 29 10 AND #$10 + 1408 2878 D0 F9 BNE waitforSerial + 1409 + 1410 287A 8D 0E D2 STA IRQEN + 1411 287D A9 10 LDA #$10 + 1412 287F 8D 0E D2 STA IRQEN + 1413 + 1414 2882 8A TXA + 1415 2883 8D 0D D2 STA SEROUT + 1416 + 1417 2886 AddCheckSum + 1418 2886 18 CLC + 1419 2887 65 30 ADC CheckSum + 1420 2889 69 00 ADC #0 + 1421 288B 85 30 STA CheckSum + 1422 288D 60 RTS 1423 - 1424 286A 8A TXA - 1425 286B 8D 0D D2 STA SEROUT - 1426 - 1427 286E AddCheckSum - 1428 286E 18 CLC - 1429 286F 65 30 ADC CheckSum - 1430 2871 69 00 ADC #0 - 1431 2873 85 30 STA CheckSum - 1432 2875 60 RTS - 1433 - 1434 2876 GetSIOByte - 1435 2876 A2 0A LDX #10 ;acktimeout - 1436 2878 ExternalLoop - 1437 2878 A9 00 LDA #0 - 1438 287A 85 36 STA looperka - 1439 287C InternalLoop - 1440 287C AD 0E D2 LDA IRQST - 1441 287F 29 20 AND #$20 - 1442 2881 F0 09 BEQ ACKReceive - 1443 2883 C6 36 DEC looperka - 1444 2885 D0 F5 BNE InternalLoop - 1445 2887 CA DEX - 1446 2888 D0 EE BNE ExternalLoop - 1447 288A F0 9F BEQ ErrorHere - 1448 288C ACKReceive - 1449 ; zero we have now - 1450 288C 8D 0E D2 STA IRQST - 1451 288F A9 20 LDA #$20 - 1452 2891 8D 0E D2 STA IRQST - 1453 2894 AD 0F D2 LDA SKSTAT - 1454 2897 8D 0A D2 STA SKSTRES - 1455 289A 29 20 AND #$20 - 1456 289C F0 8D BEQ ErrorHere - 1457 ; - 1458 289E AD 0D D2 LDA SERIN - 1459 28A1 60 RTS - 1460 28A2 EndHappyUSProc - 1461 - 1462 - 1463 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler - 1464 28A2 blokDanychIO_GetUSSpeed - 1465 28A2 31 01 3F 40 .BY $31,$01,"?",$40 - 1466 28A6 BB 27 .WO HappySpeed - 1467 28A8 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A - 1468 28AE DirMapEnd - 1469 28AE 4C 7A 29 JMP label75 - 1470 28B1 label39 - 1471 28B1 85 DA STA $DA - 1472 28B3 A5 D0 LDA CurrentFileInfoBuff - 1473 28B5 85 DB STA $DB - 1474 28B7 A5 D1 LDA CurrentFileInfoBuff+1 - 1475 28B9 85 DC STA $DC - 1476 28BB 20 2E 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka - 1477 28BE F0 05 BEQ DiscNotChanged2 - 1478 28C0 68 PLA - 1479 28C1 68 PLA - 1480 28C2 4C BB 21 JMP ReadMainDir - 1481 28C5 DiscNotChanged2 - 1482 ; odczyt sektora mapy wskazywanego przez DirMapSec - 1483 28C5 A5 D2 LDA DirMapSect - 1484 28C7 8D 2A 2A STA blokDanychIO+10 - 1485 28CA A5 D3 LDA DirMapSect+1 - 1486 28CC 8D 2B 2A STA blokDanychIO+11 - 1487 28CF 0D 2A 2A ORA blokDanychIO+10 - 1488 28D2 F0 DA BEQ DirMapEnd - 1489 28D4 A2 2D LDX #>DirMapSectorBuff - 1490 28D6 A0 80 LDY #DirMapSectorBuff ; -- - 1516 2902 65 E3 ADC InMapPointer+1 ; -- - 1517 2904 85 E5 STA TempZP+1 ; -- - 1518 2906 B1 E4 LDA (TempZP),Y - 1519 2908 8D 2A 2A STA blokDanychIO+10 - 1520 290B C8 INY - 1521 290C B1 E4 LDA (TempZP),Y - 1522 290E 8D 2B 2A STA blokDanychIO+11 - 1523 2911 0D 2A 2A ORA blokDanychIO+10 - 1524 2914 F0 64 BEQ label75 - 1525 ; i zwiekszenie wskaznika mapy o 2 - 1526 2916 C8 INY - 1527 2917 84 E2 STY InMapPointer - 1528 2919 D0 02 BNE NoIncH ; -- - 1529 291B E6 E3 INC InMapPointer+1 ; -- - 1530 291D NoIncH - 1531 291D AD E5 02 LDA MEMTOP - 1532 2920 38 SEC - 1533 2921 E5 D0 SBC CurrentFileInfoBuff - 1534 2923 AD E6 02 LDA MEMTOP+1 - 1535 2926 E5 D1 SBC CurrentFileInfoBuff+1 - 1536 2928 F0 50 BEQ label75 - 1537 292A A4 D0 LDY CurrentFileInfoBuff - 1538 292C A6 D1 LDX CurrentFileInfoBuff+1 - 1539 292E 20 F2 29 JSR ReadSector - 1540 2931 A5 D4 LDA $D4 - 1541 2933 05 D5 ORA $D5 - 1542 2935 D0 16 BNE label79 - 1543 2937 A0 03 LDY #$03 - 1544 2939 B1 D0 LDA (CurrentFileInfoBuff),Y - 1545 293B 85 D4 STA $D4 - 1546 293D C8 INY - 1547 293E B1 D0 LDA (CurrentFileInfoBuff),Y - 1548 2940 85 D5 STA $D5 - 1549 2942 C8 INY - 1550 2943 B1 D0 LDA (CurrentFileInfoBuff),Y - 1551 2945 F0 06 BEQ label79 - 1552 2947 A9 FF LDA #$FF - 1553 2949 85 D4 STA $D4 - 1554 294B 85 D5 STA $D5 - 1555 294D label79 - 1556 294D A5 D0 LDA CurrentFileInfoBuff - 1557 294F 18 CLC - 1558 2950 6D 89 20 ADC .adr loader.SecLen ; przed przepisaniem - 1559 2953 85 D0 STA CurrentFileInfoBuff - 1560 2955 A5 D1 LDA CurrentFileInfoBuff+1 - 1561 2957 6D 8A 20 ADC .adr loader.SecLen+1 ; przed przepisaniem - 1562 295A 85 D1 STA CurrentFileInfoBuff+1 - 1563 295C A5 D4 LDA $D4 - 1564 295E 38 SEC - 1565 295F ED 89 20 SBC .adr loader.SecLen ; przed przepisaniem - 1566 2962 85 D4 STA $D4 - 1567 2964 A5 D5 LDA $D5 - 1568 2966 ED 8A 20 SBC .adr loader.SecLen+1 ; przed przepisaniem - 1569 2969 85 D5 STA $D5 - 1570 296B B0 80 BCS label80 - 1571 296D A5 D0 LDA CurrentFileInfoBuff - 1572 296F 18 CLC - 1573 2970 65 D4 ADC $D4 - 1574 2972 85 D0 STA CurrentFileInfoBuff - 1575 2974 A5 D1 LDA CurrentFileInfoBuff+1 - 1576 2976 65 D5 ADC $D5 - 1577 2978 85 D1 STA CurrentFileInfoBuff+1 - 1578 297A label75 - 1579 297A A5 DC LDA $DC - 1580 297C C5 D1 CMP CurrentFileInfoBuff+1 - 1581 297E 90 0B BCC label81 - 1582 2980 D0 17 BNE label82 - 1583 2982 A5 DB LDA $DB - 1584 2984 C5 D0 CMP CurrentFileInfoBuff - 1585 2986 90 03 BCC label81 - 1586 2988 D0 0F BNE label82 - 1587 298A 60 RTS - 1588 298B label81 - 1589 298B A5 DB LDA $DB - 1590 298D 18 CLC - 1591 298E 65 DA ADC $DA - 1592 2990 85 DB STA $DB - 1593 2992 90 E6 BCC label75 - 1594 2994 E6 DC INC $DC - 1595 2996 4C 7A 29 JMP label75 - 1596 2999 label82 - 1597 2999 A5 DB LDA $DB - 1598 299B 38 SEC - 1599 299C E5 DA SBC $DA - 1600 299E 85 D0 STA CurrentFileInfoBuff - 1601 29A0 A5 DC LDA $DC - 1602 29A2 E9 00 SBC #$00 - 1603 29A4 85 D1 STA CurrentFileInfoBuff+1 - 1604 29A6 60 RTS - 1605 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora - 1606 29A7 ReadPERCOM - 1607 29A7 A9 04 LDA #$04 - 1608 29A9 8D 2C 2A STA DiskRetryCount - 1609 29AC ReadPERCOMretry - 1610 29AC A0 D0 LDY #blokDanychIO_PERCOM - 1612 29B0 20 C8 2A JSR Table2DCB - 1613 29B3 20 BD 2A JSR GoSIO - 1614 29B6 30 08 BMI PercomError - 1615 ; blok odczytany - ustawmy dlugosc 1 sektora - 1616 29B8 AD 11 2C LDA PERCOMdata+6 - 1617 29BB C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 - 1618 29BD F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest - 1619 29BF 60 RTS - 1620 29C0 PercomError - 1621 29C0 CE 2C 2A DEC DiskRetryCount - 1622 29C3 D0 E7 BNE ReadPERCOMretry - 1623 ; blok nieodczytany - dlugosc 1 sektora na $80 - 1624 29C5 Set1Sect128 - 1625 29C5 A9 00 LDA #$00 - 1626 29C7 8D 11 2C STA PERCOMdata+6 - 1627 29CA A9 80 LDA #$80 - 1628 29CC 8D 12 2C STA PERCOMdata+7 - 1629 29CF 60 RTS - 1630 29D0 blokDanychIO_PERCOM - 1631 29D0 31 01 4E 40 .BY $31,$01,$4E,$40 - 1632 29D4 0B 2C .WO PERCOMdata - 1633 29D6 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 - 1634 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) - 1635 29DC ReadFirstSect - 1636 29DC A9 01 LDA #$01 - 1637 29DE 8D 2A 2A STA blokDanychIO+10 - 1638 29E1 A9 00 LDA #$00 - 1639 29E3 8D 2B 2A STA blokDanychIO+11 - 1640 29E6 AD 11 2C LDA PERCOMdata+6 - 1641 29E9 8D 29 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b - 1642 29EC AD 12 2C LDA PERCOMdata+7 - 1643 29EF 4C FB 29 JMP ReadSector1 - 1644 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) - 1645 ; reszta danych jak nizej (A nie wazne) - 1646 29F2 ReadSector - 1647 29F2 AD 8A 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b - 1648 29F5 8D 29 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b - 1649 29F8 AD 89 20 LDA .adr loader.SecLen ; przed przepisaniem - 1650 29FB ReadSector1 - 1651 29FB 8D 28 2A STA blokDanychIO+8 - 1652 29FE 8E 25 2A STX blokDanychIO+5 - 1653 2A01 8C 24 2A STY blokDanychIO+4 - 1654 2A04 A9 04 LDA #$04 - 1655 2A06 8D 2C 2A STA DiskRetryCount - 1656 2A09 DiskReadRetry - 1657 2A09 A0 20 LDY #blokDanychIO - 1659 2A0D 20 C8 2A JSR Table2DCB - 1660 2A10 20 BD 2A JSR GoSIO - 1661 2A13 30 01 BMI label85 - 1662 2A15 60 RTS - 1663 2A16 label85 - 1664 2A16 CE 2C 2A DEC DiskRetryCount - 1665 2A19 D0 EE BNE DiskReadRetry - 1666 2A1B 68 PLA - 1667 2A1C 68 PLA - 1668 2A1D 4C 7A 21 JMP ErrorDisplay - 1669 2A20 blokDanychIO - 1670 2A20 31 01 52 40 .BY $31,$01,$52,$40 - 1671 2A24 80 2D .WO DirMapSectorBuff - 1672 2A26 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 - 1673 2A2C DiskRetryCount - 1674 2A2C 00 .BY $00 - 1675 2A2D PrintXY - 1676 2A2D 68 PLA - 1677 2A2E 85 C8 STA $C8 - 1678 2A30 68 PLA - 1679 2A31 85 C9 STA $C9 - 1680 2A33 A9 00 LDA #$00 - 1681 2A35 85 DF STA $DF - 1682 2A37 20 AF 2A JSR label87 - 1683 2A3A 48 PHA - 1684 2A3B 20 AF 2A JSR label87 - 1685 2A3E 85 DE STA $DE - 1686 2A40 0A ASL - 1687 2A41 0A ASL - 1688 2A42 18 CLC - 1689 2A43 65 DE ADC $DE - 1690 2A45 0A ASL - 1691 2A46 0A ASL - 1692 2A47 26 DF ROL $DF - 1693 2A49 0A ASL - 1694 2A4A 26 DF ROL $DF - 1695 2A4C 18 CLC - 1696 2A4D 65 58 ADC SAVMSC - 1697 2A4F 85 DE STA $DE - 1698 2A51 A5 DF LDA $DF - 1699 2A53 65 59 ADC SAVMSC+1 - 1700 2A55 85 DF STA $DF - 1701 2A57 68 PLA - 1702 2A58 A8 TAY - 1703 2A59 label92 - 1704 2A59 20 AF 2A JSR label87 - 1705 2A5C C9 00 CMP #$00 - 1706 2A5E F0 48 BEQ label88 - 1707 2A60 C9 7D CMP #$7D - 1708 2A62 F0 21 BEQ label89 - 1709 2A64 A2 00 LDX #$00 - 1710 2A66 86 E0 STX $E0 - 1711 2A68 C9 80 CMP #$80 - 1712 2A6A 66 E0 ROR $E0 - 1713 2A6C 29 7F AND #$7F - 1714 2A6E C9 20 CMP #$20 - 1715 2A70 B0 04 BCS label90 - 1716 2A72 09 40 ORA #$40 - 1717 2A74 D0 07 BNE label91 - 1718 2A76 label90 - 1719 2A76 C9 60 CMP #$60 - 1720 2A78 B0 03 BCS label91 - 1721 2A7A 38 SEC - 1722 2A7B E9 20 SBC #$20 - 1723 2A7D label91 - 1724 2A7D 05 E0 ORA $E0 - 1725 2A7F 91 DE STA ($DE),Y - 1726 2A81 C8 INY - 1727 2A82 4C 59 2A JMP label92 - 1728 2A85 label89 - 1729 2A85 98 TYA - 1730 2A86 48 PHA - 1731 2A87 A5 58 LDA SAVMSC - 1732 2A89 85 E0 STA $E0 - 1733 2A8B A9 03 LDA #$03 - 1734 2A8D AA TAX - 1735 2A8E 18 CLC - 1736 2A8F 65 59 ADC SAVMSC+1 - 1737 2A91 85 E1 STA $E1 - 1738 2A93 A0 BF LDY #$BF - 1739 2A95 A9 00 LDA #$00 - 1740 2A97 label93 - 1741 2A97 91 E0 STA ($E0),Y - 1742 2A99 88 DEY - 1743 2A9A C0 FF CPY #$FF - 1744 2A9C D0 F9 BNE label93 - 1745 2A9E C6 E1 DEC $E1 - 1746 2AA0 CA DEX - 1747 2AA1 10 F4 BPL label93 - 1748 2AA3 68 PLA - 1749 2AA4 A8 TAY - 1750 2AA5 4C 59 2A JMP label92 - 1751 2AA8 label88 - 1752 2AA8 A5 C9 LDA $C9 - 1753 2AAA 48 PHA - 1754 2AAB A5 C8 LDA $C8 - 1755 2AAD 48 PHA - 1756 2AAE 60 RTS - 1757 2AAF label87 - 1758 2AAF E6 C8 INC $C8 - 1759 2AB1 D0 02 BNE label94 - 1760 2AB3 E6 C9 INC $C9 - 1761 2AB5 label94 - 1762 2AB5 A2 00 LDX #$00 - 1763 2AB7 A1 C8 LDA ($C8,X) - 1764 2AB9 60 RTS - 1765 2ABA GoErrorDisp - 1766 2ABA 4C 7A 21 JMP ErrorDisplay - 1767 ; Skok do Sio lub procedury Turbo - 1768 2ABD GoSIO - 1769 2ABD AC 09 21 LDY USmode - 1770 2AC0 F0 03 BEQ StandardSpeed - 1771 2AC2 4C A3 27 JMP HappyUSMovedProc ; mozna skakac do tej procki - 1772 2AC5 StandardSpeed - 1773 2AC5 4C 59 E4 JMP JSIOINT - 1774 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) - 1775 ; do bloku kontroli transmisji szeregowej DCB - 1776 2AC8 Table2DCB - 1777 2AC8 8C D1 2A STY IOtableAddr+1 - 1778 2ACB 8E D2 2A STX IOtableAddr+2 - 1779 2ACE A2 0B LDX #$0B - 1780 2AD0 IOtableAddr - 1781 2AD0 BD FF FF LDA $FFFF,X - 1782 2AD3 9D 00 03 STA DDEVIC,X - 1783 2AD6 CA DEX - 1784 2AD7 10 F7 BPL IOtableAddr - 1785 2AD9 60 RTS - 1786 2ADA Close1 - 1787 2ADA A2 10 LDX #$10 - 1788 2ADC CloseX - 1789 2ADC A9 0C LDA #$0C - 1790 2ADE 9D 42 03 STA ICCMD,X - 1791 2AE1 4C 56 E4 JMP JCIOMAIN - 1792 2AE4 GetKey - 1793 2AE4 A2 10 LDX #$10 - 1794 2AE6 A9 03 LDA #$03 - 1795 2AE8 9D 42 03 STA ICCMD,X - 1796 2AEB A9 04 LDA #$04 - 1797 2AED 9D 4A 03 STA ICAX1,X - 1798 2AF0 A9 00 LDA #$00 - 1799 2AF2 9D 4B 03 STA ICAX2,X - 1800 2AF5 9D 49 03 STA ICBUFL+1,X - 1801 2AF8 A9 FF LDA #$FF - 1802 2AFA 9D 48 03 STA ICBUFL,X - 1803 2AFD A9 2B LDA #Kdriver - 1806 2B04 9D 45 03 STA ICBUFA+1,X - 1807 2B07 20 56 E4 JSR JCIOMAIN - 1808 2B0A 30 1C BMI GKeyError - 1809 2B0C A2 10 LDX #$10 - 1810 2B0E A9 00 LDA #$00 - 1811 2B10 9D 48 03 STA ICBUFL,X - 1812 2B13 9D 49 03 STA ICBUFL+1,X - 1813 2B16 A9 07 LDA #$07 - 1814 2B18 9D 42 03 STA ICCMD,X - 1815 2B1B 20 56 E4 JSR JCIOMAIN - 1816 2B1E 30 08 BMI GKeyError - 1817 2B20 48 PHA - 1818 2B21 20 DA 2A JSR Close1 - 1819 2B24 30 02 BMI GKeyError - 1820 2B26 68 PLA - 1821 2B27 60 RTS - 1822 2B28 GKeyError - 1823 2B28 4C BA 2A JMP GoErrorDisp - 1824 2B2B Kdriver - 1825 2B2B 4B 3A 9B .BY "K:",$9B - 1826 2B2E DiscChangeCheck - 1827 2B2E A0 80 LDY #DirMapSectorBuff - 1829 2B32 20 DC 29 JSR ReadFirstSect - 1830 2B35 A2 7F LDX #$7F - 1831 2B37 label98 - 1832 2B37 BD 00 2D LDA FirstSectorBuff,X - 1833 2B3A DD 80 2D CMP DirMapSectorBuff,X - 1834 2B3D D0 05 BNE ChangedD - 1835 2B3F CA DEX - 1836 2B40 10 F5 BPL label98 - 1837 2B42 A9 00 LDA #$00 - 1838 2B44 ChangedD - 1839 2B44 60 RTS - 1840 ; obsluga gwiazdki - 1841 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * - 1842 ; w Y jest ) - X moze lepiej nie ruszac :) - 1843 2B45 Asteriks - 1844 2B45 A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) - 1845 2B47 20 63 2B JSR GetHexNumber - 1846 2B4A 8D C5 02 STA COLPF1S ; literki - 1847 2B4D C8 INY - 1848 2B4E 20 63 2B JSR GetHexNumber - 1849 2B51 8D C6 02 STA COLPF2S ; tlo - 1850 2B54 C8 INY - 1851 2B55 20 63 2B JSR GetHexNumber - 1852 2B58 8D C8 02 STA COLBAKS ; ramka - 1853 2B5B C8 INY - 1854 2B5C 20 63 2B JSR GetHexNumber - 1855 2B5F 8D 0D 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) - 1856 2B62 60 RTS - 1857 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX - 1858 ; i zamienia na bajt w A - 1859 2B63 GetHexNumber - 1860 2B63 20 73 2B JSR GetHEX4bits - 1861 2B66 0A ASL - 1862 2B67 0A ASL - 1863 2B68 0A ASL - 1864 2B69 0A ASL - 1865 2B6A 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. - 1866 2B6C C8 INY - 1867 2B6D 20 73 2B JSR GetHEX4bits - 1868 2B70 05 E4 ORA TempZP - 1869 2B72 60 RTS - 1870 2B73 GetHEX4bits - 1871 2B73 B1 D4 LDA ($D4),Y - 1872 2B75 38 SEC - 1873 2B76 E9 30 SBC #'0' - 1874 2B78 C9 0A CMP #$0A ; sprawdzmy czy cyfra - 1875 2B7A 90 02 BCC IsNumber - 1876 2B7C E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow - 1877 2B7E IsNumber - 1878 2B7E 60 RTS - 1879 ; Ustawia numer satcji wg A - 1880 2B7F SeTDriveNR - 1881 2B7F C9 09 CMP #$09 - 1882 2B81 B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry - 1883 2B83 20 A1 2B JSR SeTblokDanychDrive - 1884 2B86 18 CLC - 1885 2B87 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 - 1886 2B89 8D BC 22 STA DriveDisp1 - 1887 2B8C A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu - 1888 2B8E 8D BB 22 STA DriveDisp1-1 - 1889 2B91 60 RTS - 1890 2B92 SeTDriveLetter - 1891 2B92 20 A1 2B JSR SeTblokDanychDrive - 1892 2B95 18 CLC - 1893 2B96 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu - 1894 2B98 8D BC 22 STA DriveDisp1 - 1895 2B9B A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja - 1896 2B9D 8D BB 22 STA DriveDisp1-1 - 1897 2BA0 60 RTS - 1898 2BA1 SeTblokDanychDrive - 1899 2BA1 8D 82 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem - 1900 2BA4 8D 21 2A STA blokDanychIO+1 - 1901 2BA7 8D A3 28 STA blokDanychIO_GetUSSpeed+1 - 1902 2BAA 8D D1 29 STA blokDanychIO_PERCOM+1 - 1903 2BAD 60 RTS - 1904 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku - 1905 2BAE MEMLOprint - 1906 2BAE AD E7 02 LDA MEMLO - 1907 2BB1 48 PHA - 1908 2BB2 4A LSR - 1909 2BB3 4A LSR - 1910 2BB4 4A LSR - 1911 2BB5 4A LSR - 1912 2BB6 20 0F 21 JSR bin2AsciiHex - 1913 2BB9 8D E7 2B STA MEMLOvalue+2 - 1914 2BBC 68 PLA - 1915 2BBD 20 0F 21 JSR bin2AsciiHex - 1916 2BC0 8D E8 2B STA MEMLOvalue+3 - 1917 2BC3 AD E8 02 LDA MEMLO+1 - 1918 2BC6 48 PHA - 1919 2BC7 4A LSR - 1920 2BC8 4A LSR - 1921 2BC9 4A LSR - 1922 2BCA 4A LSR - 1923 2BCB 20 0F 21 JSR bin2AsciiHex - 1924 2BCE 8D E5 2B STA MEMLOvalue - 1925 2BD1 68 PLA - 1926 2BD2 20 0F 21 JSR bin2AsciiHex - 1927 2BD5 8D E6 2B STA MEMLOvalue+1 - 1928 2BD8 20 2D 2A JSR PrintXY - 1929 2BDB 1C 17 .BY 28,23 - 1930 2BDD 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" - 1931 2BE5 MEMLOvalue - 1932 2BE5 30 30 30 30 .BY "0000" - 1933 2BE9 00 .BY $00 - 1934 2BEA 60 RTS - 1935 - 1936 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo - 1937 - 1938 2BEB xjsrTableL - 1939 2BEB D1 E5 EB .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] - 1940 2BEE F1 F6 .BY <[xjsr4+1],<[xjsr5+1] - 1941 2BF0 02 0C 18 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] - 1942 2BF3 1D 25 .BY <[xjsr9+1],<[xjsrA+1] - 1943 2BF5 xjsrTableH - 1944 2BF5 27 27 27 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] - 1945 2BF8 27 27 .BY >[xjsr4+1],>[xjsr5+1] - 1946 2BFA 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] - 1947 2BFD 28 28 .BY >[xjsr9+1],>[xjsrA+1] - 1948 ; miejsce na wyliczony offset o jaki przesuwamy procedure - 1949 2BFF HappyOffset - 1950 2BFF 00 00 .WO $0000 - 1951 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) - 1952 2C01 DensityCodes - 1953 2C01 F3 E4 F1 .by +$80,"sdq" - 1954 ;.by "SDQ" - 1955 ;.by $0e,$15,$a0 - 1956 2C04 ONtext - 1957 2C04 CF CE A0 .BY +$80,"ON " - 1958 2C07 OFFtext - 1959 2C07 CF C6 C6 .BY +$80,"OFF" - 1960 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) - 1961 2C0A PDVMASKtemp - 1962 2C0A 00 .BY $00 - 1963 ; miejsce na blok PERCOM - 1964 2C0B PERCOMdata - 1965 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie - 1966 = 2C17 FirstSectorsTable=*+12 ; omijamy 12b na percom - 1967 ; zostawiamy $30 bajtow wolnego - 1968 - 1969 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow - 1970 = 2D00 ProgramEnd=FirstSectorBuff - 1971 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu - 1972 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu - 1973 2C0B FirstRun - 1974 ; odnotowujemy stan Shift z Bootowania - 1975 2C0B AD 0F D2 LDA SKSTAT - 1976 2C0E 29 08 and #$08 - 1977 2C10 D0 03 BNE NoSHIFTboot - 1978 2C12 8D 0C 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 - 1979 2C15 NoSHIFTboot - 1980 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie - 1981 2C15 AD 01 D3 LDA PORTB - 1982 2C18 29 02 AND #$02 - 1983 2C1A D0 0B BNE BrakBasica - 1984 ; jest Basic - 1985 2C1C A0 02 LDY #$2 - 1986 2C1E BASstatprint - 1987 2C1E B9 04 2C LDA ONtext,y - 1988 2C21 99 D7 22 STA BASstatus,y - 1989 2C24 88 DEY - 1990 2C25 10 F7 bpl BASstatprint - 1991 2C27 BrakBasica - 1992 ; Sprawdzamy istnienie QMEGa - 1993 2C27 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy - 1994 2C29 testQMEGloop - 1995 2C29 B9 01 C0 LDA $C001,y - 1996 2C2C D9 5C 2C CMP QMEGstring,y - 1997 2C2F D0 13 bne brakQMEGa - 1998 2C31 88 dey - 1999 2C32 10 F5 bpl testQMEGloop - 2000 ; jest QMEG - 2001 2C34 A9 00 LDA #0 - 2002 2C36 8D 0A 21 STA QMEG - 2003 2C39 A0 02 LDY #$2 - 2004 2C3B Qstatprint - 2005 2C3B B9 04 2C LDA ONtext,y - 2006 2C3E 99 CF 22 STA QMEGstatus,y - 2007 2C41 88 DEY - 2008 2C42 10 F7 bpl Qstatprint - 2009 2C44 brakQMEGa - 2010 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi - 2011 2C44 AD 00 03 LDA DDEVIC - 2012 2C47 18 clc - 2013 2C48 6D 01 03 ADC DUNIT - 2014 2C4B 38 sec - 2015 2C4C E9 01 SBC #$01 - 2016 2C4E 29 0F AND #$0F ; zapamietanie numeru urzadzenia - 2017 2C50 8D 0B 21 STA BootDrive - 2018 2C53 20 7F 2B JSR SeTDriveNR - 2019 2C56 20 1E 21 JSR EditorOpen - 2020 2C59 4C 4C 21 JMP mainprog - 2021 2C5C QMEGstring - 2022 2C5C 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 - 2023 2C64 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" - 2024 ;.OPT List - 2025 - 2026 - 2027 = 0080 MAPCOUNTER - 2027 = 0082 COMPRESSEDMAPCOUNTER - 2027 = 0084 MAPCOUNTERMEM - 2027 = 0086 PREVFILESECTOR - 2027 = 0088 MAPPOSITIONMEM - 2027 = 008A SECTOROFFSET - 2027 = 008C SECTORSCOUNTER - 2027 org $02e0 - 2028 02E0-02E1> 80 26 .WO LoaderGo - 2029 ; .WO START - 2030 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) - 2031 ; OPT h- - 2032 ; org $0000 - 2033 ; .WO $0000 - 2034 + 1424 288E GetSIOByte + 1425 288E A2 0A LDX #10 ;acktimeout + 1426 2890 ExternalLoop + 1427 2890 A9 00 LDA #0 + 1428 2892 85 36 STA looperka + 1429 2894 InternalLoop + 1430 2894 AD 0E D2 LDA IRQST + 1431 2897 29 20 AND #$20 + 1432 2899 F0 09 BEQ ACKReceive + 1433 289B C6 36 DEC looperka + 1434 289D D0 F5 BNE InternalLoop + 1435 289F CA DEX + 1436 28A0 D0 EE BNE ExternalLoop + 1437 28A2 F0 9F BEQ ErrorHere + 1438 28A4 ACKReceive + 1439 ; zero we have now + 1440 28A4 8D 0E D2 STA IRQST + 1441 28A7 A9 20 LDA #$20 + 1442 28A9 8D 0E D2 STA IRQST + 1443 28AC AD 0F D2 LDA SKSTAT + 1444 28AF 8D 0A D2 STA SKSTRES + 1445 28B2 29 20 AND #$20 + 1446 28B4 F0 8D BEQ ErrorHere + 1447 ; + 1448 28B6 AD 0D D2 LDA SERIN + 1449 28B9 60 RTS + 1450 28BA EndHappyUSProc + 1451 + 1452 + 1453 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler + 1454 28BA blokDanychIO_GetUSSpeed + 1455 28BA 31 01 3F 40 .BY $31,$01,"?",$40 + 1456 28BE D3 27 .WO HappySpeed + 1457 28C0 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A + 1458 28C6 DirMapEnd + 1459 28C6 4C 92 29 JMP label75 + 1460 28C9 label39 + 1461 28C9 85 DA STA $DA + 1462 28CB A5 D0 LDA CurrentFileInfoBuff + 1463 28CD 85 DB STA $DB + 1464 28CF A5 D1 LDA CurrentFileInfoBuff+1 + 1465 28D1 85 DC STA $DC + 1466 28D3 20 46 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 1467 28D6 F0 05 BEQ DiscNotChanged2 + 1468 28D8 68 PLA + 1469 28D9 68 PLA + 1470 28DA 4C D3 21 JMP ReadMainDir + 1471 28DD DiscNotChanged2 + 1472 ; odczyt sektora mapy wskazywanego przez DirMapSec + 1473 28DD A5 D2 LDA DirMapSect + 1474 28DF 8D 42 2A STA blokDanychIO+10 + 1475 28E2 A5 D3 LDA DirMapSect+1 + 1476 28E4 8D 43 2A STA blokDanychIO+11 + 1477 28E7 0D 42 2A ORA blokDanychIO+10 + 1478 28EA F0 DA BEQ DirMapEnd + 1479 28EC A2 2D LDX #>DirMapSectorBuff + 1480 28EE A0 80 LDY #DirMapSectorBuff ; -- + 1506 291A 65 E3 ADC InMapPointer+1 ; -- + 1507 291C 85 E5 STA TempZP+1 ; -- + 1508 291E B1 E4 LDA (TempZP),Y + 1509 2920 8D 42 2A STA blokDanychIO+10 + 1510 2923 C8 INY + 1511 2924 B1 E4 LDA (TempZP),Y + 1512 2926 8D 43 2A STA blokDanychIO+11 + 1513 2929 0D 42 2A ORA blokDanychIO+10 + 1514 292C F0 64 BEQ label75 + 1515 ; i zwiekszenie wskaznika mapy o 2 + 1516 292E C8 INY + 1517 292F 84 E2 STY InMapPointer + 1518 2931 D0 02 BNE NoIncH ; -- + 1519 2933 E6 E3 INC InMapPointer+1 ; -- + 1520 2935 NoIncH + 1521 2935 AD E5 02 LDA MEMTOP + 1522 2938 38 SEC + 1523 2939 E5 D0 SBC CurrentFileInfoBuff + 1524 293B AD E6 02 LDA MEMTOP+1 + 1525 293E E5 D1 SBC CurrentFileInfoBuff+1 + 1526 2940 F0 50 BEQ label75 + 1527 2942 A4 D0 LDY CurrentFileInfoBuff + 1528 2944 A6 D1 LDX CurrentFileInfoBuff+1 + 1529 2946 20 0A 2A JSR ReadSector + 1530 2949 A5 D4 LDA $D4 + 1531 294B 05 D5 ORA $D5 + 1532 294D D0 16 BNE label79 + 1533 294F A0 03 LDY #$03 + 1534 2951 B1 D0 LDA (CurrentFileInfoBuff),Y + 1535 2953 85 D4 STA $D4 + 1536 2955 C8 INY + 1537 2956 B1 D0 LDA (CurrentFileInfoBuff),Y + 1538 2958 85 D5 STA $D5 + 1539 295A C8 INY + 1540 295B B1 D0 LDA (CurrentFileInfoBuff),Y + 1541 295D F0 06 BEQ label79 + 1542 295F A9 FF LDA #$FF + 1543 2961 85 D4 STA $D4 + 1544 2963 85 D5 STA $D5 + 1545 2965 label79 + 1546 2965 A5 D0 LDA CurrentFileInfoBuff + 1547 2967 18 CLC + 1548 2968 6D DC 20 ADC .adr loader.SecLen ; przed przepisaniem + 1549 296B 85 D0 STA CurrentFileInfoBuff + 1550 296D A5 D1 LDA CurrentFileInfoBuff+1 + 1551 296F 6D DD 20 ADC .adr loader.SecLen+1 ; przed przepisaniem + 1552 2972 85 D1 STA CurrentFileInfoBuff+1 + 1553 2974 A5 D4 LDA $D4 + 1554 2976 38 SEC + 1555 2977 ED DC 20 SBC .adr loader.SecLen ; przed przepisaniem + 1556 297A 85 D4 STA $D4 + 1557 297C A5 D5 LDA $D5 + 1558 297E ED DD 20 SBC .adr loader.SecLen+1 ; przed przepisaniem + 1559 2981 85 D5 STA $D5 + 1560 2983 B0 80 BCS label80 + 1561 2985 A5 D0 LDA CurrentFileInfoBuff + 1562 2987 18 CLC + 1563 2988 65 D4 ADC $D4 + 1564 298A 85 D0 STA CurrentFileInfoBuff + 1565 298C A5 D1 LDA CurrentFileInfoBuff+1 + 1566 298E 65 D5 ADC $D5 + 1567 2990 85 D1 STA CurrentFileInfoBuff+1 + 1568 2992 label75 + 1569 2992 A5 DC LDA $DC + 1570 2994 C5 D1 CMP CurrentFileInfoBuff+1 + 1571 2996 90 0B BCC label81 + 1572 2998 D0 17 BNE label82 + 1573 299A A5 DB LDA $DB + 1574 299C C5 D0 CMP CurrentFileInfoBuff + 1575 299E 90 03 BCC label81 + 1576 29A0 D0 0F BNE label82 + 1577 29A2 60 RTS + 1578 29A3 label81 + 1579 29A3 A5 DB LDA $DB + 1580 29A5 18 CLC + 1581 29A6 65 DA ADC $DA + 1582 29A8 85 DB STA $DB + 1583 29AA 90 E6 BCC label75 + 1584 29AC E6 DC INC $DC + 1585 29AE 4C 92 29 JMP label75 + 1586 29B1 label82 + 1587 29B1 A5 DB LDA $DB + 1588 29B3 38 SEC + 1589 29B4 E5 DA SBC $DA + 1590 29B6 85 D0 STA CurrentFileInfoBuff + 1591 29B8 A5 DC LDA $DC + 1592 29BA E9 00 SBC #$00 + 1593 29BC 85 D1 STA CurrentFileInfoBuff+1 + 1594 29BE 60 RTS + 1595 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora + 1596 29BF ReadPERCOM + 1597 29BF A9 04 LDA #$04 + 1598 29C1 8D 44 2A STA DiskRetryCount + 1599 29C4 ReadPERCOMretry + 1600 29C4 A0 E8 LDY #blokDanychIO_PERCOM + 1602 29C8 20 E0 2A JSR Table2DCB + 1603 29CB 20 D5 2A JSR GoSIO + 1604 29CE 30 08 BMI PercomError + 1605 ; blok odczytany - ustawmy dlugosc 1 sektora + 1606 29D0 AD 29 2C LDA PERCOMdata+6 + 1607 29D3 C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + 1608 29D5 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + 1609 29D7 60 RTS + 1610 29D8 PercomError + 1611 29D8 CE 44 2A DEC DiskRetryCount + 1612 29DB D0 E7 BNE ReadPERCOMretry + 1613 ; blok nieodczytany - dlugosc 1 sektora na $80 + 1614 29DD Set1Sect128 + 1615 29DD A9 00 LDA #$00 + 1616 29DF 8D 29 2C STA PERCOMdata+6 + 1617 29E2 A9 80 LDA #$80 + 1618 29E4 8D 2A 2C STA PERCOMdata+7 + 1619 29E7 60 RTS + 1620 29E8 blokDanychIO_PERCOM + 1621 29E8 31 01 4E 40 .BY $31,$01,$4E,$40 + 1622 29EC 23 2C .WO PERCOMdata + 1623 29EE 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 + 1624 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) + 1625 29F4 ReadFirstSect + 1626 29F4 A9 01 LDA #$01 + 1627 29F6 8D 42 2A STA blokDanychIO+10 + 1628 29F9 A9 00 LDA #$00 + 1629 29FB 8D 43 2A STA blokDanychIO+11 + 1630 29FE AD 29 2C LDA PERCOMdata+6 + 1631 2A01 8D 41 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1632 2A04 AD 2A 2C LDA PERCOMdata+7 + 1633 2A07 4C 13 2A JMP ReadSector1 + 1634 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) + 1635 ; reszta danych jak nizej (A nie wazne) + 1636 2A0A ReadSector + 1637 2A0A AD DD 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + 1638 2A0D 8D 41 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1639 2A10 AD DC 20 LDA .adr loader.SecLen ; przed przepisaniem + 1640 2A13 ReadSector1 + 1641 2A13 8D 40 2A STA blokDanychIO+8 + 1642 2A16 8E 3D 2A STX blokDanychIO+5 + 1643 2A19 8C 3C 2A STY blokDanychIO+4 + 1644 2A1C A9 04 LDA #$04 + 1645 2A1E 8D 44 2A STA DiskRetryCount + 1646 2A21 DiskReadRetry + 1647 2A21 A0 38 LDY #blokDanychIO + 1649 2A25 20 E0 2A JSR Table2DCB + 1650 2A28 20 D5 2A JSR GoSIO + 1651 2A2B 30 01 BMI label85 + 1652 2A2D 60 RTS + 1653 2A2E label85 + 1654 2A2E CE 44 2A DEC DiskRetryCount + 1655 2A31 D0 EE BNE DiskReadRetry + 1656 2A33 68 PLA + 1657 2A34 68 PLA + 1658 2A35 4C 92 21 JMP ErrorDisplay + 1659 2A38 blokDanychIO + 1660 2A38 31 01 52 40 .BY $31,$01,$52,$40 + 1661 2A3C 80 2D .WO DirMapSectorBuff + 1662 2A3E 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 + 1663 2A44 DiskRetryCount + 1664 2A44 00 .BY $00 + 1665 2A45 PrintXY + 1666 2A45 68 PLA + 1667 2A46 85 C8 STA $C8 + 1668 2A48 68 PLA + 1669 2A49 85 C9 STA $C9 + 1670 2A4B A9 00 LDA #$00 + 1671 2A4D 85 DF STA $DF + 1672 2A4F 20 C7 2A JSR label87 + 1673 2A52 48 PHA + 1674 2A53 20 C7 2A JSR label87 + 1675 2A56 85 DE STA $DE + 1676 2A58 0A ASL + 1677 2A59 0A ASL + 1678 2A5A 18 CLC + 1679 2A5B 65 DE ADC $DE + 1680 2A5D 0A ASL + 1681 2A5E 0A ASL + 1682 2A5F 26 DF ROL $DF + 1683 2A61 0A ASL + 1684 2A62 26 DF ROL $DF + 1685 2A64 18 CLC + 1686 2A65 65 58 ADC SAVMSC + 1687 2A67 85 DE STA $DE + 1688 2A69 A5 DF LDA $DF + 1689 2A6B 65 59 ADC SAVMSC+1 + 1690 2A6D 85 DF STA $DF + 1691 2A6F 68 PLA + 1692 2A70 A8 TAY + 1693 2A71 label92 + 1694 2A71 20 C7 2A JSR label87 + 1695 2A74 C9 00 CMP #$00 + 1696 2A76 F0 48 BEQ label88 + 1697 2A78 C9 7D CMP #$7D + 1698 2A7A F0 21 BEQ label89 + 1699 2A7C A2 00 LDX #$00 + 1700 2A7E 86 E0 STX $E0 + 1701 2A80 C9 80 CMP #$80 + 1702 2A82 66 E0 ROR $E0 + 1703 2A84 29 7F AND #$7F + 1704 2A86 C9 20 CMP #$20 + 1705 2A88 B0 04 BCS label90 + 1706 2A8A 09 40 ORA #$40 + 1707 2A8C D0 07 BNE label91 + 1708 2A8E label90 + 1709 2A8E C9 60 CMP #$60 + 1710 2A90 B0 03 BCS label91 + 1711 2A92 38 SEC + 1712 2A93 E9 20 SBC #$20 + 1713 2A95 label91 + 1714 2A95 05 E0 ORA $E0 + 1715 2A97 91 DE STA ($DE),Y + 1716 2A99 C8 INY + 1717 2A9A 4C 71 2A JMP label92 + 1718 2A9D label89 + 1719 2A9D 98 TYA + 1720 2A9E 48 PHA + 1721 2A9F A5 58 LDA SAVMSC + 1722 2AA1 85 E0 STA $E0 + 1723 2AA3 A9 03 LDA #$03 + 1724 2AA5 AA TAX + 1725 2AA6 18 CLC + 1726 2AA7 65 59 ADC SAVMSC+1 + 1727 2AA9 85 E1 STA $E1 + 1728 2AAB A0 BF LDY #$BF + 1729 2AAD A9 00 LDA #$00 + 1730 2AAF label93 + 1731 2AAF 91 E0 STA ($E0),Y + 1732 2AB1 88 DEY + 1733 2AB2 C0 FF CPY #$FF + 1734 2AB4 D0 F9 BNE label93 + 1735 2AB6 C6 E1 DEC $E1 + 1736 2AB8 CA DEX + 1737 2AB9 10 F4 BPL label93 + 1738 2ABB 68 PLA + 1739 2ABC A8 TAY + 1740 2ABD 4C 71 2A JMP label92 + 1741 2AC0 label88 + 1742 2AC0 A5 C9 LDA $C9 + 1743 2AC2 48 PHA + 1744 2AC3 A5 C8 LDA $C8 + 1745 2AC5 48 PHA + 1746 2AC6 60 RTS + 1747 2AC7 label87 + 1748 2AC7 E6 C8 INC $C8 + 1749 2AC9 D0 02 BNE label94 + 1750 2ACB E6 C9 INC $C9 + 1751 2ACD label94 + 1752 2ACD A2 00 LDX #$00 + 1753 2ACF A1 C8 LDA ($C8,X) + 1754 2AD1 60 RTS + 1755 2AD2 GoErrorDisp + 1756 2AD2 4C 92 21 JMP ErrorDisplay + 1757 ; Skok do Sio lub procedury Turbo + 1758 2AD5 GoSIO + 1759 2AD5 AC 21 21 LDY USmode + 1760 2AD8 F0 03 BEQ StandardSpeed + 1761 2ADA 4C BB 27 JMP HappyUSMovedProc ; mozna skakac do tej procki + 1762 2ADD StandardSpeed + 1763 2ADD 4C 59 E4 JMP JSIOINT + 1764 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) + 1765 ; do bloku kontroli transmisji szeregowej DCB + 1766 2AE0 Table2DCB + 1767 2AE0 8C E9 2A STY IOtableAddr+1 + 1768 2AE3 8E EA 2A STX IOtableAddr+2 + 1769 2AE6 A2 0B LDX #$0B + 1770 2AE8 IOtableAddr + 1771 2AE8 BD FF FF LDA $FFFF,X + 1772 2AEB 9D 00 03 STA DDEVIC,X + 1773 2AEE CA DEX + 1774 2AEF 10 F7 BPL IOtableAddr + 1775 2AF1 60 RTS + 1776 2AF2 Close1 + 1777 2AF2 A2 10 LDX #$10 + 1778 2AF4 CloseX + 1779 2AF4 A9 0C LDA #$0C + 1780 2AF6 9D 42 03 STA ICCMD,X + 1781 2AF9 4C 56 E4 JMP JCIOMAIN + 1782 2AFC GetKey + 1783 2AFC A2 10 LDX #$10 + 1784 2AFE A9 03 LDA #$03 + 1785 2B00 9D 42 03 STA ICCMD,X + 1786 2B03 A9 04 LDA #$04 + 1787 2B05 9D 4A 03 STA ICAX1,X + 1788 2B08 A9 00 LDA #$00 + 1789 2B0A 9D 4B 03 STA ICAX2,X + 1790 2B0D 9D 49 03 STA ICBUFL+1,X + 1791 2B10 A9 FF LDA #$FF + 1792 2B12 9D 48 03 STA ICBUFL,X + 1793 2B15 A9 43 LDA #Kdriver + 1796 2B1C 9D 45 03 STA ICBUFA+1,X + 1797 2B1F 20 56 E4 JSR JCIOMAIN + 1798 2B22 30 1C BMI GKeyError + 1799 2B24 A2 10 LDX #$10 + 1800 2B26 A9 00 LDA #$00 + 1801 2B28 9D 48 03 STA ICBUFL,X + 1802 2B2B 9D 49 03 STA ICBUFL+1,X + 1803 2B2E A9 07 LDA #$07 + 1804 2B30 9D 42 03 STA ICCMD,X + 1805 2B33 20 56 E4 JSR JCIOMAIN + 1806 2B36 30 08 BMI GKeyError + 1807 2B38 48 PHA + 1808 2B39 20 F2 2A JSR Close1 + 1809 2B3C 30 02 BMI GKeyError + 1810 2B3E 68 PLA + 1811 2B3F 60 RTS + 1812 2B40 GKeyError + 1813 2B40 4C D2 2A JMP GoErrorDisp + 1814 2B43 Kdriver + 1815 2B43 4B 3A 9B .BY "K:",$9B + 1816 2B46 DiscChangeCheck + 1817 2B46 A0 80 LDY #DirMapSectorBuff + 1819 2B4A 20 F4 29 JSR ReadFirstSect + 1820 2B4D A2 7F LDX #$7F + 1821 2B4F label98 + 1822 2B4F BD 00 2D LDA FirstSectorBuff,X + 1823 2B52 DD 80 2D CMP DirMapSectorBuff,X + 1824 2B55 D0 05 BNE ChangedD + 1825 2B57 CA DEX + 1826 2B58 10 F5 BPL label98 + 1827 2B5A A9 00 LDA #$00 + 1828 2B5C ChangedD + 1829 2B5C 60 RTS + 1830 ; obsluga gwiazdki + 1831 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * + 1832 ; w Y jest ) - X moze lepiej nie ruszac :) + 1833 2B5D Asteriks + 1834 2B5D A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + 1835 2B5F 20 7B 2B JSR GetHexNumber + 1836 2B62 8D C5 02 STA COLPF1S ; literki + 1837 2B65 C8 INY + 1838 2B66 20 7B 2B JSR GetHexNumber + 1839 2B69 8D C6 02 STA COLPF2S ; tlo + 1840 2B6C C8 INY + 1841 2B6D 20 7B 2B JSR GetHexNumber + 1842 2B70 8D C8 02 STA COLBAKS ; ramka + 1843 2B73 C8 INY + 1844 2B74 20 7B 2B JSR GetHexNumber + 1845 2B77 8D 25 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + 1846 2B7A 60 RTS + 1847 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX + 1848 ; i zamienia na bajt w A + 1849 2B7B GetHexNumber + 1850 2B7B 20 8B 2B JSR GetHEX4bits + 1851 2B7E 0A ASL + 1852 2B7F 0A ASL + 1853 2B80 0A ASL + 1854 2B81 0A ASL + 1855 2B82 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + 1856 2B84 C8 INY + 1857 2B85 20 8B 2B JSR GetHEX4bits + 1858 2B88 05 E4 ORA TempZP + 1859 2B8A 60 RTS + 1860 2B8B GetHEX4bits + 1861 2B8B B1 D4 LDA ($D4),Y + 1862 2B8D 38 SEC + 1863 2B8E E9 30 SBC #'0' + 1864 2B90 C9 0A CMP #$0A ; sprawdzmy czy cyfra + 1865 2B92 90 02 BCC IsNumber + 1866 2B94 E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow + 1867 2B96 IsNumber + 1868 2B96 60 RTS + 1869 ; Ustawia numer satcji wg A + 1870 2B97 SeTDriveNR + 1871 2B97 C9 09 CMP #$09 + 1872 2B99 B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + 1873 2B9B 20 B9 2B JSR SeTblokDanychDrive + 1874 2B9E 18 CLC + 1875 2B9F 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + 1876 2BA1 8D D4 22 STA DriveDisp1 + 1877 2BA4 A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu + 1878 2BA6 8D D3 22 STA DriveDisp1-1 + 1879 2BA9 60 RTS + 1880 2BAA SeTDriveLetter + 1881 2BAA 20 B9 2B JSR SeTblokDanychDrive + 1882 2BAD 18 CLC + 1883 2BAE 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + 1884 2BB0 8D D4 22 STA DriveDisp1 + 1885 2BB3 A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + 1886 2BB5 8D D3 22 STA DriveDisp1-1 + 1887 2BB8 60 RTS + 1888 2BB9 SeTblokDanychDrive + 1889 2BB9 8D D5 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + 1890 2BBC 8D 39 2A STA blokDanychIO+1 + 1891 2BBF 8D BB 28 STA blokDanychIO_GetUSSpeed+1 + 1892 2BC2 8D E9 29 STA blokDanychIO_PERCOM+1 + 1893 2BC5 60 RTS + 1894 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku + 1895 2BC6 MEMLOprint + 1896 2BC6 AD E7 02 LDA MEMLO + 1897 2BC9 48 PHA + 1898 2BCA 4A LSR + 1899 2BCB 4A LSR + 1900 2BCC 4A LSR + 1901 2BCD 4A LSR + 1902 2BCE 20 27 21 JSR bin2AsciiHex + 1903 2BD1 8D FF 2B STA MEMLOvalue+2 + 1904 2BD4 68 PLA + 1905 2BD5 20 27 21 JSR bin2AsciiHex + 1906 2BD8 8D 00 2C STA MEMLOvalue+3 + 1907 2BDB AD E8 02 LDA MEMLO+1 + 1908 2BDE 48 PHA + 1909 2BDF 4A LSR + 1910 2BE0 4A LSR + 1911 2BE1 4A LSR + 1912 2BE2 4A LSR + 1913 2BE3 20 27 21 JSR bin2AsciiHex + 1914 2BE6 8D FD 2B STA MEMLOvalue + 1915 2BE9 68 PLA + 1916 2BEA 20 27 21 JSR bin2AsciiHex + 1917 2BED 8D FE 2B STA MEMLOvalue+1 + 1918 2BF0 20 45 2A JSR PrintXY + 1919 2BF3 1C 17 .BY 28,23 + 1920 2BF5 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" + 1921 2BFD MEMLOvalue + 1922 2BFD 30 30 30 30 .BY "0000" + 1923 2C01 00 .BY $00 + 1924 2C02 60 RTS + 1925 + 1926 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo + 1927 + 1928 2C03 xjsrTableL + 1929 2C03 E9 FD 03 .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + 1930 2C06 09 0E .BY <[xjsr4+1],<[xjsr5+1] + 1931 2C08 1A 24 30 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + 1932 2C0B 35 3D .BY <[xjsr9+1],<[xjsrA+1] + 1933 2C0D xjsrTableH + 1934 2C0D 27 27 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + 1935 2C10 28 28 .BY >[xjsr4+1],>[xjsr5+1] + 1936 2C12 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + 1937 2C15 28 28 .BY >[xjsr9+1],>[xjsrA+1] + 1938 ; miejsce na wyliczony offset o jaki przesuwamy procedure + 1939 2C17 HappyOffset + 1940 2C17 00 00 .WO $0000 + 1941 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) + 1942 2C19 DensityCodes + 1943 2C19 F3 E4 F1 .by +$80,"sdq" + 1944 ;.by "SDQ" + 1945 ;.by $0e,$15,$a0 + 1946 2C1C ONtext + 1947 2C1C CF CE A0 .BY +$80,"ON " + 1948 2C1F OFFtext + 1949 2C1F CF C6 C6 .BY +$80,"OFF" + 1950 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) + 1951 2C22 PDVMASKtemp + 1952 2C22 00 .BY $00 + 1953 ; miejsce na blok PERCOM + 1954 2C23 PERCOMdata + 1955 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie + 1956 = 2C2F FirstSectorsTable=*+12 ; omijamy 12b na percom + 1957 ; zostawiamy $30 bajtow wolnego + 1958 + 1959 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow + 1960 = 2D00 ProgramEnd=FirstSectorBuff + 1961 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu + 1962 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu + 1963 2C23 FirstRun + 1964 ; odnotowujemy stan Shift z Bootowania + 1965 2C23 AD 0F D2 LDA SKSTAT + 1966 2C26 29 08 and #$08 + 1967 2C28 D0 03 BNE NoSHIFTboot + 1968 2C2A 8D 24 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 + 1969 2C2D NoSHIFTboot + 1970 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie + 1971 2C2D AD 01 D3 LDA PORTB + 1972 2C30 29 02 AND #$02 + 1973 2C32 D0 0B BNE BrakBasica + 1974 ; jest Basic + 1975 2C34 A0 02 LDY #$2 + 1976 2C36 BASstatprint + 1977 2C36 B9 1C 2C LDA ONtext,y + 1978 2C39 99 EF 22 STA BASstatus,y + 1979 2C3C 88 DEY + 1980 2C3D 10 F7 bpl BASstatprint + 1981 2C3F BrakBasica + 1982 ; Sprawdzamy istnienie QMEGa + 1983 2C3F A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy + 1984 2C41 testQMEGloop + 1985 2C41 B9 01 C0 LDA $C001,y + 1986 2C44 D9 74 2C CMP QMEGstring,y + 1987 2C47 D0 13 bne brakQMEGa + 1988 2C49 88 dey + 1989 2C4A 10 F5 bpl testQMEGloop + 1990 ; jest QMEG + 1991 2C4C A9 00 LDA #0 + 1992 2C4E 8D 22 21 STA QMEG + 1993 2C51 A0 02 LDY #$2 + 1994 2C53 Qstatprint + 1995 2C53 B9 1C 2C LDA ONtext,y + 1996 2C56 99 E7 22 STA QMEGstatus,y + 1997 2C59 88 DEY + 1998 2C5A 10 F7 bpl Qstatprint + 1999 2C5C brakQMEGa + 2000 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi + 2001 2C5C AD 00 03 LDA DDEVIC + 2002 2C5F 18 clc + 2003 2C60 6D 01 03 ADC DUNIT + 2004 2C63 38 sec + 2005 2C64 E9 01 SBC #$01 + 2006 2C66 29 0F AND #$0F ; zapamietanie numeru urzadzenia + 2007 2C68 8D 23 21 STA BootDrive + 2008 2C6B 20 97 2B JSR SeTDriveNR + 2009 2C6E 20 36 21 JSR EditorOpen + 2010 2C71 4C 64 21 JMP mainprog + 2011 2C74 QMEGstring + 2012 2C74 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 + 2013 2C7C 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" + 2014 ;.OPT List + 2015 + 2016 + 2017 = 0080 MAPCOUNTER + 2017 = 0082 COMPRESSEDMAPCOUNTER + 2017 = 0084 MAPCOUNTERMEM + 2017 = 0086 PREVFILESECTOR + 2017 = 0088 MAPPOSITIONMEM + 2017 = 008A SECTOROFFSET + 2017 = 008C SECTORSCOUNTER + 2017 org $02e0 + 2018 02E0-02E1> 98 26 .WO LoaderGo + 2019 ; .WO START + 2020 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) + 2021 ; OPT h- + 2022 ; org $0000 + 2023 ; .WO $0000 + 2024 diff --git a/loaderFN.xex b/loaderFN.xex index be137e1cab6579a46edfead789ebc2d27acc3b2b..3a43acc111c01d107874c890b188f502e7f54c2f 100644 GIT binary patch delta 2186 zcmYjSZ%i9U7T=vUEM7t&mqwU0NoS3*@p=u0=u$TcQ6SKe-sU2OYc7#m)s;X3U5M0P zbYJd+oj=QQJqFQiq6_LF`K;Tj%VjJ3W6GiMp`kX{q>F8GC5489`F9eWucS#^HTAtU zX|E%D-prfX_kJ_)z2D4KJgf-ja!;Pih*G6UhMb&Dq!dI%3x>EJ3W!uxkY@Vc2!V8q7Mw>Y%1r9dtD7kCxu; z$Xl92rll`XP*ce~0#geJM@>^ZvW!&7YSa%7q<7h~up!f`{kHY&914JIWG*voq)cOn zni#+})Xadjp%w;E47D-V_WY;*;l@b<893++Azk=jlWV2 zTUWVk44|b+sYyAHL^`4T744>5lv}6<`gQay^c>@XejoE<#R11e*|*`c2p2Pk4miNv zV|Cir)kyrxH3pZxR7H-$hR2e}A*CGBCFM3F9CY&dRZp0UrKb-#072QKaB(a>=ySx! zY6c!fx2kDdSB;zo1XI#-rD+Y3=N-63pi!e+sk7`+4qFP96PBW2t*A~8`NW?@QHb~PXE`cD^?bV0^Dk+{uHG}g zkv_JY{&wu9Kx_peO*xkC=}z7#(LN;Oh{TaLK`gfs{!Y1X*%KT#gOaElC`r5!wfa|m zn^8)FFJQb#5X*bU907U8G-dNg1bFl5@CU5hxlZWt& z9!T>PuUGL|b`v85xe}&hX_CaGNr=NBg~<_fa4bhKAFs&|=J2NC3mgtbyqFU-O1>yx z!snd&Wv|?0O4%#_0iRRUf+pdd6PEk3mH3ZN^(|`%RwdpE6ODo)0PHmdZ3<;u;m+VJ zHVV|xof!<+ZdK_aZ^;F3wgn^r(l2-c&HtTV&@6HYcD35ni(MfSa;lfQYRLs>C&}fO zE*fa*Qb6s?vf#jk5CErPs;?Pov}}E!V&~cnhJ4Lv|B$z6PPs%siilmTm(FK&yGV{A zo0jaJ!DJc94I0}$i^&R-52+0X8b37NVAGcox#}{D_?j|PxZ85dg~ydAg*CxrW>va2 zt5RBGTlcpeIdSqxYt8AF)07UC_?llES%Z(uMa{JapWDPR6|wq98BwkuEfM9tvHG=g z@$LFJNE=8<^!dp5qa&^%ikq0r8DE8S5$d|F8%!*tx4OZ?3evB-$O5ZhbCHZP%=%t_ zrP`)bOgGJROpV@eDRtb>Yq|&Q1VrWNezZV?kbwW%7BKd1|3O zet90kxS%g0|DvHUDK%COae}hnipyuPY^akE7O+a3fcEllwznll$S? zI^}q$oPY~>fIkvi;V*yAakdWVoDbk<>o_fcu0H5EBR}YT4}YYzbJg@43gPU~N4aNy zc7?wI3B*VvF6m6BZ&m33w{nlGqmL*>#g)M?1t01RNJ-%r``^h|$U}D|I7)eELtdi* zxL2bB;bQ!I54nxvrWoH8@l8?12k@Uf95gu-hfzT$5K9BUBsgFeHjuDJOYu#Qtt(2> zb|9vdJ&>P{nbWX24U#ELUJ%GgHCc5BpgMkhT5_KJ(?W?*EI%rrY%0I^0PXE6Ki+a& zIJ!Ggb*IDk^9Glz`e~!6jm&>Pxf}jue4P4$svNvdr`*WMzikJ^!T*?# yTe$EhJvMz_G`9DeXC`)FWAo)(HW#5NY)}>cRoY!j@=qLaved4$Z}}a%?))DUjbX?D delta 2216 zcmYjSe{2)i9lv{*f`~#gOnYf75D2Pj^Ry(yDy*VR z{DEj~emt5)JQQ}-I)>aD!?iueg;?68QD&A+1=(3s&cP`QrBjzUPNFWz^arfn5AS;k z>h^Sc-}mEt-}ia%^ZoI~$~!B=#p1tLy)P-162stwJbsZM=`%Tn@>48&s#~nH!-N3q~H%dH&)Ivi2f7g_5*jo{uxeD%oFhL1*S@KR!8tldMGFt-n|y z57}g$rFP-i`0<M@)+59uqkyDZAXze@ufPfQyXbrDHuVLBSy4TKBsQU5Ms=*L z-a<`vvRG4_kbj3?dc$Icz?KB%Q{0%Bs+-m6UvPS%NnAqTySVxNppCGq-CN`Ni&_H6~qLcOny?E zOfMhas65y3f2%OFo){%YFZ9)n79LNGzN6d|jAi5Aaapw46=8oS|&edxl znqMiusmHR&*4DxG#A*;q(v|jK!uE+m z1K!uD4OB#6SE*=(iO#?f0QOmeT@o-O$5YU~>eM13L?Xb!VeRnP05(gt$XGuHz;CZM zBC`FkT<8D^AdSN^Ap9Sa!+HscfL6e%9SKEfeQ%?7G_;0>8hdH6m_GtJR0#nV>*k-dY#`pfax3}ZQ6PhU2nU- z-f7GtddO{Mh?m{^J}{6Yb|Ahy$>1o%CmA8il+T&>aGM(sskMC5&Sop3-AfUzjPQZA z+crJ3byJ{eXU9&)fGGY^tA1_)j23;mdjZTcQjCdLv?f3Gk(T6_KJuMJ%RYsT3_I8icV7R?37b+4zwT~N!!_RpP+hSj7 z^_t&WsJ6WJD}6a`_vq^=cQc0Y0Z+Ppcx9h?|Ck@fr&{n&J*oGa&Cl@xb#r+ne8mm< zjA3lbK`*(jndBoaL+)7KRNC7M{-liqE80yU#V(44+mKx%;3Gg583(S&P2gt=UVi%g z)cgI|TNhxO)g~4O)c%S!;e%f7qt=<* zpm1lNA(^0FLM1U~#=TZ*O^W_w23+oB)!29Y{XQEsl1t(J>R@GU_^i(v8m7Omhg5Z?K8UU9h&7E_Q+fnbL8RwAG~*3IKzvhh zW_^nVXU+%l@y+7Q(qi5RdGOmSIy*X*XVzku9~u+P%zS$9KB{uot#(_@V>O2PJg2&< z9DypqU~hVn`LNF2f;#sgR(6>knS5R{m-kuMqBcm$RuQ~mZG!JR!TDR~S?@BsSnMD% ND~fuk>Hvx~{ucokh?D>T