From 5ca73bd1b61a3805b97777ef4874a13e58d39ef7 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 2 May 2024 09:44:37 +0200 Subject: [PATCH 1/9] MADS files --- msdos.asm | 2120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ msdos.lab | 351 +++++++++ msdos.lst | 2129 +++++++++++++++++++++++++++++++++++++++++++++++++++++ msdos.xex | Bin 0 -> 3439 bytes 4 files changed, 4600 insertions(+) create mode 100644 msdos.asm create mode 100644 msdos.lab create mode 100644 msdos.lst create mode 100644 msdos.xex diff --git a/msdos.asm b/msdos.asm new file mode 100644 index 0000000..5722803 --- /dev/null +++ b/msdos.asm @@ -0,0 +1,2120 @@ + ;MICRO SPARTA DOS 4.7 + +; w wersji 4.7 dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami +; "prawo"/"lewo" albo "gora"/"dol" ... ... ale to b.trudne +; ze wzgledu na mozliwosc roznej liczby plikow (stron) w zaleznosci czy wyswietlamy +; dlugie nazwy czy nie - nie da sie tego latwo zliczyc + +; dodany "Backspace" jako powrot do katalogu wyzej. + +; w wersji 4.6c zmieniony sposob rozpoznawania wielkosci sektora, dodane czytanie +; bloku PERCOM przy zmianie dysku... +; UWAGA! Bufor na pierwszy sektor ma dalej 128b, bezposrednio za nim jest bufor na sektor +; mapy, ktory moze byc zamazywany w chwili odczytu pierwszego sektora bez problemow. + + +; w wersji 4.6b poprawione dwa male bugi i dodane kulturalne wyjscie do DOS (Shift+Esc) ... +; ..... moznaby w tym momencie sprawdzac czy jest w ogole DOS w pamieci, bo bez DOS bedzie SelfTest + +; w wersji 4.6 wyeliminowane chwilowe przelaczanie na domyslne kolory, różne poprawki procedur, +; żeby więcej gier się uruchamiało (zmiany w resecie i zmiennych systemowych) + +; w wersji 4.5 obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera +; wyswietlanie "numeru" napedu w zaleznosci jak sie go wybierze (Dn: lub n: - cyfra lub litera) + +; w wersji 4.4 (niepublikowanej) poprawiony blad. Nie moze byc dwa razy po sobie znacznika dziury w skompresowanej mapie +; czyli dziura max 127 sektorow a nie jak porzednio 254 +; dodatkowo zapamietanie (na czas resetu przed czyszczeniem pamieci) +; stanu aktywnych urzadzen PBI i odtworzenie go po resecie (dzieki Drac030) + +; stan urzadzen na szynie PBI +PDVMASK = $0247 + +; nowa koncepcja zrobiona: + +; 1. wywalić turbo 'top-drive' + +; 2. przerobić loader i menu na obsługę sektorów dow. długości + +; 3. przepisac czytanie tablicy sektorów indeksowych z loadera do menu: +; a. w menu odczytywane są wszystkie sektory tablicy indeksowej +; b. budowana jest "skompresowana" tablica offsetów w stosunku do pierwszego sektora na nast. zasadzie: +; mamy nast. znaczniki : (nowa koncepcja) +; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) . Opłaci się używać do max 255 sektorów do przeskoczenia. +; 0xxxxxxx -- (0xxxxxxx = ile kolejnych sektorów wczytać) +; 00000000 -- następne 2 bajty to numer kolejnego sektora do odczytania +; + +; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +WARMST = $08 +BOOT = $09 +DOSVEC = $0a +DOSINI = $0c +APPMHI = $0e + +IRQENS = $10 + + +; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) + +; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku +InBlockAddr = $24 ; word +; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) +ToBlockEnd = $26 ; word +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $28 +CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku + +CheckSUM = $30 +SecLenUS = $31 +SecBuffer = $32 +CRETRYZ = $34 +TransmitError =$35 +Looperka = $36 +StackCopy = $37 + + +SAVMSC = $58 +; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego +; katalog +CurrentDirBuf = $CA +; adres konca tego bufora (2 bajty) +CurrentDirBufEnd = $CC +; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) +DirMapSect = $D2 +; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu +; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji +; ma byc wyswietlany katalog od poczatku +LastFilesPageFlag = $D6 +; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony +; zawiera liczbe widocznych na ekranie plikow (1 bajt) +NamesOnScreen = $D9 +; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna +; wczesniej byl 1 bajt w $D6 +InMapPointer = $E2 +; zmienna tymczasowa na ZP (2 bajty) +TempZP = $E4 + +VSERIN = $020a +COLPF1S = $02c5 +COLPF2S = $02c6 +COLBAKS = $02c8 + +COLDST = $0244 +MEMTOP = $02e5 +MEMLO = $02e7 + +KBCODES = $02fc + +DDEVIC = $0300 +DUNIT = $0301 +DCOMND = $0302 +DBUFA = $0304 +DBYT = $0308 +DAUX1 = $030a +DAUX2 = $030b + +ICCMD = $0342 +ICBUFA = $0344 +;ICBUFA+1 = $0345 +ICBUFL = $0348 +;ICBUFL+1 = $0349 +ICAX1 = $034a +ICAX2 = $034b + +GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 +PORTB = $d301 + +VCOUNT = $D40B + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura +; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! +FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) + +START + JMP FirstRun ;1FFD 4C 70 21 + + +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania !!!!!! + +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 +FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + TXA + PHA + LDA ToFileEndL + PHA + LDA CompressedMapPos + PHA + LDA CompressedMapPos+1 + PHA + JSR GoInitAddr + PLA + STA CompressedMapPos+1 + PLA + STA CompressedMapPos + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) + AND InBlockAddr + CMP #$FF ; jesli oba sa $FF to..... + BNE FileNoFFFFHead + JSR FileGetBlockStart ; pobranie jeszcze raz +FileNoFFFFHead + JSR FileGetByte ; Pobranie adresu konca ladowanego bloku + SBC InBlockAddr ; i wyliczenie jego dlugosci + EOR #$FF ; UWAGA! Dlugosc jest zEORowana z $FFFF + STA ToBlockEnd ; czyli odjeta od $10000 + PHP ; odliczanie ilosci pobranych bajtow jest wiec potem robione + JSR FileGetByte ; przez dodawanie i sprawdzanie czy nie ZERO + PLP + SBC InBlockAddr+1 + EOR #$FF + STA ToBlockEnd+1 + SEC +WhatIsIt + BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y + ; ktory tylko wylacza skok !!! + DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! + LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ + STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu + LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem + STA $02E1 ; z adresem startu (bywa i tak). +FileNoFirstBlock + LDA #Jrts ; jesli nie jest to blok z adresem inicjacji + STA $02E3 ; to dzieki temu nic sie nie stanie + LDY #$00 +BlockReadLoop ;; petla odczytujaca z pliku blok binarny + INC ToFileEndL ;; zwiekszenie licznika bajtow w calym pliku i jesli ZERO + BEQ GoCheckEOF ;; skok do procedury sprawdzajacej dwa starsze jego bajty + CPX SecLen ;; sprawdzenie czy juz caly sektor przepisany jesli tak + bne NoNextSector1 ; -- + lda InSectorCountH ; -- obsluga sektorow ponad 256b + cmp SecLen+1 ; -- + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora +NoNextSector1 +FileSecBuffHaddr1 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + LDA FileSecBuff,X + INX + bne InBlockReadLoop ; -- + jsr IncrementationXH ; -- obsluga sektorow ponad 256b (ten trik dziala bo tam juz byl RTS :) ) +InBlockReadLoop + STA (InBlockAddr),Y + INY + BNE label15 + INC InBlockAddr+1 +label15 + INC ToBlockEnd + BNE BlockReadLoop + INC ToBlockEnd+1 + BNE BlockReadLoop + BEQ FileInit ; koniec bloku - skok pod adres inicjalizacji +GoCheckEOF + JSR CheckEOF ; skok do procedury wspolnej dla pobierania bloku i bajtu + BCS InBlockReadLoop ;tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +GoGetNextFileSect + JSR GetNextFileSect + BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +FileGetBlockStart + JSR FileGetByte + STA InBlockAddr + JSR FileGetByte + STA InBlockAddr+1 + RTS +GoInitAddr + JMP ($02E2) +GetDataSector +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO_Loader,X + STA DDEVIC,X + DEX + BPL SetDCB +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 +CheckEOF + INC ToFileEndH + BNE NotEOF + INC ToFileEndH+1 + BNE NotEOF +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) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLen ;; nie EOF, ale moze koniec sektora + bne ByteToACCU ; -- + lda InSectorCountH ; -- obsluga sektorow ponad 256b + cmp SecLen+1 ; -- + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU +FileSecBuffHaddr2 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + bne GoToSec ; -- +IncrementationXH ; taki trik - to przypadkiem jest podprogram, wiec mozna tu wskoczyc zamiast zwiekszac liczniki w innym miejscu po raz drugi + inc InSectorCountH ; -- + inc FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + inc FileSecBuffHaddr2 ; -- +GoToSec + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + tya + pha +ReadNextInSequence +SectorSequenceCount = *+1 + lda #$00 ; to już ma być zainicjowane!!! + beq NextMapPosition + dec SectorSequenceCount + inc SectorNumber + bne noIncDAUX2 + inc SectorNumber+1 +noIncDAUX2 + bne ReadyToRead + ;jak jest tutaj to jest błąd... + ;powinien być skok do self-testu... +NextMapPosition + jsr incCompressedMapPos + ;UWAGA! adres w mapie jest zawsze zwiększany o 1 + ;więc przed uruchomieniem loadera trzeba zainicjować adresem-1 + ldy #0 + lda (CompressedMapPos),y + bmi HowManyToSkip + beq SetNewStartSector + ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji + sta SectorSequenceCount + bne ReadNextInSequence ;zawsze skoczy +HowManyToSkip + and #%01111111 + clc + adc SectorNumber + sta SectorNumber + bcc noIncDAUX2_v2 + inc SectorNumber+1 +noIncDAUX2_v2 + bne ReadyToRead + ;jak jest tutaj to jest błąd... + ;powinien być skok do self-testu... +SetNewStartSector + jsr incCompressedMapPos + lda (CompressedMapPos),y + sta SectorNumber + jsr incCompressedMapPos + lda (CompressedMapPos),y + sta SectorNumber+1 +ReadyToRead + JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + + pla + tay + lda #>FileSecBuff ; -- + sta FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + sta FileSecBuffHaddr2 ; -- + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + stx InSectorCountH ; -- + JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + +incCompressedMapPos + inc CompressedMapPos + bne skipIncCompressedMapPos + inc CompressedMapPos+1 +skipIncCompressedMapPos + rts +; 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 +; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora +; mapy pliku do wczytania, potrzebny tylko na starcie ladowania +zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie +FirstMapSectorNr + .WO $0000 +LoadStart + ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + LDY MEMLO + LDA MEMLO+1 + STA InMemClearLoop+2 +OutMemClearLoop + LDA #$00 +InMemClearLoop + STA $0900,Y + INY + BNE InMemClearLoop + INC InMemClearLoop+2 + LDA InMemClearLoop+2 + CMP MEMTOP+1 + BCC OutMemClearLoop + LDA MEMTOP+1 + STA LastMemPageClear+2 + LDY MEMTOP + LDA #$00 +LastMemPageClear + STA $8000,Y + DEY + 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 +tempToFileEndL + .BY $00 + .endl +JAkieTurbo +USmode + .BY $01 ; 0 - brak turbo 1 - Ultra Speed +QMEG + .BY $01 ;1 - brak QMEGa 0 - jest QMEG +BootDrive + .BY $00 ;Numer stacji dysków z której sie BOOT robi +BootShift + .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety +FolderTurbo + .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT +NewColors + .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F + ORA #$30 + CMP #$3A + BCC labelka + CLC + ADC #$07 +labelka + RTS +Edriver + .BY "E:",$9b +EditorOpen + ; otwarcie ekranu !!! + LDX #$00 ; kanal nr 0 + JSR CloseX ; najpierw Zamkniecie Ekranu + BMI ErrorDisplay + LDX #$00 ; kanal nr 0 + LDA #$03 + STA ICCMD,X + LDA #$0C + STA ICAX1,X + STA ICBUFL,X + LDA #$00 + STA ICAX2,X + STA ICBUFL+1,X + LDA #Edriver + STA ICBUFA+1,X + JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 + BMI ErrorDisplay + RTS + +mainprog + LDA QMEG ; jesli jest QMEG to wylacza sie tryb US + AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza + STA USmode + BEQ NoUSSpeed + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler + ldy #blokDanychIO_GetUSSpeed + jsr Table2DCB + jsr JSIOINT ; wysylamy "?" + bpl USSpeed + lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage + sta USmode + beq NoUSSpeed +USSpeed + LDY #$2 +USstatprint + LDA ONtext,y + STA USstatus,y + DEY + bpl USstatprint + +NoUSSpeed + JMP ReadMainDir +Error148 + LDY #$94 ; kod bledu do Y + ; wyswietlenie komunikatu o bledzie - kod bledu w Y +ErrorDisplay + TYA + PHA + JSR Close1 + PLA + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex ; 4 starsze bity na HEX + STA ErrorNumHex + PLA + JSR bin2AsciiHex ; 4 mlodsze bity na HEX + STA ErrorNumHex+1 + JSR PrintXY + .BY $00,$00 + .BY $7d ; kod czyszczenia ekranu + .BY "ERROR - $" +ErrorNumHex + .BY "00",$00 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + STA KBCODES ; w A jest $FF + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie przechodzimy na te z ktorej sie ladowalismy + LDA BootDrive + ;LDA #1 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ; i odpalamy program od nowa +ReadMainDir + JSR ReadPERCOM + LDX #>FirstSectorBuff + LDY #= 4.39 (moga byc sektory wieksze niz 256b) + BNE Error148 ; Nieobslugiwany format dyskietki +SpartaDisk + LDX #$00 +; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 + LDA FirstSectorBuff+$1F + BMI Sektor128b + TAX + LDA #$00 + INX ; i wyliczenie starszego bajtu +Sektor128b + STA .adr loader.SecLen ; przed przepisaniem + STX .adr loader.SecLen+1 ; przed przepisaniem + ; pokazanie na ekranie + LDA DensityCodes,X + STA DensityDisplay +; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + LDY FirstSectorBuff+$09 + LDX FirstSectorBuff+$0A +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR +; ustawienie znacznika wlaczenia Turbo dla katalogu + LDA #$01 + STA FolderTurbo + STY DirMapSect + STX DirMapSect+1 + LDA #>DirSectorBuff + STA CurrentFileInfoBuff+1 + STA CurrentDirBuf+1 + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 + LDA #$00 + STA NamesOnScreen +label68 + LDA CurrentFileInfoBuff+1 + CMP CurrentDirBufEnd+1 + BCC NoLastFileInDir + BNE LastFilesPageJump + LDA CurrentFileInfoBuff + CMP CurrentDirBufEnd + BCS LastFilesPageJump +NoLastFileInDir + LDY #$00 + LDA (CurrentFileInfoBuff),Y + BEQ LastFilesPageJump + LDX #$22 + LDA #$20 ; spacja +label50 + STA GameName,X + DEX + BPL label50 + LDY #$10 + LDX #$0A +label51 + LDA (CurrentFileInfoBuff),Y + STA GameName,X + DEY + DEX + BPL label51 + LDA NamesOnScreen + CLC + ADC #$41 ; literka "A" + STA GameKeySymbol + LDA $D8 + BNE label52 + LDY #$00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y + AND #$19 + CMP #$09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 + LDX $D7 + BEQ label54 + CMP #$08 + BNE label54 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y + AND #$20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 +label56 + LDA SubDirText,X + STA GameName+12 + DEX + BPL label56 +label55 + JMP GameNamePrint +LastFilesPageJump + JMP LastFilesPage +label54 + JMP label59 +label52 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + AND #$18 + CMP #$08 + BNE label54 + LDA CurrentDirBufEnd + STA $D4 + LDA CurrentDirBufEnd+1 + STA $D5 +label65 + LDA $D5 + CMP $CF + BCC label60 + BNE label54 + LDA $D4 + CMP $CE + BCS label54 +; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy +label60 + LDY #$00 + LDA ($D4),Y + CMP #'*' + BNE CompareNames + STA NewColors + JSR Asteriks +CompareNames +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT + LDY #$0A ; 8+3 znaki +Checking62 + LDA ($D4),Y + CMP GameName,Y + BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw + DEY + BPL Checking62 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku +ReplacingName + LDA ($D4),Y + STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania + INY + CPY #$2E + BCC ReplacingName + BCS GameNamePrint +CheckNextName + LDA $D4 + CLC + ADC #$2E + STA $D4 + BCC label64 + INC $D5 +label64 + JMP label65 +GameNamePrint + LDA NamesOnScreen + CLC + ADC #$02 + STA YposGameName + JSR PrintXY + .BY $01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " +GameName + .BY " " + .BY $00 + LDA NamesOnScreen + ASL + TAX + LDA CurrentFileInfoBuff + STA FirstSectorsTable,X + LDA CurrentFileInfoBuff+1 + STA FirstSectorsTable+1,X + LDA CurrentFileInfoBuff + CLC + ADC #$17 + STA CurrentFileInfoBuff + BCC label66 + INC CurrentFileInfoBuff+1 +label66 + INC NamesOnScreen + LDA NamesOnScreen + CMP #$13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 +label59 + LDA CurrentFileInfoBuff + CLC + ADC #$17 + STA CurrentFileInfoBuff + BCC label69 + INC CurrentFileInfoBuff+1 +label69 + JMP label68 +MainDirKEY + JMP ReadMainDir +UpDirKEY + LDY #$02 + LDA (CurrentDirBuf),Y + TAX + DEY + ORA (CurrentDirBuf),Y + BEQ KeyboardProc + LDA (CurrentDirBuf),Y + TAY + JMP ReadDIR +EscKEY + ; sprawdzmy czy z Shift + LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! + and #$08 + BNE NoSHIFTEsc + JSR EditorOpen + JMP (DOSVEC) +NoSHIFTEsc + LDX #$00 + STX $D8 + INX + STX $D7 +ToStartOfDirJump + JMP ToStartOfDir +SpaceKEY + LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy + BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku + JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej +; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie +ContArrowsPrint + JSR PrintXY + .BY $01,$15 + .BY $1D ; strzalka w dol + .BY $00 + JSR PrintXY + .BY $0E,$15 + .BY $1D ; strzalka w dol + .BY $00 + JMP KeyboardProc +LastFilesPage + INC LastFilesPageFlag +KeyboardProc + LDA NewColors + BNE ColorsAlreadySet + LDA #$C4 ; ustawienie koloru tła i liter + STA COLPF2S + STA COLBAKS + LDA #$CA + STA COLPF1S +ColorsAlreadySet + JSR GetKey + AND #%01111111 ; eliminujemy invers + BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + CMP #$3E ; ">" + BEQ MainDirKEY + CMP #$3C ; "<" + BEQ UpDirKEY + CMP #$7E ; BackSpace + BEQ UpDirKEY + CMP #$1B ; Esc + BEQ EscKEY + CMP #$20 ; Spacja + BEQ SpaceKEY + ; ---------------- + ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + CMP #$10 + BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + JSR SeTDriveLetter + JMP mainprog +noCtrlLetter + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR + JMP mainprog + ; ----------------- +NoNumber + CMP #'a' ; czy nie ma capsa + BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany + SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) +BigLetters + SEC + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie + BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz + ASL + TAX + LDA FirstSectorsTable,X + STA $D4 + LDA FirstSectorsTable+1,X + STA $D5 + LDY #$00 + LDA ($D4),Y + AND #$20 ; sprawdzamy czy to klatalog czy plik + BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader + ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran + LDY #$02 + LDA ($D4),Y + TAX + DEY + LDA ($D4),Y + TAY + JMP ReadDIR +SubDirText + .BY "" +GOtoLoader + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiskNotChanged1 + JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego +DiskNotChanged1 + LDA FolderTurbo + BEQ SetTurboOFF + LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT +SetTurboOFF + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO+$A ; od razu do bloku IOCB + INY + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO+$B ; od razu do bloku IOCB + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.tempToFileEndL + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.ToFileEndH+1 ; przed przepisaniem +; wszystko zapamietane mozna robic mape sektorow.... +; skompresowana mapa bedzie tworzona w buforze sektora katalogu +; czyli DirSectorBuff +; sektor mapy przed kompresja leci do DirMapSectorBuff +; UWAGA +; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi +; zawierac rozkaz przeczytania pierwszego sektora!!!!! +CompressedMap = DirSectorBuff +; czytamy pierwszy sektor mapy + LDY #DirMapSectorBuff + Jsr ReadSector +; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! + LDA #00 + STA CompressedMapCounter + STA CompressedMapCounter+1 + JSR AddToCompressedMAP + LDA DirMapSectorBuff+4 + STA PrevFileSector + JSR AddToCompressedMAP + LDA DirMapSectorBuff+5 + sta PrevFileSector+1 + JSR AddToCompressedMAP + ; Inicjujemy liczniki + .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 + .zpvar PrevFileSector, MapPositionMem .word + .zpvar SectorOffset .word + .zpvar SectorsCounter .byte + LDA #$00 + STA MapCounter+1 + STA SectorsCounter + lda #$06 + STA MapCounter +GenerateCompressedMap + CLC + LDA #DirMapSectorBuff + ADC MapCounter+1 + STA MAPPositionMem+1 + LDX #0 + LDY #1 + LDA (MAPPositionMem,x) + ORA (MAPPositionMem),y + BEQ Sector00 + SEC + LDA (MAPPositionMem,x) + SBC PrevFileSector + STA SectorOffset + LDA (MAPPositionMem),y + SBC PrevFileSector+1 + STA SectorOffset+1 + ; mamy odstep miedzy poprzednim a nastepnym sektorem + BNE OffsetToBig + LDA SectorOffset + BMI OffsetToBig ; max przeskok 127 sektorow + CMP #$01 + BNE JumpForward + ; kolejny sektor + ; zwiekszamy wiec licznik + inc SectorsCounter + LDA SectorsCounter + CMP #%01111111 + BNE GetNextMapWord + ; tu licznik dotarl do konca zerujemy go + ; dodajemy wpis do skompresowanej mapy i gotowe + JSR AddToCompressedMAP + LDA #0 + STA SectorsCounter + BEQ GetNextMapWord +; ominiecie wyznaczonej ilości sektorów (w A) +JumpForward + JSR FlushBuffer + LDA SectorOffset + ORA #%10000000 + JSR AddToCompressedMAP + JMP GetNextMapWord +; wyznaczenie skoku do nowego sektora pliku +OffsetToBig + JSR FlushBuffer + LDA #0 + JSR AddToCompressedMAP + LDY #00 + LDA (MAPPositionMem),y + JSR AddToCompressedMAP + LDY #01 + LDA (MAPPositionMem),y + JSR AddToCompressedMAP +GetNextMapWord + ; zapamietanie numeru obecnego sektora do porownania potem + LDY #00 + LDA (MAPPositionMem),y + STA PrevFileSector + INY + LDA (MAPPositionMem),y + STA PrevFileSector+1 +Sector00 + ADW MapCounter #2 +ops01 + ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala + LDA MapCounter+1 + CMP .adr loader.SecLen+1 + bne noteqal01 + LDA MapCounter + CMP .adr loader.SecLen +noteqal01 + JNE GenerateCompressedMap +; czytamy nastepny sektor mapy + ; sprawdzmy czy nie koniec + LDA DirMapSectorBuff + ORA DirMapSectorBuff+1 + BEQ EndMakingMap + LDA DirMapSectorBuff + sta blokDanychIO+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO+$B + LDY #DirMapSectorBuff + Jsr ReadSector + ; zerujemy licznik mapy + LDA #$00 + STA MapCounter+1 + lda #$04 + STA MapCounter + JMP GenerateCompressedMap +; dpisanie bajtu z A do mapy sektorow skompresowanej +AddToCompressedMAP + PHA + ; wyliczamy adresa + CLC + LDA CompressedMapCounter + ADC #CompressedMap + STA xxxxbla+1 + PLA +xxxxbla=*+1 + STA $FFFF + INC CompressedMapCounter + BNE noinc013 + INC CompressedMapCounter+1 +noinc013 + RTS +FlushBuffer + LDA SectorsCounter + BEQ NoFlush + JSR AddToCompressedMAP + LDA #0 + STA SectorsCounter +NoFlush + RTS +EndMakingMap + JSR FlushBuffer + LDY #$00 + STY COLDST + LDA #$01 + STA BOOT + LDX $700 + CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta + BNE NoRunFromDOS + STA $03F8 ; to wylaczalo BASIC !!! +; STA $D5EC ; to wylacza SpartaDOS X +; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) +NoRunFromDOS + LDA #AfterWormStart + STA DOSINI+1 +; LDA #>JRESETCD +; STA DOSVEC+1 +; LDA #TempMEMLO + ADC .adr loader.SecLen+1 + STA MEMLO+1 + STA CompressedMapPos+1 + STA pointerMov2b +; STA APPMHI+1 + ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora + ; jest to jednoczesnie adres umieszczenia skompresowanej + ; mapy sektorow pliku dla loadera ale MINUS 1 + DEW CompressedMapPos + ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej + ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) + CLC + LDA MEMLO + ADC CompressedMapCounter + STA MEMLO + STA TurboRelocADDR + LDA MEMLO+1 + ADC CompressedMapCounter+1 + STA MEMLO+1 + STA TurboRelocADDR+1 + LDA #JTESTROM + STA DOSINI+1 +; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) +; INC $033D ; bajty kontrolne zimnego startu +; INC $033E ; zmiana ich wartosci wymusza +; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) + LDX #$00 + STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) +; STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X + STA $0700,X + LDA movedproc+$0100,X + STA $0800,X + INX + BNE moveloop1 +; przepisanie skompresowanej mapy sektorow pliku za bufor sektora +moveloop2 + DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy +pointerMov2a=*+2 + LDA CompressedMap,x ; kod samomodyfikujacy sie +pointerMov2b=*+2 + STA $FFFF,x ; kod samomodyfikujacy sie + LDA CompressedMapCounter + AND CompressedMapCounter+1 + CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! + BEQ SectorMapReady + INX + BNE moveloop2 + inc pointerMov2a + inc pointerMov2b + bne moveloop2 +SectorMapReady + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + + LDX #$00 + TXA +; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) +ClearLoop1 + STA $0100,X ; STOS !!! + STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) + STA $0500,X + STA $0600,X + CPX #$80 ;tylko ponad $80 + BCC NoZpage + STA $00,X ; czyli polowa strony zerowej +NoZpage + INX + BNE ClearLoop1 + LDX #$FF + TXS ; "wyzerowanie wskaznika STOSU + + JMP loader.LoadStart ; po przepisaniu +; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba +; na koniec odpowiednie zmodyfikowanie MEMLO +ADDspeedProc + LDA USmode + beq NoHappyLoader +; wyznaczamy offset procedury + SEC + LDA #HappyUSMovedProc + SBC MEMLO+1 + STA HappyOffset+1 + + LDY #0 + LDX #[$A-1] ;xjsrA - the last + ; relokujemy skoki pod offset z MEMLO +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC HappyOffset + STA (SecBuffer),y + INY + LDA (SecBuffer),y + SBC HappyOffset+1 + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + LDX #[EndHappyUSProc-HappyUSMovedProc-1] +label72x + LDA HappyUSMovedProc,X +TurboRelocADDR=*+1 + STA $0A00,X + DEX + CPX #$FF + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA + CLC + ADC MEMLO + STA MEMLO + TXA + ADC MEMLO+1 + STA MEMLO+1 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS + + + +; UWAGA !!!!!!!!!!!!!! +; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! +; powiekszenie jej O BAJT spowoduje ze przekroczy strone +; i nie przepisze sie prawidlowo na swoje miejsce !!!!! +HappyUSMovedProc ; + + LDA DBUFA + STA SecBuffer + LDA DBUFA+1 + STA SecBuffer+1 + + LDA DBYT + STA SecLenUS + + SEI + TSX + STX StackCopy + LDA #$0D + STA CRETRYZ + ;command retry on zero page +CommandLoop +HappySpeed = *+1 + LDA #$28 ;here goes speed from "?" + STA AUDF3 + LDA #$34 + STA PBCTL ;ustawienie linii command + LDX #$80 +DelayLoopCmd + DEX + BNE DelayLoopCmd + STX AUDF4 ; zero + STX TransmitError +; pokey init + LDA #$23 +xjsr1 JSR SecTransReg + ; + + CLC + LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + ADC DUNIT ; dodajemy numer stacji + ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + STA CheckSum + STA SEROUT + LDA DCOMND +xjsr2 JSR PutSIOByte + LDA DAUX1 +xjsr3 JSR PutSIOByte + LDA DAUX2 +xjsr4 JSR PutSIOByte + LDA CheckSum +xjsr5 JSR PutSIOByte + +waitforEndOftransmission + LDA IRQST + AND #$08 + BNE waitforEndOftransmission + + LDA #$13 +xjsr6 JSR SecTransReg + + LDA #$3c + STA PBCTL ;command line off +; two ACK's + LDY #2 +DoubleACK +xjsr7 JSR GetSIOByte + CMP #$44 + BCS ErrorHere + DEY + BNE DoubleACK + + ;ldy #0 + STY CheckSum +ReadSectorLoop +xjsr8 JSR GetSIOByte + STA (SecBuffer),y +xjsr9 JSR AddCheckSum + INY + CPY SecLenUS + BNE ReadSectorLoop + +xjsrA JSR GetSIOByte + CMP CheckSum + BEQ EndOfTransmission +;error!!! +ErrorHere + LDY #$90 + STY TransmitError + LDX StackCopy + TXS + DEC CRETRYZ + BNE CommandLoop + +EndOfTransmission + LDA #0 + STA AUDC4 + LDA IRQENS + STA IRQEN + CLI + LDY TransmitError + RTS + +SecTransReg + STA SKCTL + STA SKSTRES + LDA #$38 + STA IRQEN + LDA #$28 + STA AUDCTL + LDA #$A8 + STA AUDC4 + RTS + +PutSIOByte + TAX +waitforSerial + LDA IRQST + AND #$10 + BNE waitforSerial + + STA IRQEN + LDA #$10 + STA IRQEN + + TXA + STA SEROUT + +AddCheckSum + CLC + ADC CheckSum + ADC #0 + STA CheckSum + RTS + +GetSIOByte + LDX #10 ;acktimeout +ExternalLoop + LDA #0 + STA looperka +InternalLoop + LDA IRQST + AND #$20 + BEQ ACKReceive + DEC looperka + BNE InternalLoop + DEX + BNE ExternalLoop + BEQ ErrorHere +ACKReceive + ; zero we have now + STA IRQST + LDA #$20 + STA IRQST + LDA SKSTAT + STA SKSTRES + AND #$20 + BEQ ErrorHere + ; + LDA SERIN + RTS +EndHappyUSProc + + +; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO_GetUSSpeed + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 +label39 + STA $DA + LDA CurrentFileInfoBuff + STA $DB + LDA CurrentFileInfoBuff+1 + STA $DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 + PLA + PLA + JMP ReadMainDir +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect + STA blokDanychIO+10 + LDA DirMapSect+1 + STA blokDanychIO+11 + ORA blokDanychIO+10 + BEQ DirMapEnd + LDX #>DirMapSectorBuff + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y + STA blokDanychIO+10 + INY + LDA (TempZP),Y + STA blokDanychIO+11 + ORA blokDanychIO+10 + BEQ label75 + ; i zwiekszenie wskaznika mapy o 2 + INY + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + LDA MEMTOP + SEC + SBC CurrentFileInfoBuff + LDA MEMTOP+1 + SBC CurrentFileInfoBuff+1 + BEQ label75 + LDY CurrentFileInfoBuff + LDX CurrentFileInfoBuff+1 + JSR ReadSector + LDA $D4 + ORA $D5 + BNE label79 + LDY #$03 + LDA (CurrentFileInfoBuff),Y + STA $D4 + INY + LDA (CurrentFileInfoBuff),Y + STA $D5 + INY + LDA (CurrentFileInfoBuff),Y + BEQ label79 + LDA #$FF + STA $D4 + STA $D5 +label79 + LDA CurrentFileInfoBuff + CLC + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff + LDA CurrentFileInfoBuff+1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 + LDA $D4 + SEC + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 + LDA $D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 + BCS label80 + LDA CurrentFileInfoBuff + CLC + ADC $D4 + STA CurrentFileInfoBuff + LDA CurrentFileInfoBuff+1 + ADC $D5 + STA CurrentFileInfoBuff+1 +label75 + LDA $DC + CMP CurrentFileInfoBuff+1 + BCC label81 + BNE label82 + LDA $DB + CMP CurrentFileInfoBuff + BCC label81 + BNE label82 + RTS +label81 + LDA $DB + CLC + ADC $DA + STA $DB + BCC label75 + INC $DC + JMP label75 +label82 + LDA $DB + SEC + SBC $DA + STA CurrentFileInfoBuff + LDA $DC + SBC #$00 + STA CurrentFileInfoBuff+1 + RTS +; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora +ReadPERCOM + LDA #$04 + STA DiskRetryCount +ReadPERCOMretry + LDY #blokDanychIO_PERCOM + JSR Table2DCB + JSR GoSIO + BMI PercomError + ; blok odczytany - ustawmy dlugosc 1 sektora + LDA PERCOMdata+6 + CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + RTS +PercomError + DEC DiskRetryCount + BNE ReadPERCOMretry + ; blok nieodczytany - dlugosc 1 sektora na $80 +Set1Sect128 + LDA #$00 + STA PERCOMdata+6 + LDA #$80 + STA PERCOMdata+7 + RTS +blokDanychIO_PERCOM + .BY $31,$01,$4E,$40 + .WO PERCOMdata + .BY $0A,$00,12,$00,$01,$00 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 + STA blokDanychIO+10 + LDA #$00 + STA blokDanychIO+11 + LDA PERCOMdata+6 + STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + LDA PERCOMdata+7 + JMP ReadSector1 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +ReadSector1 + STA blokDanychIO+8 + STX blokDanychIO+5 + STY blokDanychIO+4 + LDA #$04 + STA DiskRetryCount +DiskReadRetry + LDY #blokDanychIO + JSR Table2DCB + JSR GoSIO + BMI label85 + RTS +label85 + DEC DiskRetryCount + BNE DiskReadRetry + PLA + PLA + JMP ErrorDisplay +blokDanychIO + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 +DiskRetryCount + .BY $00 +PrintXY + PLA + STA $C8 + PLA + STA $C9 + LDA #$00 + STA $DF + JSR label87 + PHA + JSR label87 + STA $DE + ASL + ASL + CLC + ADC $DE + ASL + ASL + ROL $DF + ASL + ROL $DF + CLC + ADC SAVMSC + STA $DE + LDA $DF + ADC SAVMSC+1 + STA $DF + PLA + TAY +label92 + JSR label87 + CMP #$00 + BEQ label88 + CMP #$7D + BEQ label89 + LDX #$00 + STX $E0 + CMP #$80 + ROR $E0 + AND #$7F + CMP #$20 + BCS label90 + ORA #$40 + BNE label91 +label90 + CMP #$60 + BCS label91 + SEC + SBC #$20 +label91 + ORA $E0 + STA ($DE),Y + INY + JMP label92 +label89 + TYA + PHA + LDA SAVMSC + STA $E0 + LDA #$03 + TAX + CLC + ADC SAVMSC+1 + STA $E1 + LDY #$BF + LDA #$00 +label93 + STA ($E0),Y + DEY + CPY #$FF + BNE label93 + DEC $E1 + DEX + BPL label93 + PLA + TAY + JMP label92 +label88 + LDA $C9 + PHA + LDA $C8 + PHA + RTS +label87 + INC $C8 + BNE label94 + INC $C9 +label94 + LDX #$00 + LDA ($C8,X) + RTS +GoErrorDisp + JMP ErrorDisplay +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 + STX IOtableAddr+2 + LDX #$0B +IOtableAddr + LDA $FFFF,X + STA DDEVIC,X + DEX + BPL IOtableAddr + RTS +Close1 + LDX #$10 +CloseX + LDA #$0C + STA ICCMD,X + JMP JCIOMAIN +GetKey + LDX #$10 + LDA #$03 + STA ICCMD,X + LDA #$04 + STA ICAX1,X + LDA #$00 + STA ICAX2,X + STA ICBUFL+1,X + LDA #$FF + STA ICBUFL,X + LDA #Kdriver + STA ICBUFA+1,X + JSR JCIOMAIN + BMI GKeyError + LDX #$10 + LDA #$00 + STA ICBUFL,X + STA ICBUFL+1,X + LDA #$07 + STA ICCMD,X + JSR JCIOMAIN + BMI GKeyError + PHA + JSR Close1 + BMI GKeyError + PLA + RTS +GKeyError + JMP GoErrorDisp +Kdriver + .BY "K:",$9B +DiscChangeCheck + LDY #DirMapSectorBuff + JSR ReadFirstSect + LDX #$7F +label98 + LDA FirstSectorBuff,X + CMP DirMapSectorBuff,X + BNE ChangedD + DEX + BPL label98 + LDA #$00 +ChangedD + RTS + ; obsluga gwiazdki + ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * + ; w Y jest ) - X moze lepiej nie ruszac :) +Asteriks + LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + JSR GetHexNumber + STA COLPF1S ; literki + INY + JSR GetHexNumber + STA COLPF2S ; tlo + INY + JSR GetHexNumber + STA COLBAKS ; ramka + INY + JSR GetHexNumber + STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + RTS + ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX + ; i zamienia na bajt w A +GetHexNumber + JSR GetHEX4bits + ASL + ASL + ASL + ASL + STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + INY + JSR GetHEX4bits + ORA TempZP + RTS +GetHEX4bits + LDA ($D4),Y + SEC + SBC #'0' + CMP #$0A ; sprawdzmy czy cyfra + BCC IsNumber + SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow +IsNumber + RTS + ; Ustawia numer satcji wg A +SeTDriveNR + CMP #$09 + BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + JSR SeTblokDanychDrive + CLC + ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + STA DriveDisp1 + LDA #'D'+$80 ; literka D przed numerem napedu + STA DriveDisp1-1 + RTS +SeTDriveLetter + JSR SeTblokDanychDrive + CLC + ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + STA DriveDisp1 + LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + STA DriveDisp1-1 + RTS +SeTblokDanychDrive + STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + STA blokDanychIO+1 + STA blokDanychIO_GetUSSpeed+1 + STA blokDanychIO_PERCOM+1 + RTS +; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku +MEMLOprint + LDA MEMLO + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex + STA MEMLOvalue+2 + PLA + JSR bin2AsciiHex + STA MEMLOvalue+3 + LDA MEMLO+1 + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex + STA MEMLOvalue + PLA + JSR bin2AsciiHex + STA MEMLOvalue+1 + JSR PrintXY + .BY 28,23 + .BY "MEMLO: $" +MEMLOvalue + .BY "0000" + .BY $00 + RTS + +; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo + +xjsrTableL + .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + .BY <[xjsr4+1],<[xjsr5+1] + .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + .BY <[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + .BY >[xjsr4+1],>[xjsr5+1] + .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + .BY >[xjsr9+1],>[xjsrA+1] +; miejsce na wyliczony offset o jaki przesuwamy procedure +HappyOffset + .WO $0000 +; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) +DensityCodes + .by +$80,"sdq" + ;.by "SDQ" + ;.by $0e,$15,$a0 +ONtext + .BY +$80,"ON " +OFFtext + .BY +$80,"OFF" +; miejsce na przechowanie stanu urzadzen PBI (przez reset) +PDVMASKtemp + .BY $00 +; miejsce na blok PERCOM +PERCOMdata +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable=*+12 ; omijamy 12b na percom + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow +ProgramEnd=FirstSectorBuff +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu +FirstRun +; odnotowujemy stan Shift z Bootowania + LDA SKSTAT + and #$08 + BNE NoSHIFTboot + STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 +NoSHIFTboot +; Sprawdzamy czy jest basic i ustawiamy status na ekranie + LDA PORTB + AND #$02 + BNE BrakBasica + ; jest Basic + LDY #$2 +BASstatprint + LDA ONtext,y + STA BASstatus,y + DEY + bpl BASstatprint +BrakBasica +; Sprawdzamy istnienie QMEGa + ldy #$06 ; bo 6 znaków w ROMie testujemy +testQMEGloop + LDA $C001,y + CMP QMEGstring,y + bne brakQMEGa + dey + bpl testQMEGloop + ; jest QMEG + LDA #0 + STA QMEG + LDY #$2 +Qstatprint + LDA ONtext,y + STA QMEGstatus,y + DEY + bpl Qstatprint +brakQMEGa + ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi + LDA DDEVIC + clc + ADC DUNIT + sec + SBC #$01 + AND #$0F ; zapamietanie numeru urzadzenia + STA BootDrive + JSR SeTDriveNR + JSR EditorOpen + JMP mainprog +QMEGstring + .BY "QMEG-OS",0 + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" + ;.OPT List + + + org $02e0 + .WO START + ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) +; OPT h- +; org $0000 +; .WO $0000 + \ No newline at end of file diff --git a/msdos.lab b/msdos.lab new file mode 100644 index 0000000..c954bf5 --- /dev/null +++ b/msdos.lab @@ -0,0 +1,351 @@ +mads 2.1.6 build 65 (4 Jun 23) +Label table: +00 0247 PDVMASK +00 000A ACKTIMEOUT +00 0002 READTIMEOUT +00 0318 STACKP +00 0042 CRITIC +00 02BD DRETRY +00 030F CASFLG +00 029C CRETRY +00 0002 CASINI +00 0008 WARMST +00 0009 BOOT +00 000A DOSVEC +00 000C DOSINI +00 000E APPMHI +00 0010 IRQENS +00 0024 INBLOCKADDR +00 0026 TOBLOCKEND +00 0028 TOFILEENDL +00 003D COMPRESSEDMAPPOS +00 0030 CHECKSUM +00 0031 SECLENUS +00 0032 SECBUFFER +00 0034 CRETRYZ +00 0035 TRANSMITERROR +00 0036 LOOPERKA +00 0037 STACKCOPY +00 0058 SAVMSC +00 00CA CURRENTDIRBUF +00 00CC CURRENTDIRBUFEND +00 00D0 CURRENTFILEINFOBUFF +00 00D2 DIRMAPSECT +00 00D6 LASTFILESPAGEFLAG +00 00D9 NAMESONSCREEN +00 00E2 INMAPPOINTER +00 00E4 TEMPZP +00 020A VSERIN +00 02C5 COLPF1S +00 02C6 COLPF2S +00 02C8 COLBAKS +00 0244 COLDST +00 02E5 MEMTOP +00 02E7 MEMLO +00 02FC KBCODES +00 0300 DDEVIC +00 0301 DUNIT +00 0302 DCOMND +00 0304 DBUFA +00 0308 DBYT +00 030A DAUX1 +00 030B DAUX2 +00 0342 ICCMD +00 0344 ICBUFA +00 0348 ICBUFL +00 034A ICAX1 +00 034B ICAX2 +00 03FA GINTLK +00 D204 AUDF3 +00 D206 AUDF4 +00 D207 AUDC4 +00 D208 AUDCTL +00 D20A SKSTRES +00 D20D SEROUT +00 D20D SERIN +00 D20E IRQEN +00 D20E IRQST +00 D20F SKSTAT +00 D20F SKCTL +00 D303 PBCTL +00 D301 PORTB +00 D40B VCOUNT +00 E456 JCIOMAIN +00 E459 JSIOINT +00 E471 JTESTROM +00 E474 JRESETWM +00 E477 JRESETCD +00 084B FILESECBUFF +00 084B TEMPMEMLO +00 1FFD START +00 2000 MOVEDPROC +00 0700 LOADER +00 0700 LOADER.TOFILEENDH +00 0702 LOADER.FILEINIT +00 071B LOADER.FILENEXTBLOCK +00 0727 LOADER.FILENOFFFFHEAD +00 073C LOADER.WHATISIT +00 074B LOADER.FILENOFIRSTBLOCK +00 0757 LOADER.BLOCKREADLOOP +00 0768 LOADER.NONEXTSECTOR1 +00 076A LOADER.FILESECBUFFHADDR1 +00 0771 LOADER.INBLOCKREADLOOP +00 0778 LOADER.LABEL15 +00 0782 LOADER.GOCHECKEOF +00 0787 LOADER.GOGETNEXTFILESECT +00 078C LOADER.FILEGETBLOCKSTART +00 0797 LOADER.GOINITADDR +00 079A LOADER.GETDATASECTOR +00 079A LOADER.READERRORLOOP +00 079C LOADER.SETDCB +00 07A5 LOADER.SIOJMP +00 07AB LOADER.BLOKDANYCHIO_LOADER +00 07B3 LOADER.SECLEN +00 07B5 LOADER.SECTORNUMBER +00 07B7 LOADER.CHECKEOF +00 07C1 LOADER.ENDOFFILE +00 07CA LOADER.FILEGETBYTE +00 07CE LOADER.NOTEOF +00 07DB LOADER.BYTETOACCU +00 07DD LOADER.FILESECBUFFHADDR2 +00 07E1 LOADER.INCREMENTATIONXH +00 07EA LOADER.GOTOSEC +00 07EB LOADER.JRTS +00 07EC LOADER.GETNEXTFILESECT +00 07EE LOADER.READNEXTINSEQUENCE +00 07EF LOADER.SECTORSEQUENCECOUNT +00 07FD LOADER.NOINCDAUX2 +00 07FF LOADER.NEXTMAPPOSITION +00 080F LOADER.HOWMANYTOSKIP +00 081D LOADER.NOINCDAUX2_V2 +00 081F LOADER.SETNEWSTARTSECTOR +00 082F LOADER.READYTOREAD +00 0843 LOADER.INCCOMPRESSEDMAPPOS +00 0849 LOADER.SKIPINCCOMPRESSEDMAPPOS +00 084A LOADER.INSECTORCOUNTH +00 084B LOADER.ZZZZZZ +00 084B LOADER.FIRSTMAPSECTORNR +00 084D LOADER.LOADSTART +00 0856 LOADER.OUTMEMCLEARLOOP +00 0858 LOADER.INMEMCLEARLOOP +00 0874 LOADER.LASTMEMPAGECLEAR +00 0895 LOADER.TEMPTOFILEENDL +00 2196 JAKIETURBO +00 2196 USMODE +00 2197 QMEG +00 2198 BOOTDRIVE +00 2199 BOOTSHIFT +00 219A FOLDERTURBO +00 219B NEWCOLORS +00 219C BIN2ASCIIHEX +00 21A7 LABELKA +00 21A8 EDRIVER +00 21AB EDITOROPEN +00 21D9 MAINPROG +00 21F7 USSPEED +00 21F9 USSTATPRINT +00 2202 NOUSSPEED +00 2205 ERROR148 +00 2207 ERRORDISPLAY +00 222E ERRORNUMHEX +00 2236 WAITKLOOP +00 2248 READMAINDIR +00 2261 SPARTADISK +00 226C SEKTOR128B +00 227E READDIR +00 22B7 LABEL46 +00 22C5 LABEL40 +00 22D3 LABEL43 +00 22E0 PROGNAME +00 22EB LABEL42 +00 22F6 LABEL45 +00 22F9 DATFILEFOUND +00 2319 LABEL47 +00 2330 TOSTARTOFDIR +00 2341 STATUSBARPRINT +00 2347 DENSITYDISPLAY +00 2349 DRIVEDISP1 +00 235C QMEGSTATUS +00 2364 BASSTATUS +00 236B USSTATUS +00 23E7 LABEL68 +00 23F5 NOLASTFILEINDIR +00 23FF LABEL50 +00 2409 LABEL51 +00 2430 LABEL53 +00 2438 LABEL56 +00 2441 LABEL55 +00 2444 LASTFILESPAGEJUMP +00 2447 LABEL54 +00 244A LABEL52 +00 245C LABEL65 +00 246A LABEL60 +00 2478 COMPARENAMES +00 247A CHECKING62 +00 2486 REPLACINGNAME +00 2492 CHECKNEXTNAME +00 249D LABEL64 +00 24A0 GAMENAMEPRINT +00 24AC YPOSGAMENAME +00 24AD GAMEKEYSYMBOL +00 24B0 GAMENAME +00 24ED LABEL66 +00 24F8 LABEL59 +00 2503 LABEL69 +00 2506 MAINDIRKEY +00 2509 UPDIRKEY +00 2519 ESCKEY +00 2526 NOSHIFTESC +00 252D TOSTARTOFDIRJUMP +00 2530 SPACEKEY +00 2537 CONTARROWSPRINT +00 2548 LASTFILESPAGE +00 254A KEYBOARDPROC +00 255C COLORSALREADYSET +00 2581 NOCTRLLETTER +00 2592 NONUMBER +00 2598 BIGLETTERS +00 25BF SUBDIRTEXT +00 25C8 GOTOLOADER +00 25D0 DISKNOTCHANGED1 +00 25DC SETTURBOOFF +00 25DF NOSHIFT +00 2F80 COMPRESSEDMAP +00 2634 GENERATECOMPRESSEDMAP +00 2673 JUMPFORWARD +00 2680 OFFSETTOBIG +00 2696 GETNEXTMAPWORD +00 26A1 SECTOR00 +00 26AC OPS01 +00 26B8 NOTEQAL01 +00 26E3 ADDTOCOMPRESSEDMAP +00 26F5 XXXXBLA +00 26FD NOINC013 +00 26FE FLUSHBUFFER +00 2709 NOFLUSH +00 270A ENDMAKINGMAP +00 2720 NORUNFROMDOS +00 2731 AFTERWORMSTART +00 277D MOVELOOP1 +00 278C MOVELOOP2 +00 2796 POINTERMOV2A +00 2799 POINTERMOV2B +00 27AD SECTORMAPREADY +00 27B6 CLEARLOOP1 +00 27C8 NOZPAGE +00 27D1 ADDSPEEDPROC +00 27EB HAPPYRELOCATE +00 280B LABEL72X +00 280F TURBORELOCADDR +00 281A LABEL73 +00 2835 NOHAPPYLOADER +00 2836 HAPPYUSMOVEDPROC +00 284D COMMANDLOOP +00 284E HAPPYSPEED +00 2859 DELAYLOOPCMD +00 2863 XJSR1 +00 2877 XJSR2 +00 287D XJSR3 +00 2883 XJSR4 +00 2888 XJSR5 +00 288B WAITFORENDOFTRANSMISSION +00 2894 XJSR6 +00 289E DOUBLEACK +00 289E XJSR7 +00 28AA READSECTORLOOP +00 28AA XJSR8 +00 28AF XJSR9 +00 28B7 XJSRA +00 28BE ERRORHERE +00 28C9 ENDOFTRANSMISSION +00 28D7 SECTRANSREG +00 28ED PUTSIOBYTE +00 28EE WAITFORSERIAL +00 2901 ADDCHECKSUM +00 2909 GETSIOBYTE +00 290B EXTERNALLOOP +00 290F INTERNALLOOP +00 291F ACKRECEIVE +00 2935 ENDHAPPYUSPROC +00 2935 BLOKDANYCHIO_GETUSSPEED +00 2941 DIRMAPEND +00 2944 LABEL39 +00 2958 DISCNOTCHANGED2 +00 2980 LABEL80 +00 298E NONEXTMAPSECTOR +00 29B0 NOINCH +00 29E0 LABEL79 +00 2A0D LABEL75 +00 2A1E LABEL81 +00 2A2C LABEL82 +00 2A3A READPERCOM +00 2A3F READPERCOMRETRY +00 2A53 PERCOMERROR +00 2A58 SET1SECT128 +00 2A63 BLOKDANYCHIO_PERCOM +00 2A6F READFIRSTSECT +00 2A85 READSECTOR +00 2A8E READSECTOR1 +00 2A9C DISKREADRETRY +00 2AA9 LABEL85 +00 2AB3 BLOKDANYCHIO +00 2ABF DISKRETRYCOUNT +00 2AC0 PRINTXY +00 2AEC LABEL92 +00 2B09 LABEL90 +00 2B10 LABEL91 +00 2B18 LABEL89 +00 2B2A LABEL93 +00 2B3B LABEL88 +00 2B42 LABEL87 +00 2B48 LABEL94 +00 2B4D GOERRORDISP +00 2B50 GOSIO +00 2B58 STANDARDSPEED +00 2B5B TABLE2DCB +00 2B63 IOTABLEADDR +00 2B6D CLOSE1 +00 2B6F CLOSEX +00 2B77 GETKEY +00 2BBB GKEYERROR +00 2BBE KDRIVER +00 2BC1 DISCCHANGECHECK +00 2BCA LABEL98 +00 2BD7 CHANGEDD +00 2BD8 ASTERIKS +00 2BF6 GETHEXNUMBER +00 2C06 GETHEX4BITS +00 2C11 ISNUMBER +00 2C12 SETDRIVENR +00 2C25 SETDRIVELETTER +00 2C34 SETBLOKDANYCHDRIVE +00 2C41 MEMLOPRINT +00 2C78 MEMLOVALUE +00 2C7E XJSRTABLEL +00 2C88 XJSRTABLEH +00 2C92 HAPPYOFFSET +00 2C94 DENSITYCODES +00 2C97 ONTEXT +00 2C9A OFFTEXT +00 2C9D PDVMASKTEMP +00 2C9E PERCOMDATA +00 2CAA FIRSTSECTORSTABLE +00 2D00 FIRSTSECTORBUFF +00 2D00 PROGRAMEND +00 2D80 DIRMAPSECTORBUFF +00 2F80 DIRSECTORBUFF +00 2C9E FIRSTRUN +00 2CA8 NOSHIFTBOOT +00 2CB1 BASSTATPRINT +00 2CBA BRAKBASICA +00 2CBC TESTQMEGLOOP +00 2CCE QSTATPRINT +00 2CD7 BRAKQMEGA +00 2CEF QMEGSTRING +00 0080 MAPCOUNTER +00 0082 COMPRESSEDMAPCOUNTER +00 0084 MAPCOUNTERMEM +00 0086 PREVFILESECTOR +00 0088 MAPPOSITIONMEM +00 008A SECTOROFFSET +00 008C SECTORSCOUNTER diff --git a/msdos.lst b/msdos.lst new file mode 100644 index 0000000..9be7ab7 --- /dev/null +++ b/msdos.lst @@ -0,0 +1,2129 @@ +mads 2.1.6 build 65 (4 Jun 23) +Source: msdos.asm + 1 ;MICRO SPARTA DOS 4.7 + 2 + 3 ; w wersji 4.7 dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami + 4 ; "prawo"/"lewo" albo "gora"/"dol" ... ... ale to b.trudne + 5 ; ze wzgledu na mozliwosc roznej liczby plikow (stron) w zaleznosci czy wyswietlamy + 6 ; dlugie nazwy czy nie - nie da sie tego latwo zliczyc + 7 + 8 ; dodany "Backspace" jako powrot do katalogu wyzej. + 9 + 10 ; w wersji 4.6c zmieniony sposob rozpoznawania wielkosci sektora, dodane czytanie + 11 ; bloku PERCOM przy zmianie dysku... + 12 ; UWAGA! Bufor na pierwszy sektor ma dalej 128b, bezposrednio za nim jest bufor na sektor + 13 ; mapy, ktory moze byc zamazywany w chwili odczytu pierwszego sektora bez problemow. + 14 + 15 + 16 ; w wersji 4.6b poprawione dwa male bugi i dodane kulturalne wyjscie do DOS (Shift+Esc) ... + 17 ; ..... moznaby w tym momencie sprawdzac czy jest w ogole DOS w pamieci, bo bez DOS bedzie SelfTest + 18 + 19 ; w wersji 4.6 wyeliminowane chwilowe przelaczanie na domyslne kolory, różne poprawki procedur, + 20 ; żeby więcej gier się uruchamiało (zmiany w resecie i zmiennych systemowych) + 21 + 22 ; w wersji 4.5 obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera + 23 ; wyswietlanie "numeru" napedu w zaleznosci jak sie go wybierze (Dn: lub n: - cyfra lub litera) + 24 + 25 ; w wersji 4.4 (niepublikowanej) poprawiony blad. Nie moze byc dwa razy po sobie znacznika dziury w skompresowanej mapie + 26 ; czyli dziura max 127 sektorow a nie jak porzednio 254 + 27 ; dodatkowo zapamietanie (na czas resetu przed czyszczeniem pamieci) + 28 ; stanu aktywnych urzadzen PBI i odtworzenie go po resecie (dzieki Drac030) + 29 + 30 ; stan urzadzen na szynie PBI + 31 = 0247 PDVMASK = $0247 + 32 + 33 ; nowa koncepcja zrobiona: + 34 + 35 ; 1. wywalić turbo 'top-drive' + 36 + 37 ; 2. przerobić loader i menu na obsługę sektorów dow. długości + 38 + 39 ; 3. przepisac czytanie tablicy sektorów indeksowych z loadera do menu: + 40 ; a. w menu odczytywane są wszystkie sektory tablicy indeksowej + 41 ; b. budowana jest "skompresowana" tablica offsetów w stosunku do pierwszego sektora na nast. zasadzie: + 42 ; mamy nast. znaczniki : (nowa koncepcja) + 43 ; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) . Opłaci się używać do max 255 sektorów do przeskoczenia. + 44 ; 0xxxxxxx -- (0xxxxxxx = ile kolejnych sektorów wczytać) + 45 ; 00000000 -- następne 2 bajty to numer kolejnego sektora do odczytania + 46 ; + 47 + 48 ; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo + 49 + 50 + 51 ;START ADDR = 1FFD + 52 ;END ADDR = 28C9 + 53 ;.OPT noList + 54 = 000A acktimeout = $a + 55 = 0002 readtimeout = 2 + 56 + 57 + 58 = 0318 STACKP = $0318 + 59 = 0042 CRITIC = $42 + 60 = 02BD DRETRY = $02BD + 61 = 030F CASFLG = $030F + 62 = 029C CRETRY = $029C + 63 + 64 + 65 = 0002 CASINI = $02 + 66 = 0008 WARMST = $08 + 67 = 0009 BOOT = $09 + 68 = 000A DOSVEC = $0a + 69 = 000C DOSINI = $0c + 70 = 000E APPMHI = $0e + 71 + 72 = 0010 IRQENS = $10 + 73 + 74 + 75 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) + 76 + 77 ; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku + 78 = 0024 InBlockAddr = $24 ; word + 79 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) + 80 = 0026 ToBlockEnd = $26 ; word + 81 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH + 82 = 0028 ToFileEndL = $28 + 83 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku + 84 + 85 = 0030 CheckSUM = $30 + 86 = 0031 SecLenUS = $31 + 87 = 0032 SecBuffer = $32 + 88 = 0034 CRETRYZ = $34 + 89 = 0035 TransmitError =$35 + 90 = 0036 Looperka = $36 + 91 = 0037 StackCopy = $37 + 92 + 93 + 94 = 0058 SAVMSC = $58 + 95 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego + 96 ; katalog + 97 = 00CA CurrentDirBuf = $CA + 98 ; adres konca tego bufora (2 bajty) + 99 = 00CC CurrentDirBufEnd = $CC + 100 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji + 101 ; o obrabianym pliku (skok co $17) + 102 = 00D0 CurrentFileInfoBuff = $D0 + 103 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) + 104 = 00D2 DirMapSect = $D2 + 105 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu + 106 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji + 107 ; ma byc wyswietlany katalog od poczatku + 108 = 00D6 LastFilesPageFlag = $D6 + 109 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony + 110 ; zawiera liczbe widocznych na ekranie plikow (1 bajt) + 111 = 00D9 NamesOnScreen = $D9 + 112 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna + 113 ; wczesniej byl 1 bajt w $D6 + 114 = 00E2 InMapPointer = $E2 + 115 ; zmienna tymczasowa na ZP (2 bajty) + 116 = 00E4 TempZP = $E4 + 117 + 118 = 020A VSERIN = $020a + 119 = 02C5 COLPF1S = $02c5 + 120 = 02C6 COLPF2S = $02c6 + 121 = 02C8 COLBAKS = $02c8 + 122 + 123 = 0244 COLDST = $0244 + 124 = 02E5 MEMTOP = $02e5 + 125 = 02E7 MEMLO = $02e7 + 126 + 127 = 02FC KBCODES = $02fc + 128 + 129 = 0300 DDEVIC = $0300 + 130 = 0301 DUNIT = $0301 + 131 = 0302 DCOMND = $0302 + 132 = 0304 DBUFA = $0304 + 133 = 0308 DBYT = $0308 + 134 = 030A DAUX1 = $030a + 135 = 030B DAUX2 = $030b + 136 + 137 = 0342 ICCMD = $0342 + 138 = 0344 ICBUFA = $0344 + 139 ;ICBUFA+1 = $0345 + 140 = 0348 ICBUFL = $0348 + 141 ;ICBUFL+1 = $0349 + 142 = 034A ICAX1 = $034a + 143 = 034B ICAX2 = $034b + 144 + 145 = 03FA GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta + 146 + 147 = D204 AUDF3 = $d204 + 148 = D206 AUDF4 = $d206 + 149 = D207 AUDC4 = $d207 + 150 = D208 AUDCTL = $d208 + 151 = D20A SKSTRES = $d20a + 152 = D20D SEROUT = $D20d + 153 = D20D SERIN = $D20d + 154 = D20E IRQEN = $D20e + 155 = D20E IRQST = $D20e + 156 + 157 + 158 = D20F SKSTAT = $d20f + 159 = D20F SKCTL = $d20f + 160 + 161 + 162 = D303 PBCTL = $d303 + 163 = D301 PORTB = $d301 + 164 + 165 = D40B VCOUNT = $D40B + 166 + 167 = E456 JCIOMAIN = $e456 + 168 = E459 JSIOINT = $e459 + 169 = E471 JTESTROM = $e471 + 170 = E474 JRESETWM = $e474 + 171 = E477 JRESETCD = $e477 + 172 + 173 org $1FFD + 174 + 175 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura + 176 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! + 177 = 084B FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu + 178 = 084B TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) + 179 + 180 START + 181 FFFF> 1FFD-2D5F> 4C 9E + JMP FirstRun ;1FFD 4C 70 21 + 182 + 183 + 184 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu + 185 ; do wczytania !!!!!! + 186 + 187 2000 movedproc + 188 0700 .local loader, $0700 + 189 + 190 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 + 191 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych + 192 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO + 193 0700 ToFileEndH + 194 0700 00 00 .WO $0000 + 195 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + 196 0702 8A TXA + 197 0703 48 PHA + 198 0704 A5 28 LDA ToFileEndL + 199 0706 48 PHA + 200 0707 A5 3D LDA CompressedMapPos + 201 0709 48 PHA + 202 070A A5 3E LDA CompressedMapPos+1 + 203 070C 48 PHA + 204 070D 20 97 07 JSR GoInitAddr + 205 0710 68 PLA + 206 0711 85 3E STA CompressedMapPos+1 + 207 0713 68 PLA + 208 0714 85 3D STA CompressedMapPos + 209 0716 68 PLA + 210 0717 85 28 STA ToFileEndL + 211 0719 68 PLA + 212 071A AA TAX + 213 071B FileNextBlock ; wczytanie kolejnego bloku binarnego + 214 071B 20 8C 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) + 215 071E 25 24 AND InBlockAddr + 216 0720 C9 FF CMP #$FF ; jesli oba sa $FF to..... + 217 0722 D0 03 BNE FileNoFFFFHead + 218 0724 20 8C 07 JSR FileGetBlockStart ; pobranie jeszcze raz + 219 0727 FileNoFFFFHead + 220 0727 20 CA 07 JSR FileGetByte ; Pobranie adresu konca ladowanego bloku + 221 072A E5 24 SBC InBlockAddr ; i wyliczenie jego dlugosci + 222 072C 49 FF EOR #$FF ; UWAGA! Dlugosc jest zEORowana z $FFFF + 223 072E 85 26 STA ToBlockEnd ; czyli odjeta od $10000 + 224 0730 08 PHP ; odliczanie ilosci pobranych bajtow jest wiec potem robione + 225 0731 20 CA 07 JSR FileGetByte ; przez dodawanie i sprawdzanie czy nie ZERO + 226 0734 28 PLP + 227 0735 E5 25 SBC InBlockAddr+1 + 228 0737 49 FF EOR #$FF + 229 0739 85 27 STA ToBlockEnd+1 + 230 073B 38 SEC + 231 073C WhatIsIt + 232 073C B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y + 233 ; ktory tylko wylacza skok !!! + 234 073E CE 3C 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! + 235 0741 A5 24 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ + 236 0743 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu + 237 0746 A5 25 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem + 238 0748 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). + 239 074B FileNoFirstBlock + 240 074B A9 EB LDA #Jrts ; jesli nie jest to blok z adresem inicjacji + 243 0752 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie + 244 0755 A0 00 LDY #$00 + 245 0757 BlockReadLoop ;; petla odczytujaca z pliku blok binarny + 246 0757 E6 28 INC ToFileEndL ;; zwiekszenie licznika bajtow w calym pliku i jesli ZERO + 247 0759 F0 27 BEQ GoCheckEOF ;; skok do procedury sprawdzajacej dwa starsze jego bajty + 248 075B EC B3 07 CPX SecLen ;; sprawdzenie czy juz caly sektor przepisany jesli tak + 249 075E D0 08 bne NoNextSector1 ; -- + 250 0760 AD 4A 08 lda InSectorCountH ; -- obsluga sektorow ponad 256b + 251 0763 CD B4 07 cmp SecLen+1 ; -- + 252 0766 F0 1F BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + 253 0768 NoNextSector1 + 254 = 076A FileSecBuffHaddr1 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + 255 0768 BD 4B 08 LDA FileSecBuff,X + 256 076B E8 INX + 257 076C D0 03 bne InBlockReadLoop ; -- + 258 076E 20 E1 07 jsr IncrementationXH ; -- obsluga sektorow ponad 256b (ten trik dziala bo tam juz byl RTS :) ) + 259 0771 InBlockReadLoop + 260 0771 91 24 STA (InBlockAddr),Y + 261 0773 C8 INY + 262 0774 D0 02 BNE label15 + 263 0776 E6 25 INC InBlockAddr+1 + 264 0778 label15 + 265 0778 E6 26 INC ToBlockEnd + 266 077A D0 DB BNE BlockReadLoop + 267 077C E6 27 INC ToBlockEnd+1 + 268 077E D0 D7 BNE BlockReadLoop + 269 0780 F0 80 BEQ FileInit ; koniec bloku - skok pod adres inicjalizacji + 270 0782 GoCheckEOF + 271 0782 20 B7 07 JSR CheckEOF ; skok do procedury wspolnej dla pobierania bloku i bajtu + 272 0785 B0 EA BCS InBlockReadLoop ;tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli + 273 0787 GoGetNextFileSect + 274 0787 20 EC 07 JSR GetNextFileSect + 275 078A B0 E5 BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli + 276 078C FileGetBlockStart + 277 078C 20 CA 07 JSR FileGetByte + 278 078F 85 24 STA InBlockAddr + 279 0791 20 CA 07 JSR FileGetByte + 280 0794 85 25 STA InBlockAddr+1 + 281 0796 60 RTS + 282 0797 GoInitAddr + 283 0797 6C E2 02 JMP ($02E2) + 284 079A GetDataSector + 285 079A ReadErrorLoop + 286 079A A2 0B LDX #$0B + 287 079C SetDCB + 288 079C BD AB 07 LDA blokDanychIO_Loader,X + 289 079F 9D 00 03 STA DDEVIC,X + 290 07A2 CA DEX + 291 07A3 10 F7 BPL SetDCB + 292 07A5 SioJMP + 293 07A5 20 59 E4 JSR JSIOINT + 294 07A8 30 F0 BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + 295 07AA 60 RTS + 296 07AB blokDanychIO_Loader + 297 07AB 31 01 52 40 4B 08 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 + 298 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) + 299 = 07B3 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 + 300 07B5 SectorNumber + 301 07B5 00 00 .WO $0000 + 302 07B7 CheckEOF + 303 07B7 EE 00 07 INC ToFileEndH + 304 07BA D0 12 BNE NotEOF + 305 07BC EE 01 07 INC ToFileEndH+1 + 306 07BF D0 0D BNE NotEOF + 307 07C1 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + 308 07C1 A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu + 309 07C3 48 PHA + 310 07C4 A9 73 LDA #<(JRESETWM-1) + 311 07C6 48 PHA + 312 ;WaitLine0 + 313 ; LDA VCOUNT + 314 ; bne WaitLine0 + 315 07C7 6C E0 02 JMP ($02E0) + 316 ; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! + 317 07CA FileGetByte + 318 07CA E6 28 INC ToFileEndL + 319 07CC F0 E9 BEQ CheckEOF + 320 07CE NotEOF + 321 07CE EC B3 07 CPX SecLen ;; nie EOF, ale moze koniec sektora + 322 07D1 D0 08 bne ByteToACCU ; -- + 323 07D3 AD 4A 08 lda InSectorCountH ; -- obsluga sektorow ponad 256b + 324 07D6 CD B4 07 cmp SecLen+1 ; -- + 325 07D9 F0 11 BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny + 326 07DB ByteToACCU + 327 = 07DD FileSecBuffHaddr2 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + 328 07DB BD 4B 08 LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + 329 07DE E8 INX + 330 07DF D0 09 bne GoToSec ; -- + 331 07E1 IncrementationXH ; taki trik - to przypadkiem jest podprogram, wiec mozna tu wskoczyc zamiast zwiekszac liczniki w innym miejscu po raz drugi + 332 07E1 EE 4A 08 inc InSectorCountH ; -- + 333 07E4 EE 6A 07 inc FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + 334 07E7 EE DD 07 inc FileSecBuffHaddr2 ; -- + 335 07EA GoToSec + 336 07EA 38 SEC + 337 07EB Jrts + 338 07EB 60 RTS + 339 ; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! + 340 07EC GetNextFileSect + 341 07EC 98 tya + 342 07ED 48 pha + 343 07EE ReadNextInSequence + 344 = 07EF SectorSequenceCount = *+1 + 345 07EE A9 00 lda #$00 ; to już ma być zainicjowane!!! + 346 07F0 F0 0D beq NextMapPosition + 347 07F2 CE EF 07 dec SectorSequenceCount + 348 07F5 EE B5 07 inc SectorNumber + 349 07F8 D0 03 bne noIncDAUX2 + 350 07FA EE B6 07 inc SectorNumber+1 + 351 07FD noIncDAUX2 + 352 07FD D0 30 bne ReadyToRead + 353 ;jak jest tutaj to jest błąd... + 354 ;powinien być skok do self-testu... + 355 07FF NextMapPosition + 356 07FF 20 43 08 jsr incCompressedMapPos + 357 ;UWAGA! adres w mapie jest zawsze zwiększany o 1 + 358 ;więc przed uruchomieniem loadera trzeba zainicjować adresem-1 + 359 0802 A0 00 ldy #0 + 360 0804 B1 3D lda (CompressedMapPos),y + 361 0806 30 07 bmi HowManyToSkip + 362 0808 F0 15 beq SetNewStartSector + 363 ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji + 364 080A 8D EF 07 sta SectorSequenceCount + 365 080D D0 DF bne ReadNextInSequence ;zawsze skoczy + 366 080F HowManyToSkip + 367 080F 29 7F and #%01111111 + 368 0811 18 clc + 369 0812 6D B5 07 adc SectorNumber + 370 0815 8D B5 07 sta SectorNumber + 371 0818 90 03 bcc noIncDAUX2_v2 + 372 081A EE B6 07 inc SectorNumber+1 + 373 081D noIncDAUX2_v2 + 374 081D D0 10 bne ReadyToRead + 375 ;jak jest tutaj to jest błąd... + 376 ;powinien być skok do self-testu... + 377 081F SetNewStartSector + 378 081F 20 43 08 jsr incCompressedMapPos + 379 0822 B1 3D lda (CompressedMapPos),y + 380 0824 8D B5 07 sta SectorNumber + 381 0827 20 43 08 jsr incCompressedMapPos + 382 082A B1 3D lda (CompressedMapPos),y + 383 082C 8D B6 07 sta SectorNumber+1 + 384 082F ReadyToRead + 385 082F 20 9A 07 JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + 386 + 387 0832 68 pla + 388 0833 A8 tay + 389 0834 A9 08 lda #>FileSecBuff ; -- + 390 0836 8D 6A 07 sta FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + 391 0839 8D DD 07 sta FileSecBuffHaddr2 ; -- + 392 083C A2 00 LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + 393 083E 8E 4A 08 stx InSectorCountH ; -- + 394 0841 F0 98 JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + 395 + 396 0843 incCompressedMapPos + 397 0843 E6 3D inc CompressedMapPos + 398 0845 D0 02 bne skipIncCompressedMapPos + 399 0847 E6 3E inc CompressedMapPos+1 + 400 0849 skipIncCompressedMapPos + 401 0849 60 rts + 402 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X + 403 ; potrzebny do obslugi sektorow wiekszych od 256b + 404 084A InSectorCountH + 405 084A 00 .BY $00 + 406 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 + 407 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz + 408 ; w tym miejscu potem bedzie bufor + 409 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora + 410 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania + 411 084B zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie + 412 084B FirstMapSectorNr + 413 084B 00 00 .WO $0000 + 414 084D LoadStart + 415 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + 416 084D AC E7 02 LDY MEMLO + 417 0850 AD E8 02 LDA MEMLO+1 + 418 0853 8D 5A 08 STA InMemClearLoop+2 + 419 0856 OutMemClearLoop + 420 0856 A9 00 LDA #$00 + 421 0858 InMemClearLoop + 422 0858 99 00 09 STA $0900,Y + 423 085B C8 INY + 424 085C D0 FA BNE InMemClearLoop + 425 085E EE 5A 08 INC InMemClearLoop+2 + 426 0861 AD 5A 08 LDA InMemClearLoop+2 + 427 0864 CD E6 02 CMP MEMTOP+1 + 428 0867 90 ED BCC OutMemClearLoop + 429 0869 AD E6 02 LDA MEMTOP+1 + 430 086C 8D 76 08 STA LastMemPageClear+2 + 431 086F AC E5 02 LDY MEMTOP + 432 0872 A9 00 LDA #$00 + 433 0874 LastMemPageClear + 434 0874 99 00 80 STA $8000,Y + 435 0877 88 DEY + 436 0878 C0 FF CPY #$FF + 437 087A D0 F8 BNE LastMemPageClear + 438 ; wyczyszczona, wiec .... + 439 087C AD 95 08 LDA tempToFileEndL + 440 087F 85 28 STA ToFileEndL + 441 0881 A9 FF LDA #$FF + 442 0883 8D FC 02 STA KBCODES + 443 0886 EE 3C 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) + 444 0889 AE B3 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora + 445 088C AD B4 07 LDA Seclen+1 ; -- + 446 088F 8D 4A 08 STA InSectorCountH ; -- obsluga sektorow ponad 256b + 447 ;jmp * + 448 0892 4C 1B 07 JMP FileNextBlock + 449 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku + 450 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera + 451 0895 tempToFileEndL + 452 0895 00 .BY $00 + 453 .endl + 454 2196 JAkieTurbo + 455 2196 USmode + 456 2196 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed + 457 2197 QMEG + 458 2197 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG + 459 2198 BootDrive + 460 2198 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi + 461 2199 BootShift + 462 2199 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety + 463 219A FolderTurbo + 464 219A 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT + 465 219B NewColors + 466 219B 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano + 467 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) + 468 219C bin2AsciiHex + 469 219C 29 0F AND #$0F + 470 219E 09 30 ORA #$30 + 471 21A0 C9 3A CMP #$3A + 472 21A2 90 03 BCC labelka + 473 21A4 18 CLC + 474 21A5 69 07 ADC #$07 + 475 21A7 labelka + 476 21A7 60 RTS + 477 21A8 Edriver + 478 21A8 45 3A 9B .BY "E:",$9b + 479 21AB EditorOpen + 480 ; otwarcie ekranu !!! + 481 21AB A2 00 LDX #$00 ; kanal nr 0 + 482 21AD 20 6F 2B JSR CloseX ; najpierw Zamkniecie Ekranu + 483 21B0 30 55 BMI ErrorDisplay + 484 21B2 A2 00 LDX #$00 ; kanal nr 0 + 485 21B4 A9 03 LDA #$03 + 486 21B6 9D 42 03 STA ICCMD,X + 487 21B9 A9 0C LDA #$0C + 488 21BB 9D 4A 03 STA ICAX1,X + 489 21BE 9D 48 03 STA ICBUFL,X + 490 21C1 A9 00 LDA #$00 + 491 21C3 9D 4B 03 STA ICAX2,X + 492 21C6 9D 49 03 STA ICBUFL+1,X + 493 21C9 A9 A8 LDA #Edriver + 496 21D0 9D 45 03 STA ICBUFA+1,X + 497 21D3 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 + 498 21D6 30 2F BMI ErrorDisplay + 499 21D8 60 RTS + 500 + 501 21D9 mainprog + 502 21D9 AD 97 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US + 503 21DC 2D 99 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza + 504 21DF 8D 96 21 STA USmode + 505 21E2 F0 1E BEQ NoUSSpeed + 506 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler + 507 21E4 A0 35 ldy #blokDanychIO_GetUSSpeed + 509 21E8 20 5B 2B jsr Table2DCB + 510 21EB 20 59 E4 jsr JSIOINT ; wysylamy "?" + 511 21EE 10 07 bpl USSpeed + 512 21F0 A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage + 513 21F2 8D 96 21 sta USmode + 514 21F5 F0 0B beq NoUSSpeed + 515 21F7 USSpeed + 516 21F7 A0 02 LDY #$2 + 517 21F9 USstatprint + 518 21F9 B9 97 2C LDA ONtext,y + 519 21FC 99 6B 23 STA USstatus,y + 520 21FF 88 DEY + 521 2200 10 F7 bpl USstatprint + 522 + 523 2202 NoUSSpeed + 524 2202 4C 48 22 JMP ReadMainDir + 525 2205 Error148 + 526 2205 A0 94 LDY #$94 ; kod bledu do Y + 527 ; wyswietlenie komunikatu o bledzie - kod bledu w Y + 528 2207 ErrorDisplay + 529 2207 98 TYA + 530 2208 48 PHA + 531 2209 20 6D 2B JSR Close1 + 532 220C 68 PLA + 533 220D 48 PHA + 534 220E 4A LSR + 535 220F 4A LSR + 536 2210 4A LSR + 537 2211 4A LSR + 538 2212 20 9C 21 JSR bin2AsciiHex ; 4 starsze bity na HEX + 539 2215 8D 2E 22 STA ErrorNumHex + 540 2218 68 PLA + 541 2219 20 9C 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX + 542 221C 8D 2F 22 STA ErrorNumHex+1 + 543 221F 20 C0 2A JSR PrintXY + 544 2222 00 00 .BY $00,$00 + 545 2224 7D .BY $7d ; kod czyszczenia ekranu + 546 2225 45 52 52 4F 52 20 + .BY "ERROR - $" + 547 222E ErrorNumHex + 548 222E 30 30 00 .BY "00",$00 + 549 ; czekamy na dowolny klawisz + 550 2231 A9 FF LDA #$FF + 551 2233 8D FC 02 STA KBCODES + 552 2236 WaitKloop + 553 2236 AE FC 02 LDX KBCODES + 554 2239 E8 INX + 555 223A F0 FA BEQ WaitKloop + 556 223C 8D FC 02 STA KBCODES ; w A jest $FF + 557 ; ------------------ + 558 ; na wypadek wybrania nieistniejacej stacji + 559 ; po bledzie przechodzimy na te z ktorej sie ladowalismy + 560 223F AD 98 21 LDA BootDrive + 561 ;LDA #1 + 562 2242 20 12 2C JSR SeTDriveNR + 563 ; ----------------- + 564 2245 4C D9 21 JMP mainprog ; i odpalamy program od nowa + 565 2248 ReadMainDir + 566 2248 20 3A 2A JSR ReadPERCOM + 567 224B A2 2D LDX #>FirstSectorBuff + 568 224D A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) + 577 225F D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki + 578 2261 SpartaDisk + 579 2261 A2 00 LDX #$00 + 580 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 + 581 2263 AD 1F 2D LDA FirstSectorBuff+$1F + 582 2266 30 04 BMI Sektor128b + 583 2268 AA TAX + 584 2269 A9 00 LDA #$00 + 585 226B E8 INX ; i wyliczenie starszego bajtu + 586 226C Sektor128b + 587 226C 8D B3 20 STA .adr loader.SecLen ; przed przepisaniem + 588 226F 8E B4 20 STX .adr loader.SecLen+1 ; przed przepisaniem + 589 ; pokazanie na ekranie + 590 2272 BD 94 2C LDA DensityCodes,X + 591 2275 8D 47 23 STA DensityDisplay + 592 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + 593 2278 AC 09 2D LDY FirstSectorBuff+$09 + 594 227B AE 0A 2D LDX FirstSectorBuff+$0A + 595 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x + 596 227E ReadDIR + 597 ; ustawienie znacznika wlaczenia Turbo dla katalogu + 598 227E A9 01 LDA #$01 + 599 2280 8D 9A 21 STA FolderTurbo + 600 2283 84 D2 STY DirMapSect + 601 2285 86 D3 STX DirMapSect+1 + 602 2287 A9 2F LDA #>DirSectorBuff + 603 2289 85 D1 STA CurrentFileInfoBuff+1 + 604 228B 85 CB STA CurrentDirBuf+1 + 605 228D A9 80 LDA #" + 747 23CD 3A 4D 61 69 6E 20 + .BY ":Main Dir. " + 748 23D9 BC .BY +$80,"<" + 749 23DA 3A 55 50 2D 44 49 + .BY ":UP-DIR." + 750 23E2 00 .BY $00 + 751 23E3 A9 00 LDA #$00 + 752 23E5 85 D9 STA NamesOnScreen + 753 23E7 label68 + 754 23E7 A5 D1 LDA CurrentFileInfoBuff+1 + 755 23E9 C5 CD CMP CurrentDirBufEnd+1 + 756 23EB 90 08 BCC NoLastFileInDir + 757 23ED D0 55 BNE LastFilesPageJump + 758 23EF A5 D0 LDA CurrentFileInfoBuff + 759 23F1 C5 CC CMP CurrentDirBufEnd + 760 23F3 B0 4F BCS LastFilesPageJump + 761 23F5 NoLastFileInDir + 762 23F5 A0 00 LDY #$00 + 763 23F7 B1 D0 LDA (CurrentFileInfoBuff),Y + 764 23F9 F0 49 BEQ LastFilesPageJump + 765 23FB A2 22 LDX #$22 + 766 23FD A9 20 LDA #$20 ; spacja + 767 23FF label50 + 768 23FF 9D B0 24 STA GameName,X + 769 2402 CA DEX + 770 2403 10 FA BPL label50 + 771 2405 A0 10 LDY #$10 + 772 2407 A2 0A LDX #$0A + 773 2409 label51 + 774 2409 B1 D0 LDA (CurrentFileInfoBuff),Y + 775 240B 9D B0 24 STA GameName,X + 776 240E 88 DEY + 777 240F CA DEX + 778 2410 10 F7 BPL label51 + 779 2412 A5 D9 LDA NamesOnScreen + 780 2414 18 CLC + 781 2415 69 41 ADC #$41 ; literka "A" + 782 2417 8D AD 24 STA GameKeySymbol + 783 241A A5 D8 LDA $D8 + 784 241C D0 2C BNE label52 + 785 241E A0 00 LDY #$00 + 786 ; status sprawdzanego pliku + 787 2420 B1 D0 LDA (CurrentFileInfoBuff),Y + 788 2422 29 19 AND #$19 + 789 2424 C9 09 CMP #$09 + 790 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + 791 2426 F0 08 BEQ label53 + 792 2428 A6 D7 LDX $D7 + 793 242A F0 1B BEQ label54 + 794 242C C9 08 CMP #$08 + 795 242E D0 17 BNE label54 + 796 2430 label53 + 797 ; jeszcze raz status sprawdzanego pliku + 798 2430 B1 D0 LDA (CurrentFileInfoBuff),Y + 799 2432 29 20 AND #$20 + 800 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + 801 2434 F0 0B BEQ label55 + 802 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + 803 2436 A2 08 LDX #$08 + 804 2438 label56 + 805 2438 BD BF 25 LDA SubDirText,X + 806 243B 8D BC 24 STA GameName+12 + 807 243E CA DEX + 808 243F 10 F7 BPL label56 + 809 2441 label55 + 810 2441 4C A0 24 JMP GameNamePrint + 811 2444 LastFilesPageJump + 812 2444 4C 48 25 JMP LastFilesPage + 813 2447 label54 + 814 2447 4C F8 24 JMP label59 + 815 244A label52 + 816 244A A0 00 LDY #$00 + 817 244C B1 D0 LDA (CurrentFileInfoBuff),Y + 818 244E 29 18 AND #$18 + 819 2450 C9 08 CMP #$08 + 820 2452 D0 F3 BNE label54 + 821 2454 A5 CC LDA CurrentDirBufEnd + 822 2456 85 D4 STA $D4 + 823 2458 A5 CD LDA CurrentDirBufEnd+1 + 824 245A 85 D5 STA $D5 + 825 245C label65 + 826 245C A5 D5 LDA $D5 + 827 245E C5 CF CMP $CF + 828 2460 90 08 BCC label60 + 829 2462 D0 E3 BNE label54 + 830 2464 A5 D4 LDA $D4 + 831 2466 C5 CE CMP $CE + 832 2468 B0 DD BCS label54 + 833 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy + 834 246A label60 + 835 246A A0 00 LDY #$00 + 836 246C B1 D4 LDA ($D4),Y + 837 246E C9 2A CMP #'*' + 838 2470 D0 06 BNE CompareNames + 839 2472 8D 9B 21 STA NewColors + 840 2475 20 D8 2B JSR Asteriks + 841 2478 CompareNames + 842 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT + 843 2478 A0 0A LDY #$0A ; 8+3 znaki + 844 247A Checking62 + 845 247A B1 D4 LDA ($D4),Y + 846 247C D9 B0 24 CMP GameName,Y + 847 247F D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw + 848 2481 88 DEY + 849 2482 10 F6 BPL Checking62 + 850 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + 851 2484 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku + 852 2486 ReplacingName + 853 2486 B1 D4 LDA ($D4),Y + 854 2488 99 A5 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania + 855 248B C8 INY + 856 248C C0 2E CPY #$2E + 857 248E 90 F6 BCC ReplacingName + 858 2490 B0 0E BCS GameNamePrint + 859 2492 CheckNextName + 860 2492 A5 D4 LDA $D4 + 861 2494 18 CLC + 862 2495 69 2E ADC #$2E + 863 2497 85 D4 STA $D4 + 864 2499 90 02 BCC label64 + 865 249B E6 D5 INC $D5 + 866 249D label64 + 867 249D 4C 5C 24 JMP label65 + 868 24A0 GameNamePrint + 869 24A0 A5 D9 LDA NamesOnScreen + 870 24A2 18 CLC + 871 24A3 69 02 ADC #$02 + 872 24A5 8D AC 24 STA YposGameName + 873 24A8 20 C0 2A JSR PrintXY + 874 24AB 01 .BY $01 + 875 24AC YposGameName + 876 24AC 02 .BY $02 + 877 24AD GameKeySymbol + 878 24AD 41 29 20 .BY "A) " + 879 24B0 GameName + 880 24B0 20 20 20 20 20 20 + .BY " " + 881 24D3 00 .BY $00 + 882 24D4 A5 D9 LDA NamesOnScreen + 883 24D6 0A ASL + 884 24D7 AA TAX + 885 24D8 A5 D0 LDA CurrentFileInfoBuff + 886 24DA 9D AA 2C STA FirstSectorsTable,X + 887 24DD A5 D1 LDA CurrentFileInfoBuff+1 + 888 24DF 9D AB 2C STA FirstSectorsTable+1,X + 889 24E2 A5 D0 LDA CurrentFileInfoBuff + 890 24E4 18 CLC + 891 24E5 69 17 ADC #$17 + 892 24E7 85 D0 STA CurrentFileInfoBuff + 893 24E9 90 02 BCC label66 + 894 24EB E6 D1 INC CurrentFileInfoBuff+1 + 895 24ED label66 + 896 24ED E6 D9 INC NamesOnScreen + 897 24EF A5 D9 LDA NamesOnScreen + 898 24F1 C9 13 CMP #$13 + 899 24F3 B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + 900 24F5 4C E7 23 JMP label68 + 901 24F8 label59 + 902 24F8 A5 D0 LDA CurrentFileInfoBuff + 903 24FA 18 CLC + 904 24FB 69 17 ADC #$17 + 905 24FD 85 D0 STA CurrentFileInfoBuff + 906 24FF 90 02 BCC label69 + 907 2501 E6 D1 INC CurrentFileInfoBuff+1 + 908 2503 label69 + 909 2503 4C E7 23 JMP label68 + 910 2506 MainDirKEY + 911 2506 4C 48 22 JMP ReadMainDir + 912 2509 UpDirKEY + 913 2509 A0 02 LDY #$02 + 914 250B B1 CA LDA (CurrentDirBuf),Y + 915 250D AA TAX + 916 250E 88 DEY + 917 250F 11 CA ORA (CurrentDirBuf),Y + 918 2511 F0 37 BEQ KeyboardProc + 919 2513 B1 CA LDA (CurrentDirBuf),Y + 920 2515 A8 TAY + 921 2516 4C 7E 22 JMP ReadDIR + 922 2519 EscKEY + 923 ; sprawdzmy czy z Shift + 924 2519 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! + 925 251C 29 08 and #$08 + 926 251E D0 06 BNE NoSHIFTEsc + 927 2520 20 AB 21 JSR EditorOpen + 928 2523 6C 0A 00 JMP (DOSVEC) + 929 2526 NoSHIFTEsc + 930 2526 A2 00 LDX #$00 + 931 2528 86 D8 STX $D8 + 932 252A E8 INX + 933 252B 86 D7 STX $D7 + 934 252D ToStartOfDirJump + 935 252D 4C 30 23 JMP ToStartOfDir + 936 2530 SpaceKEY + 937 2530 A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy + 938 2532 D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku + 939 2534 4C 41 23 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej + 940 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie + 941 2537 ContArrowsPrint + 942 2537 20 C0 2A JSR PrintXY + 943 253A 01 15 .BY $01,$15 + 944 253C 1D .BY $1D ; strzalka w dol + 945 253D 00 .BY $00 + 946 253E 20 C0 2A JSR PrintXY + 947 2541 0E 15 .BY $0E,$15 + 948 2543 1D .BY $1D ; strzalka w dol + 949 2544 00 .BY $00 + 950 2545 4C 4A 25 JMP KeyboardProc + 951 2548 LastFilesPage + 952 2548 E6 D6 INC LastFilesPageFlag + 953 254A KeyboardProc + 954 254A AD 9B 21 LDA NewColors + 955 254D D0 0D BNE ColorsAlreadySet + 956 254F A9 C4 LDA #$C4 ; ustawienie koloru tła i liter + 957 2551 8D C6 02 STA COLPF2S + 958 2554 8D C8 02 STA COLBAKS + 959 2557 A9 CA LDA #$CA + 960 2559 8D C5 02 STA COLPF1S + 961 255C ColorsAlreadySet + 962 255C 20 77 2B JSR GetKey + 963 255F 29 7F AND #%01111111 ; eliminujemy invers + 964 2561 F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + 965 2563 C9 3E CMP #$3E ; ">" + 966 2565 F0 9F BEQ MainDirKEY + 967 2567 C9 3C CMP #$3C ; "<" + 968 2569 F0 9E BEQ UpDirKEY + 969 256B C9 7E CMP #$7E ; BackSpace + 970 256D F0 9A BEQ UpDirKEY + 971 256F C9 1B CMP #$1B ; Esc + 972 2571 F0 A6 BEQ EscKEY + 973 2573 C9 20 CMP #$20 ; Spacja + 974 2575 F0 B9 BEQ SpaceKEY + 975 ; ---------------- + 976 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + 977 2577 C9 10 CMP #$10 + 978 2579 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + 979 257B 20 25 2C JSR SeTDriveLetter + 980 257E 4C D9 21 JMP mainprog + 981 2581 noCtrlLetter + 982 ; sprawdzenie klawiszy 1-8 + 983 2581 C9 31 CMP #'1' + 984 2583 90 0D BCC NoNumber + 985 2585 C9 39 CMP #'9' + 986 2587 B0 09 BCS NoNumber + 987 2589 38 SEC + 988 258A E9 30 SBC #'0' + 989 258C 20 12 2C JSR SeTDriveNR + 990 258F 4C D9 21 JMP mainprog + 991 ; ----------------- + 992 2592 NoNumber + 993 2592 C9 61 CMP #'a' ; czy nie ma capsa + 994 2594 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany + 995 2596 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) + 996 2598 BigLetters + 997 2598 38 SEC + 998 2599 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy + 999 259B C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie + 1000 259D B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz + 1001 259F 0A ASL + 1002 25A0 AA TAX + 1003 25A1 BD AA 2C LDA FirstSectorsTable,X + 1004 25A4 85 D4 STA $D4 + 1005 25A6 BD AB 2C LDA FirstSectorsTable+1,X + 1006 25A9 85 D5 STA $D5 + 1007 25AB A0 00 LDY #$00 + 1008 25AD B1 D4 LDA ($D4),Y + 1009 25AF 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik + 1010 25B1 F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader + 1011 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran + 1012 25B3 A0 02 LDY #$02 + 1013 25B5 B1 D4 LDA ($D4),Y + 1014 25B7 AA TAX + 1015 25B8 88 DEY + 1016 25B9 B1 D4 LDA ($D4),Y + 1017 25BB A8 TAY + 1018 25BC 4C 7E 22 JMP ReadDIR + 1019 25BF SubDirText + 1020 25BF 3C 53 55 42 2D 44 + .BY "" + 1021 25C8 GOtoLoader + 1022 25C8 20 C1 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 1023 25CB F0 03 BEQ DiskNotChanged1 + 1024 25CD 4C 48 22 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego + 1025 25D0 DiskNotChanged1 + 1026 25D0 AD 9A 21 LDA FolderTurbo + 1027 25D3 F0 07 BEQ SetTurboOFF + 1028 25D5 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + 1029 25D8 29 08 and #$08 + 1030 25DA D0 03 BNE NoSHIFT + 1031 25DC SetTurboOFF + 1032 25DC 8D 96 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 + 1033 25DF NoSHIFT + 1034 25DF A0 01 LDY #$01 + 1035 25E1 B1 D4 LDA ($D4),Y + 1036 25E3 8D 4B 21 STA .adr loader.FirstMapSectorNr ; przed przepisaniem + 1037 25E6 8D BD 2A sta blokDanychIO+$A ; od razu do bloku IOCB + 1038 25E9 C8 INY + 1039 25EA B1 D4 LDA ($D4),Y + 1040 25EC 8D 4C 21 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + 1041 25EF 8D BE 2A sta blokDanychIO+$B ; od razu do bloku IOCB + 1042 25F2 C8 INY + 1043 25F3 B1 D4 LDA ($D4),Y + 1044 25F5 49 FF EOR #$FF + 1045 25F7 8D 95 21 STA .adr loader.tempToFileEndL + 1046 25FA C8 INY + 1047 25FB B1 D4 LDA ($D4),Y + 1048 25FD 49 FF EOR #$FF + 1049 25FF 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem + 1050 2602 C8 INY + 1051 2603 B1 D4 LDA ($D4),Y + 1052 2605 49 FF EOR #$FF + 1053 2607 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem + 1054 ; wszystko zapamietane mozna robic mape sektorow.... + 1055 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu + 1056 ; czyli DirSectorBuff + 1057 ; sektor mapy przed kompresja leci do DirMapSectorBuff + 1058 ; UWAGA + 1059 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi + 1060 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! + 1061 = 2F80 CompressedMap = DirSectorBuff + 1062 ; czytamy pierwszy sektor mapy + 1063 260A A0 80 LDY #DirMapSectorBuff + 1065 260E 20 85 2A Jsr ReadSector + 1066 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! + 1067 2611 A9 00 LDA #00 + 1068 2613 85 82 STA CompressedMapCounter + 1069 2615 85 83 STA CompressedMapCounter+1 + 1070 2617 20 E3 26 JSR AddToCompressedMAP + 1071 261A AD 84 2D LDA DirMapSectorBuff+4 + 1072 261D 85 86 STA PrevFileSector + 1073 261F 20 E3 26 JSR AddToCompressedMAP + 1074 2622 AD 85 2D LDA DirMapSectorBuff+5 + 1075 2625 85 87 sta PrevFileSector+1 + 1076 2627 20 E3 26 JSR AddToCompressedMAP + 1077 ; Inicjujemy liczniki + 1078 262A .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 + 1079 262A .zpvar PrevFileSector, MapPositionMem .word + 1080 262A .zpvar SectorOffset .word + 1081 262A .zpvar SectorsCounter .byte + 1082 262A A9 00 LDA #$00 + 1083 262C 85 81 STA MapCounter+1 + 1084 262E 85 8C STA SectorsCounter + 1085 2630 A9 06 lda #$06 + 1086 2632 85 80 STA MapCounter + 1087 2634 GenerateCompressedMap + 1088 2634 18 CLC + 1089 2635 A9 80 LDA #DirMapSectorBuff + 1093 263D 65 81 ADC MapCounter+1 + 1094 263F 85 89 STA MAPPositionMem+1 + 1095 2641 A2 00 LDX #0 + 1096 2643 A0 01 LDY #1 + 1097 2645 A1 88 LDA (MAPPositionMem,x) + 1098 2647 11 88 ORA (MAPPositionMem),y + 1099 2649 F0 56 BEQ Sector00 + 1100 264B 38 SEC + 1101 264C A1 88 LDA (MAPPositionMem,x) + 1102 264E E5 86 SBC PrevFileSector + 1103 2650 85 8A STA SectorOffset + 1104 2652 B1 88 LDA (MAPPositionMem),y + 1105 2654 E5 87 SBC PrevFileSector+1 + 1106 2656 85 8B STA SectorOffset+1 + 1107 ; mamy odstep miedzy poprzednim a nastepnym sektorem + 1108 2658 D0 26 BNE OffsetToBig + 1109 265A A5 8A LDA SectorOffset + 1110 265C 30 22 BMI OffsetToBig ; max przeskok 127 sektorow + 1111 265E C9 01 CMP #$01 + 1112 2660 D0 11 BNE JumpForward + 1113 ; kolejny sektor + 1114 ; zwiekszamy wiec licznik + 1115 2662 E6 8C inc SectorsCounter + 1116 2664 A5 8C LDA SectorsCounter + 1117 2666 C9 7F CMP #%01111111 + 1118 2668 D0 2C BNE GetNextMapWord + 1119 ; tu licznik dotarl do konca zerujemy go + 1120 ; dodajemy wpis do skompresowanej mapy i gotowe + 1121 266A 20 E3 26 JSR AddToCompressedMAP + 1122 266D A9 00 LDA #0 + 1123 266F 85 8C STA SectorsCounter + 1124 2671 F0 23 BEQ GetNextMapWord + 1125 ; ominiecie wyznaczonej ilości sektorów (w A) + 1126 2673 JumpForward + 1127 2673 20 FE 26 JSR FlushBuffer + 1128 2676 A5 8A LDA SectorOffset + 1129 2678 09 80 ORA #%10000000 + 1130 267A 20 E3 26 JSR AddToCompressedMAP + 1131 267D 4C 96 26 JMP GetNextMapWord + 1132 ; wyznaczenie skoku do nowego sektora pliku + 1133 2680 OffsetToBig + 1134 2680 20 FE 26 JSR FlushBuffer + 1135 2683 A9 00 LDA #0 + 1136 2685 20 E3 26 JSR AddToCompressedMAP + 1137 2688 A0 00 LDY #00 + 1138 268A B1 88 LDA (MAPPositionMem),y + 1139 268C 20 E3 26 JSR AddToCompressedMAP + 1140 268F A0 01 LDY #01 + 1141 2691 B1 88 LDA (MAPPositionMem),y + 1142 2693 20 E3 26 JSR AddToCompressedMAP + 1143 2696 GetNextMapWord + 1144 ; zapamietanie numeru obecnego sektora do porownania potem + 1145 2696 A0 00 LDY #00 + 1146 2698 B1 88 LDA (MAPPositionMem),y + 1147 269A 85 86 STA PrevFileSector + 1148 269C C8 INY + 1149 269D B1 88 LDA (MAPPositionMem),y + 1150 269F 85 87 STA PrevFileSector+1 + 1151 26A1 Sector00 + 1152 26A1 18 A5 80 69 02 85 + ADW MapCounter #2 + 1153 26AC ops01 + 1154 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala + 1155 26AC A5 81 LDA MapCounter+1 + 1156 26AE CD B4 20 CMP .adr loader.SecLen+1 + 1157 26B1 D0 05 bne noteqal01 + 1158 26B3 A5 80 LDA MapCounter + 1159 26B5 CD B3 20 CMP .adr loader.SecLen + 1160 26B8 noteqal01 + 1161 26B8 F0 03 4C 34 26 JNE GenerateCompressedMap + 1162 ; czytamy nastepny sektor mapy + 1163 ; sprawdzmy czy nie koniec + 1164 26BD AD 80 2D LDA DirMapSectorBuff + 1165 26C0 0D 81 2D ORA DirMapSectorBuff+1 + 1166 26C3 F0 45 BEQ EndMakingMap + 1167 26C5 AD 80 2D LDA DirMapSectorBuff + 1168 26C8 8D BD 2A sta blokDanychIO+$A + 1169 26CB AD 81 2D LDA DirMapSectorBuff+1 + 1170 26CE 8D BE 2A sta blokDanychIO+$B + 1171 26D1 A0 80 LDY #DirMapSectorBuff + 1173 26D5 20 85 2A Jsr ReadSector + 1174 ; zerujemy licznik mapy + 1175 26D8 A9 00 LDA #$00 + 1176 26DA 85 81 STA MapCounter+1 + 1177 26DC A9 04 lda #$04 + 1178 26DE 85 80 STA MapCounter + 1179 26E0 4C 34 26 JMP GenerateCompressedMap + 1180 ; dpisanie bajtu z A do mapy sektorow skompresowanej + 1181 26E3 AddToCompressedMAP + 1182 26E3 48 PHA + 1183 ; wyliczamy adresa + 1184 26E4 18 CLC + 1185 26E5 A5 82 LDA CompressedMapCounter + 1186 26E7 69 80 ADC #CompressedMap + 1190 26F0 8D F6 26 STA xxxxbla+1 + 1191 26F3 68 PLA + 1192 = 26F5 xxxxbla=*+1 + 1193 26F4 8D FF FF STA $FFFF + 1194 26F7 E6 82 INC CompressedMapCounter + 1195 26F9 D0 02 BNE noinc013 + 1196 26FB E6 83 INC CompressedMapCounter+1 + 1197 26FD noinc013 + 1198 26FD 60 RTS + 1199 26FE FlushBuffer + 1200 26FE A5 8C LDA SectorsCounter + 1201 2700 F0 07 BEQ NoFlush + 1202 2702 20 E3 26 JSR AddToCompressedMAP + 1203 2705 A9 00 LDA #0 + 1204 2707 85 8C STA SectorsCounter + 1205 2709 NoFlush + 1206 2709 60 RTS + 1207 270A EndMakingMap + 1208 270A 20 FE 26 JSR FlushBuffer + 1209 270D A0 00 LDY #$00 + 1210 270F 8C 44 02 STY COLDST + 1211 2712 A9 01 LDA #$01 + 1212 2714 85 09 STA BOOT + 1213 2716 AE 00 07 LDX $700 + 1214 2719 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta + 1215 271B D0 03 BNE NoRunFromDOS + 1216 271D 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! + 1217 ; STA $D5EC ; to wylacza SpartaDOS X + 1218 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) + 1219 2720 NoRunFromDOS + 1220 2720 A9 31 LDA #AfterWormStart + 1223 2726 85 0D STA DOSINI+1 + 1224 ; LDA #>JRESETCD + 1225 ; STA DOSVEC+1 + 1226 ; LDA #TempMEMLO + 1247 2747 6D B4 20 ADC .adr loader.SecLen+1 + 1248 274A 8D E8 02 STA MEMLO+1 + 1249 274D 85 3E STA CompressedMapPos+1 + 1250 274F 8D 99 27 STA pointerMov2b + 1251 ; STA APPMHI+1 + 1252 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora + 1253 ; jest to jednoczesnie adres umieszczenia skompresowanej + 1254 ; mapy sektorow pliku dla loadera ale MINUS 1 + 1255 2752 A5 3D D0 02 C6 3E + DEW CompressedMapPos + 1256 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej + 1257 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) + 1258 275A 18 CLC + 1259 275B AD E7 02 LDA MEMLO + 1260 275E 65 82 ADC CompressedMapCounter + 1261 2760 8D E7 02 STA MEMLO + 1262 2763 8D 0F 28 STA TurboRelocADDR + 1263 2766 AD E8 02 LDA MEMLO+1 + 1264 2769 65 83 ADC CompressedMapCounter+1 + 1265 276B 8D E8 02 STA MEMLO+1 + 1266 276E 8D 10 28 STA TurboRelocADDR+1 + 1267 2771 A9 71 LDA #JTESTROM + 1270 2777 85 0D STA DOSINI+1 + 1271 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) + 1272 ; INC $033D ; bajty kontrolne zimnego startu + 1273 ; INC $033E ; zmiana ich wartosci wymusza + 1274 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) + 1275 2779 A2 00 LDX #$00 + 1276 277B 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) + 1277 ; STX BOOT + 1278 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci + 1279 277D moveloop1 + 1280 277D BD 00 20 LDA movedproc,X + 1281 2780 9D 00 07 STA $0700,X + 1282 2783 BD 00 21 LDA movedproc+$0100,X + 1283 2786 9D 00 08 STA $0800,X + 1284 2789 E8 INX + 1285 278A D0 F1 BNE moveloop1 + 1286 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora + 1287 278C moveloop2 + 1288 278C A5 82 D0 02 C6 83 + DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy + 1289 = 2796 pointerMov2a=*+2 + 1290 2794 BD 80 2F LDA CompressedMap,x ; kod samomodyfikujacy sie + 1291 = 2799 pointerMov2b=*+2 + 1292 2797 9D FF FF STA $FFFF,x ; kod samomodyfikujacy sie + 1293 279A A5 82 LDA CompressedMapCounter + 1294 279C 25 83 AND CompressedMapCounter+1 + 1295 279E C9 FF CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! + 1296 27A0 F0 0B BEQ SectorMapReady + 1297 27A2 E8 INX + 1298 27A3 D0 E7 BNE moveloop2 + 1299 27A5 EE 96 27 inc pointerMov2a + 1300 27A8 EE 99 27 inc pointerMov2b + 1301 27AB D0 DF bne moveloop2 + 1302 27AD SectorMapReady + 1303 + 1304 27AD 20 D1 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + 1305 27B0 20 41 2C JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 1306 + 1307 27B3 A2 00 LDX #$00 + 1308 27B5 8A TXA + 1309 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) + 1310 27B6 ClearLoop1 + 1311 27B6 9D 00 01 STA $0100,X ; STOS !!! + 1312 27B9 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) + 1313 27BC 9D 00 05 STA $0500,X + 1314 27BF 9D 00 06 STA $0600,X + 1315 27C2 E0 80 CPX #$80 ;tylko ponad $80 + 1316 27C4 90 02 BCC NoZpage + 1317 27C6 95 00 STA $00,X ; czyli polowa strony zerowej + 1318 27C8 NoZpage + 1319 27C8 E8 INX + 1320 27C9 D0 EB BNE ClearLoop1 + 1321 27CB A2 FF LDX #$FF + 1322 27CD 9A TXS ; "wyzerowanie wskaznika STOSU + 1323 + 1324 27CE 4C 4D 08 JMP loader.LoadStart ; po przepisaniu + 1325 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba + 1326 ; na koniec odpowiednie zmodyfikowanie MEMLO + 1327 27D1 ADDspeedProc + 1328 27D1 AD 96 21 LDA USmode + 1329 27D4 F0 5F beq NoHappyLoader + 1330 ; wyznaczamy offset procedury + 1331 27D6 38 SEC + 1332 27D7 A9 36 LDA #HappyUSMovedProc + 1336 27E1 ED E8 02 SBC MEMLO+1 + 1337 27E4 8D 93 2C STA HappyOffset+1 + 1338 + 1339 27E7 A0 00 LDY #0 + 1340 27E9 A2 09 LDX #[$A-1] ;xjsrA - the last + 1341 ; relokujemy skoki pod offset z MEMLO + 1342 27EB HappyRelocate + 1343 27EB 38 SEC + 1344 27EC BD 7E 2C LDA xjsrTableL,x + 1345 27EF 85 32 STA SecBuffer + 1346 27F1 BD 88 2C LDA xjsrTableH,x + 1347 27F4 85 33 STA SecBuffer+1 + 1348 27F6 B1 32 LDA (SecBuffer),y + 1349 27F8 ED 92 2C SBC HappyOffset + 1350 27FB 91 32 STA (SecBuffer),y + 1351 27FD C8 INY + 1352 27FE B1 32 LDA (SecBuffer),y + 1353 2800 ED 93 2C SBC HappyOffset+1 + 1354 2803 91 32 STA (SecBuffer),y + 1355 2805 88 DEY + 1356 2806 CA DEX + 1357 2807 10 E2 BPL HappyRelocate + 1358 + 1359 2809 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] + 1360 280B label72x + 1361 280B BD 36 28 LDA HappyUSMovedProc,X + 1362 = 280F TurboRelocADDR=*+1 + 1363 280E 9D 00 0A STA $0A00,X + 1364 2811 CA DEX + 1365 2812 E0 FF CPX #$FF + 1366 2814 D0 F5 BNE label72x + 1367 2816 A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] + 1368 2818 A2 00 LDX #$00 + 1369 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. + 1370 281A label73 + 1371 281A 98 TYA + 1372 281B 18 CLC + 1373 281C 6D E7 02 ADC MEMLO + 1374 281F 8D E7 02 STA MEMLO + 1375 2822 8A TXA + 1376 2823 6D E8 02 ADC MEMLO+1 + 1377 2826 8D E8 02 STA MEMLO+1 + 1378 2829 AD 0F 28 LDA TurboRelocADDR + 1379 282C 8D A6 07 STA loader.SioJMP+1 ; po przepisaniu + 1380 282F AD 10 28 LDA TurboRelocADDR+1 + 1381 2832 8D A7 07 STA loader.SioJMP+2 ; po przepisaniu + 1382 2835 NoHappyLoader + 1383 2835 60 RTS + 1384 + 1385 + 1386 + 1387 ; UWAGA !!!!!!!!!!!!!! + 1388 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! + 1389 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone + 1390 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! + 1391 2836 HappyUSMovedProc ; + 1392 + 1393 2836 AD 04 03 LDA DBUFA + 1394 2839 85 32 STA SecBuffer + 1395 283B AD 05 03 LDA DBUFA+1 + 1396 283E 85 33 STA SecBuffer+1 + 1397 + 1398 2840 AD 08 03 LDA DBYT + 1399 2843 85 31 STA SecLenUS + 1400 + 1401 2845 78 SEI + 1402 2846 BA TSX + 1403 2847 86 37 STX StackCopy + 1404 2849 A9 0D LDA #$0D + 1405 284B 85 34 STA CRETRYZ + 1406 ;command retry on zero page + 1407 284D CommandLoop + 1408 = 284E HappySpeed = *+1 + 1409 284D A9 28 LDA #$28 ;here goes speed from "?" + 1410 284F 8D 04 D2 STA AUDF3 + 1411 2852 A9 34 LDA #$34 + 1412 2854 8D 03 D3 STA PBCTL ;ustawienie linii command + 1413 2857 A2 80 LDX #$80 + 1414 2859 DelayLoopCmd + 1415 2859 CA DEX + 1416 285A D0 FD BNE DelayLoopCmd + 1417 285C 8E 06 D2 STX AUDF4 ; zero + 1418 285F 86 35 STX TransmitError + 1419 ; pokey init + 1420 2861 A9 23 LDA #$23 + 1421 2863 20 D7 28 xjsr1 JSR SecTransReg + 1422 ; + 1423 + 1424 2866 18 CLC + 1425 2867 AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + 1426 286A 6D 01 03 ADC DUNIT ; dodajemy numer stacji + 1427 286D 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + 1428 286F 85 30 STA CheckSum + 1429 2871 8D 0D D2 STA SEROUT + 1430 2874 AD 02 03 LDA DCOMND + 1431 2877 20 ED 28 xjsr2 JSR PutSIOByte + 1432 287A AD 0A 03 LDA DAUX1 + 1433 287D 20 ED 28 xjsr3 JSR PutSIOByte + 1434 2880 AD 0B 03 LDA DAUX2 + 1435 2883 20 ED 28 xjsr4 JSR PutSIOByte + 1436 2886 A5 30 LDA CheckSum + 1437 2888 20 ED 28 xjsr5 JSR PutSIOByte + 1438 + 1439 288B waitforEndOftransmission + 1440 288B AD 0E D2 LDA IRQST + 1441 288E 29 08 AND #$08 + 1442 2890 D0 F9 BNE waitforEndOftransmission + 1443 + 1444 2892 A9 13 LDA #$13 + 1445 2894 20 D7 28 xjsr6 JSR SecTransReg + 1446 + 1447 2897 A9 3C LDA #$3c + 1448 2899 8D 03 D3 STA PBCTL ;command line off + 1449 ; two ACK's + 1450 289C A0 02 LDY #2 + 1451 289E DoubleACK + 1452 289E 20 09 29 xjsr7 JSR GetSIOByte + 1453 28A1 C9 44 CMP #$44 + 1454 28A3 B0 19 BCS ErrorHere + 1455 28A5 88 DEY + 1456 28A6 D0 F6 BNE DoubleACK + 1457 + 1458 ;ldy #0 + 1459 28A8 84 30 STY CheckSum + 1460 28AA ReadSectorLoop + 1461 28AA 20 09 29 xjsr8 JSR GetSIOByte + 1462 28AD 91 32 STA (SecBuffer),y + 1463 28AF 20 01 29 xjsr9 JSR AddCheckSum + 1464 28B2 C8 INY + 1465 28B3 C4 31 CPY SecLenUS + 1466 28B5 D0 F3 BNE ReadSectorLoop + 1467 + 1468 28B7 20 09 29 xjsrA JSR GetSIOByte + 1469 28BA C5 30 CMP CheckSum + 1470 28BC F0 0B BEQ EndOfTransmission + 1471 ;error!!! + 1472 28BE ErrorHere + 1473 28BE A0 90 LDY #$90 + 1474 28C0 84 35 STY TransmitError + 1475 28C2 A6 37 LDX StackCopy + 1476 28C4 9A TXS + 1477 28C5 C6 34 DEC CRETRYZ + 1478 28C7 D0 84 BNE CommandLoop + 1479 + 1480 28C9 EndOfTransmission + 1481 28C9 A9 00 LDA #0 + 1482 28CB 8D 07 D2 STA AUDC4 + 1483 28CE A5 10 LDA IRQENS + 1484 28D0 8D 0E D2 STA IRQEN + 1485 28D3 58 CLI + 1486 28D4 A4 35 LDY TransmitError + 1487 28D6 60 RTS + 1488 + 1489 28D7 SecTransReg + 1490 28D7 8D 0F D2 STA SKCTL + 1491 28DA 8D 0A D2 STA SKSTRES + 1492 28DD A9 38 LDA #$38 + 1493 28DF 8D 0E D2 STA IRQEN + 1494 28E2 A9 28 LDA #$28 + 1495 28E4 8D 08 D2 STA AUDCTL + 1496 28E7 A9 A8 LDA #$A8 + 1497 28E9 8D 07 D2 STA AUDC4 + 1498 28EC 60 RTS + 1499 + 1500 28ED PutSIOByte + 1501 28ED AA TAX + 1502 28EE waitforSerial + 1503 28EE AD 0E D2 LDA IRQST + 1504 28F1 29 10 AND #$10 + 1505 28F3 D0 F9 BNE waitforSerial + 1506 + 1507 28F5 8D 0E D2 STA IRQEN + 1508 28F8 A9 10 LDA #$10 + 1509 28FA 8D 0E D2 STA IRQEN + 1510 + 1511 28FD 8A TXA + 1512 28FE 8D 0D D2 STA SEROUT + 1513 + 1514 2901 AddCheckSum + 1515 2901 18 CLC + 1516 2902 65 30 ADC CheckSum + 1517 2904 69 00 ADC #0 + 1518 2906 85 30 STA CheckSum + 1519 2908 60 RTS + 1520 + 1521 2909 GetSIOByte + 1522 2909 A2 0A LDX #10 ;acktimeout + 1523 290B ExternalLoop + 1524 290B A9 00 LDA #0 + 1525 290D 85 36 STA looperka + 1526 290F InternalLoop + 1527 290F AD 0E D2 LDA IRQST + 1528 2912 29 20 AND #$20 + 1529 2914 F0 09 BEQ ACKReceive + 1530 2916 C6 36 DEC looperka + 1531 2918 D0 F5 BNE InternalLoop + 1532 291A CA DEX + 1533 291B D0 EE BNE ExternalLoop + 1534 291D F0 9F BEQ ErrorHere + 1535 291F ACKReceive + 1536 ; zero we have now + 1537 291F 8D 0E D2 STA IRQST + 1538 2922 A9 20 LDA #$20 + 1539 2924 8D 0E D2 STA IRQST + 1540 2927 AD 0F D2 LDA SKSTAT + 1541 292A 8D 0A D2 STA SKSTRES + 1542 292D 29 20 AND #$20 + 1543 292F F0 8D BEQ ErrorHere + 1544 ; + 1545 2931 AD 0D D2 LDA SERIN + 1546 2934 60 RTS + 1547 2935 EndHappyUSProc + 1548 + 1549 + 1550 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler + 1551 2935 blokDanychIO_GetUSSpeed + 1552 2935 31 01 3F 40 .BY $31,$01,"?",$40 + 1553 2939 4E 28 .WO HappySpeed + 1554 293B 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A + 1555 2941 DirMapEnd + 1556 2941 4C 0D 2A JMP label75 + 1557 2944 label39 + 1558 2944 85 DA STA $DA + 1559 2946 A5 D0 LDA CurrentFileInfoBuff + 1560 2948 85 DB STA $DB + 1561 294A A5 D1 LDA CurrentFileInfoBuff+1 + 1562 294C 85 DC STA $DC + 1563 294E 20 C1 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 1564 2951 F0 05 BEQ DiscNotChanged2 + 1565 2953 68 PLA + 1566 2954 68 PLA + 1567 2955 4C 48 22 JMP ReadMainDir + 1568 2958 DiscNotChanged2 + 1569 ; odczyt sektora mapy wskazywanego przez DirMapSec + 1570 2958 A5 D2 LDA DirMapSect + 1571 295A 8D BD 2A STA blokDanychIO+10 + 1572 295D A5 D3 LDA DirMapSect+1 + 1573 295F 8D BE 2A STA blokDanychIO+11 + 1574 2962 0D BD 2A ORA blokDanychIO+10 + 1575 2965 F0 DA BEQ DirMapEnd + 1576 2967 A2 2D LDX #>DirMapSectorBuff + 1577 2969 A0 80 LDY #DirMapSectorBuff ; -- + 1603 2995 65 E3 ADC InMapPointer+1 ; -- + 1604 2997 85 E5 STA TempZP+1 ; -- + 1605 2999 B1 E4 LDA (TempZP),Y + 1606 299B 8D BD 2A STA blokDanychIO+10 + 1607 299E C8 INY + 1608 299F B1 E4 LDA (TempZP),Y + 1609 29A1 8D BE 2A STA blokDanychIO+11 + 1610 29A4 0D BD 2A ORA blokDanychIO+10 + 1611 29A7 F0 64 BEQ label75 + 1612 ; i zwiekszenie wskaznika mapy o 2 + 1613 29A9 C8 INY + 1614 29AA 84 E2 STY InMapPointer + 1615 29AC D0 02 BNE NoIncH ; -- + 1616 29AE E6 E3 INC InMapPointer+1 ; -- + 1617 29B0 NoIncH + 1618 29B0 AD E5 02 LDA MEMTOP + 1619 29B3 38 SEC + 1620 29B4 E5 D0 SBC CurrentFileInfoBuff + 1621 29B6 AD E6 02 LDA MEMTOP+1 + 1622 29B9 E5 D1 SBC CurrentFileInfoBuff+1 + 1623 29BB F0 50 BEQ label75 + 1624 29BD A4 D0 LDY CurrentFileInfoBuff + 1625 29BF A6 D1 LDX CurrentFileInfoBuff+1 + 1626 29C1 20 85 2A JSR ReadSector + 1627 29C4 A5 D4 LDA $D4 + 1628 29C6 05 D5 ORA $D5 + 1629 29C8 D0 16 BNE label79 + 1630 29CA A0 03 LDY #$03 + 1631 29CC B1 D0 LDA (CurrentFileInfoBuff),Y + 1632 29CE 85 D4 STA $D4 + 1633 29D0 C8 INY + 1634 29D1 B1 D0 LDA (CurrentFileInfoBuff),Y + 1635 29D3 85 D5 STA $D5 + 1636 29D5 C8 INY + 1637 29D6 B1 D0 LDA (CurrentFileInfoBuff),Y + 1638 29D8 F0 06 BEQ label79 + 1639 29DA A9 FF LDA #$FF + 1640 29DC 85 D4 STA $D4 + 1641 29DE 85 D5 STA $D5 + 1642 29E0 label79 + 1643 29E0 A5 D0 LDA CurrentFileInfoBuff + 1644 29E2 18 CLC + 1645 29E3 6D B3 20 ADC .adr loader.SecLen ; przed przepisaniem + 1646 29E6 85 D0 STA CurrentFileInfoBuff + 1647 29E8 A5 D1 LDA CurrentFileInfoBuff+1 + 1648 29EA 6D B4 20 ADC .adr loader.SecLen+1 ; przed przepisaniem + 1649 29ED 85 D1 STA CurrentFileInfoBuff+1 + 1650 29EF A5 D4 LDA $D4 + 1651 29F1 38 SEC + 1652 29F2 ED B3 20 SBC .adr loader.SecLen ; przed przepisaniem + 1653 29F5 85 D4 STA $D4 + 1654 29F7 A5 D5 LDA $D5 + 1655 29F9 ED B4 20 SBC .adr loader.SecLen+1 ; przed przepisaniem + 1656 29FC 85 D5 STA $D5 + 1657 29FE B0 80 BCS label80 + 1658 2A00 A5 D0 LDA CurrentFileInfoBuff + 1659 2A02 18 CLC + 1660 2A03 65 D4 ADC $D4 + 1661 2A05 85 D0 STA CurrentFileInfoBuff + 1662 2A07 A5 D1 LDA CurrentFileInfoBuff+1 + 1663 2A09 65 D5 ADC $D5 + 1664 2A0B 85 D1 STA CurrentFileInfoBuff+1 + 1665 2A0D label75 + 1666 2A0D A5 DC LDA $DC + 1667 2A0F C5 D1 CMP CurrentFileInfoBuff+1 + 1668 2A11 90 0B BCC label81 + 1669 2A13 D0 17 BNE label82 + 1670 2A15 A5 DB LDA $DB + 1671 2A17 C5 D0 CMP CurrentFileInfoBuff + 1672 2A19 90 03 BCC label81 + 1673 2A1B D0 0F BNE label82 + 1674 2A1D 60 RTS + 1675 2A1E label81 + 1676 2A1E A5 DB LDA $DB + 1677 2A20 18 CLC + 1678 2A21 65 DA ADC $DA + 1679 2A23 85 DB STA $DB + 1680 2A25 90 E6 BCC label75 + 1681 2A27 E6 DC INC $DC + 1682 2A29 4C 0D 2A JMP label75 + 1683 2A2C label82 + 1684 2A2C A5 DB LDA $DB + 1685 2A2E 38 SEC + 1686 2A2F E5 DA SBC $DA + 1687 2A31 85 D0 STA CurrentFileInfoBuff + 1688 2A33 A5 DC LDA $DC + 1689 2A35 E9 00 SBC #$00 + 1690 2A37 85 D1 STA CurrentFileInfoBuff+1 + 1691 2A39 60 RTS + 1692 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora + 1693 2A3A ReadPERCOM + 1694 2A3A A9 04 LDA #$04 + 1695 2A3C 8D BF 2A STA DiskRetryCount + 1696 2A3F ReadPERCOMretry + 1697 2A3F A0 63 LDY #blokDanychIO_PERCOM + 1699 2A43 20 5B 2B JSR Table2DCB + 1700 2A46 20 50 2B JSR GoSIO + 1701 2A49 30 08 BMI PercomError + 1702 ; blok odczytany - ustawmy dlugosc 1 sektora + 1703 2A4B AD A4 2C LDA PERCOMdata+6 + 1704 2A4E C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + 1705 2A50 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + 1706 2A52 60 RTS + 1707 2A53 PercomError + 1708 2A53 CE BF 2A DEC DiskRetryCount + 1709 2A56 D0 E7 BNE ReadPERCOMretry + 1710 ; blok nieodczytany - dlugosc 1 sektora na $80 + 1711 2A58 Set1Sect128 + 1712 2A58 A9 00 LDA #$00 + 1713 2A5A 8D A4 2C STA PERCOMdata+6 + 1714 2A5D A9 80 LDA #$80 + 1715 2A5F 8D A5 2C STA PERCOMdata+7 + 1716 2A62 60 RTS + 1717 2A63 blokDanychIO_PERCOM + 1718 2A63 31 01 4E 40 .BY $31,$01,$4E,$40 + 1719 2A67 9E 2C .WO PERCOMdata + 1720 2A69 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 + 1721 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) + 1722 2A6F ReadFirstSect + 1723 2A6F A9 01 LDA #$01 + 1724 2A71 8D BD 2A STA blokDanychIO+10 + 1725 2A74 A9 00 LDA #$00 + 1726 2A76 8D BE 2A STA blokDanychIO+11 + 1727 2A79 AD A4 2C LDA PERCOMdata+6 + 1728 2A7C 8D BC 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1729 2A7F AD A5 2C LDA PERCOMdata+7 + 1730 2A82 4C 8E 2A JMP ReadSector1 + 1731 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) + 1732 ; reszta danych jak nizej (A nie wazne) + 1733 2A85 ReadSector + 1734 2A85 AD B4 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + 1735 2A88 8D BC 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1736 2A8B AD B3 20 LDA .adr loader.SecLen ; przed przepisaniem + 1737 2A8E ReadSector1 + 1738 2A8E 8D BB 2A STA blokDanychIO+8 + 1739 2A91 8E B8 2A STX blokDanychIO+5 + 1740 2A94 8C B7 2A STY blokDanychIO+4 + 1741 2A97 A9 04 LDA #$04 + 1742 2A99 8D BF 2A STA DiskRetryCount + 1743 2A9C DiskReadRetry + 1744 2A9C A0 B3 LDY #blokDanychIO + 1746 2AA0 20 5B 2B JSR Table2DCB + 1747 2AA3 20 50 2B JSR GoSIO + 1748 2AA6 30 01 BMI label85 + 1749 2AA8 60 RTS + 1750 2AA9 label85 + 1751 2AA9 CE BF 2A DEC DiskRetryCount + 1752 2AAC D0 EE BNE DiskReadRetry + 1753 2AAE 68 PLA + 1754 2AAF 68 PLA + 1755 2AB0 4C 07 22 JMP ErrorDisplay + 1756 2AB3 blokDanychIO + 1757 2AB3 31 01 52 40 .BY $31,$01,$52,$40 + 1758 2AB7 80 2D .WO DirMapSectorBuff + 1759 2AB9 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 + 1760 2ABF DiskRetryCount + 1761 2ABF 00 .BY $00 + 1762 2AC0 PrintXY + 1763 2AC0 68 PLA + 1764 2AC1 85 C8 STA $C8 + 1765 2AC3 68 PLA + 1766 2AC4 85 C9 STA $C9 + 1767 2AC6 A9 00 LDA #$00 + 1768 2AC8 85 DF STA $DF + 1769 2ACA 20 42 2B JSR label87 + 1770 2ACD 48 PHA + 1771 2ACE 20 42 2B JSR label87 + 1772 2AD1 85 DE STA $DE + 1773 2AD3 0A ASL + 1774 2AD4 0A ASL + 1775 2AD5 18 CLC + 1776 2AD6 65 DE ADC $DE + 1777 2AD8 0A ASL + 1778 2AD9 0A ASL + 1779 2ADA 26 DF ROL $DF + 1780 2ADC 0A ASL + 1781 2ADD 26 DF ROL $DF + 1782 2ADF 18 CLC + 1783 2AE0 65 58 ADC SAVMSC + 1784 2AE2 85 DE STA $DE + 1785 2AE4 A5 DF LDA $DF + 1786 2AE6 65 59 ADC SAVMSC+1 + 1787 2AE8 85 DF STA $DF + 1788 2AEA 68 PLA + 1789 2AEB A8 TAY + 1790 2AEC label92 + 1791 2AEC 20 42 2B JSR label87 + 1792 2AEF C9 00 CMP #$00 + 1793 2AF1 F0 48 BEQ label88 + 1794 2AF3 C9 7D CMP #$7D + 1795 2AF5 F0 21 BEQ label89 + 1796 2AF7 A2 00 LDX #$00 + 1797 2AF9 86 E0 STX $E0 + 1798 2AFB C9 80 CMP #$80 + 1799 2AFD 66 E0 ROR $E0 + 1800 2AFF 29 7F AND #$7F + 1801 2B01 C9 20 CMP #$20 + 1802 2B03 B0 04 BCS label90 + 1803 2B05 09 40 ORA #$40 + 1804 2B07 D0 07 BNE label91 + 1805 2B09 label90 + 1806 2B09 C9 60 CMP #$60 + 1807 2B0B B0 03 BCS label91 + 1808 2B0D 38 SEC + 1809 2B0E E9 20 SBC #$20 + 1810 2B10 label91 + 1811 2B10 05 E0 ORA $E0 + 1812 2B12 91 DE STA ($DE),Y + 1813 2B14 C8 INY + 1814 2B15 4C EC 2A JMP label92 + 1815 2B18 label89 + 1816 2B18 98 TYA + 1817 2B19 48 PHA + 1818 2B1A A5 58 LDA SAVMSC + 1819 2B1C 85 E0 STA $E0 + 1820 2B1E A9 03 LDA #$03 + 1821 2B20 AA TAX + 1822 2B21 18 CLC + 1823 2B22 65 59 ADC SAVMSC+1 + 1824 2B24 85 E1 STA $E1 + 1825 2B26 A0 BF LDY #$BF + 1826 2B28 A9 00 LDA #$00 + 1827 2B2A label93 + 1828 2B2A 91 E0 STA ($E0),Y + 1829 2B2C 88 DEY + 1830 2B2D C0 FF CPY #$FF + 1831 2B2F D0 F9 BNE label93 + 1832 2B31 C6 E1 DEC $E1 + 1833 2B33 CA DEX + 1834 2B34 10 F4 BPL label93 + 1835 2B36 68 PLA + 1836 2B37 A8 TAY + 1837 2B38 4C EC 2A JMP label92 + 1838 2B3B label88 + 1839 2B3B A5 C9 LDA $C9 + 1840 2B3D 48 PHA + 1841 2B3E A5 C8 LDA $C8 + 1842 2B40 48 PHA + 1843 2B41 60 RTS + 1844 2B42 label87 + 1845 2B42 E6 C8 INC $C8 + 1846 2B44 D0 02 BNE label94 + 1847 2B46 E6 C9 INC $C9 + 1848 2B48 label94 + 1849 2B48 A2 00 LDX #$00 + 1850 2B4A A1 C8 LDA ($C8,X) + 1851 2B4C 60 RTS + 1852 2B4D GoErrorDisp + 1853 2B4D 4C 07 22 JMP ErrorDisplay + 1854 ; Skok do Sio lub procedury Turbo + 1855 2B50 GoSIO + 1856 2B50 AC 96 21 LDY USmode + 1857 2B53 F0 03 BEQ StandardSpeed + 1858 2B55 4C 36 28 JMP HappyUSMovedProc ; mozna skakac do tej procki + 1859 2B58 StandardSpeed + 1860 2B58 4C 59 E4 JMP JSIOINT + 1861 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) + 1862 ; do bloku kontroli transmisji szeregowej DCB + 1863 2B5B Table2DCB + 1864 2B5B 8C 64 2B STY IOtableAddr+1 + 1865 2B5E 8E 65 2B STX IOtableAddr+2 + 1866 2B61 A2 0B LDX #$0B + 1867 2B63 IOtableAddr + 1868 2B63 BD FF FF LDA $FFFF,X + 1869 2B66 9D 00 03 STA DDEVIC,X + 1870 2B69 CA DEX + 1871 2B6A 10 F7 BPL IOtableAddr + 1872 2B6C 60 RTS + 1873 2B6D Close1 + 1874 2B6D A2 10 LDX #$10 + 1875 2B6F CloseX + 1876 2B6F A9 0C LDA #$0C + 1877 2B71 9D 42 03 STA ICCMD,X + 1878 2B74 4C 56 E4 JMP JCIOMAIN + 1879 2B77 GetKey + 1880 2B77 A2 10 LDX #$10 + 1881 2B79 A9 03 LDA #$03 + 1882 2B7B 9D 42 03 STA ICCMD,X + 1883 2B7E A9 04 LDA #$04 + 1884 2B80 9D 4A 03 STA ICAX1,X + 1885 2B83 A9 00 LDA #$00 + 1886 2B85 9D 4B 03 STA ICAX2,X + 1887 2B88 9D 49 03 STA ICBUFL+1,X + 1888 2B8B A9 FF LDA #$FF + 1889 2B8D 9D 48 03 STA ICBUFL,X + 1890 2B90 A9 BE LDA #Kdriver + 1893 2B97 9D 45 03 STA ICBUFA+1,X + 1894 2B9A 20 56 E4 JSR JCIOMAIN + 1895 2B9D 30 1C BMI GKeyError + 1896 2B9F A2 10 LDX #$10 + 1897 2BA1 A9 00 LDA #$00 + 1898 2BA3 9D 48 03 STA ICBUFL,X + 1899 2BA6 9D 49 03 STA ICBUFL+1,X + 1900 2BA9 A9 07 LDA #$07 + 1901 2BAB 9D 42 03 STA ICCMD,X + 1902 2BAE 20 56 E4 JSR JCIOMAIN + 1903 2BB1 30 08 BMI GKeyError + 1904 2BB3 48 PHA + 1905 2BB4 20 6D 2B JSR Close1 + 1906 2BB7 30 02 BMI GKeyError + 1907 2BB9 68 PLA + 1908 2BBA 60 RTS + 1909 2BBB GKeyError + 1910 2BBB 4C 4D 2B JMP GoErrorDisp + 1911 2BBE Kdriver + 1912 2BBE 4B 3A 9B .BY "K:",$9B + 1913 2BC1 DiscChangeCheck + 1914 2BC1 A0 80 LDY #DirMapSectorBuff + 1916 2BC5 20 6F 2A JSR ReadFirstSect + 1917 2BC8 A2 7F LDX #$7F + 1918 2BCA label98 + 1919 2BCA BD 00 2D LDA FirstSectorBuff,X + 1920 2BCD DD 80 2D CMP DirMapSectorBuff,X + 1921 2BD0 D0 05 BNE ChangedD + 1922 2BD2 CA DEX + 1923 2BD3 10 F5 BPL label98 + 1924 2BD5 A9 00 LDA #$00 + 1925 2BD7 ChangedD + 1926 2BD7 60 RTS + 1927 ; obsluga gwiazdki + 1928 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * + 1929 ; w Y jest ) - X moze lepiej nie ruszac :) + 1930 2BD8 Asteriks + 1931 2BD8 A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + 1932 2BDA 20 F6 2B JSR GetHexNumber + 1933 2BDD 8D C5 02 STA COLPF1S ; literki + 1934 2BE0 C8 INY + 1935 2BE1 20 F6 2B JSR GetHexNumber + 1936 2BE4 8D C6 02 STA COLPF2S ; tlo + 1937 2BE7 C8 INY + 1938 2BE8 20 F6 2B JSR GetHexNumber + 1939 2BEB 8D C8 02 STA COLBAKS ; ramka + 1940 2BEE C8 INY + 1941 2BEF 20 F6 2B JSR GetHexNumber + 1942 2BF2 8D 9A 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + 1943 2BF5 60 RTS + 1944 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX + 1945 ; i zamienia na bajt w A + 1946 2BF6 GetHexNumber + 1947 2BF6 20 06 2C JSR GetHEX4bits + 1948 2BF9 0A ASL + 1949 2BFA 0A ASL + 1950 2BFB 0A ASL + 1951 2BFC 0A ASL + 1952 2BFD 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + 1953 2BFF C8 INY + 1954 2C00 20 06 2C JSR GetHEX4bits + 1955 2C03 05 E4 ORA TempZP + 1956 2C05 60 RTS + 1957 2C06 GetHEX4bits + 1958 2C06 B1 D4 LDA ($D4),Y + 1959 2C08 38 SEC + 1960 2C09 E9 30 SBC #'0' + 1961 2C0B C9 0A CMP #$0A ; sprawdzmy czy cyfra + 1962 2C0D 90 02 BCC IsNumber + 1963 2C0F E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow + 1964 2C11 IsNumber + 1965 2C11 60 RTS + 1966 ; Ustawia numer satcji wg A + 1967 2C12 SeTDriveNR + 1968 2C12 C9 09 CMP #$09 + 1969 2C14 B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + 1970 2C16 20 34 2C JSR SeTblokDanychDrive + 1971 2C19 18 CLC + 1972 2C1A 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + 1973 2C1C 8D 49 23 STA DriveDisp1 + 1974 2C1F A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu + 1975 2C21 8D 48 23 STA DriveDisp1-1 + 1976 2C24 60 RTS + 1977 2C25 SeTDriveLetter + 1978 2C25 20 34 2C JSR SeTblokDanychDrive + 1979 2C28 18 CLC + 1980 2C29 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + 1981 2C2B 8D 49 23 STA DriveDisp1 + 1982 2C2E A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + 1983 2C30 8D 48 23 STA DriveDisp1-1 + 1984 2C33 60 RTS + 1985 2C34 SeTblokDanychDrive + 1986 2C34 8D AC 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + 1987 2C37 8D B4 2A STA blokDanychIO+1 + 1988 2C3A 8D 36 29 STA blokDanychIO_GetUSSpeed+1 + 1989 2C3D 8D 64 2A STA blokDanychIO_PERCOM+1 + 1990 2C40 60 RTS + 1991 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku + 1992 2C41 MEMLOprint + 1993 2C41 AD E7 02 LDA MEMLO + 1994 2C44 48 PHA + 1995 2C45 4A LSR + 1996 2C46 4A LSR + 1997 2C47 4A LSR + 1998 2C48 4A LSR + 1999 2C49 20 9C 21 JSR bin2AsciiHex + 2000 2C4C 8D 7A 2C STA MEMLOvalue+2 + 2001 2C4F 68 PLA + 2002 2C50 20 9C 21 JSR bin2AsciiHex + 2003 2C53 8D 7B 2C STA MEMLOvalue+3 + 2004 2C56 AD E8 02 LDA MEMLO+1 + 2005 2C59 48 PHA + 2006 2C5A 4A LSR + 2007 2C5B 4A LSR + 2008 2C5C 4A LSR + 2009 2C5D 4A LSR + 2010 2C5E 20 9C 21 JSR bin2AsciiHex + 2011 2C61 8D 78 2C STA MEMLOvalue + 2012 2C64 68 PLA + 2013 2C65 20 9C 21 JSR bin2AsciiHex + 2014 2C68 8D 79 2C STA MEMLOvalue+1 + 2015 2C6B 20 C0 2A JSR PrintXY + 2016 2C6E 1C 17 .BY 28,23 + 2017 2C70 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" + 2018 2C78 MEMLOvalue + 2019 2C78 30 30 30 30 .BY "0000" + 2020 2C7C 00 .BY $00 + 2021 2C7D 60 RTS + 2022 + 2023 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo + 2024 + 2025 2C7E xjsrTableL + 2026 2C7E 64 78 7E .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + 2027 2C81 84 89 .BY <[xjsr4+1],<[xjsr5+1] + 2028 2C83 95 9F AB .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + 2029 2C86 B0 B8 .BY <[xjsr9+1],<[xjsrA+1] + 2030 2C88 xjsrTableH + 2031 2C88 28 28 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + 2032 2C8B 28 28 .BY >[xjsr4+1],>[xjsr5+1] + 2033 2C8D 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + 2034 2C90 28 28 .BY >[xjsr9+1],>[xjsrA+1] + 2035 ; miejsce na wyliczony offset o jaki przesuwamy procedure + 2036 2C92 HappyOffset + 2037 2C92 00 00 .WO $0000 + 2038 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) + 2039 2C94 DensityCodes + 2040 2C94 F3 E4 F1 .by +$80,"sdq" + 2041 ;.by "SDQ" + 2042 ;.by $0e,$15,$a0 + 2043 2C97 ONtext + 2044 2C97 CF CE A0 .BY +$80,"ON " + 2045 2C9A OFFtext + 2046 2C9A CF C6 C6 .BY +$80,"OFF" + 2047 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) + 2048 2C9D PDVMASKtemp + 2049 2C9D 00 .BY $00 + 2050 ; miejsce na blok PERCOM + 2051 2C9E PERCOMdata + 2052 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie + 2053 = 2CAA FirstSectorsTable=*+12 ; omijamy 12b na percom + 2054 ; zostawiamy $30 bajtow wolnego + 2055 + 2056 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow + 2057 = 2D00 ProgramEnd=FirstSectorBuff + 2058 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu + 2059 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu + 2060 2C9E FirstRun + 2061 ; odnotowujemy stan Shift z Bootowania + 2062 2C9E AD 0F D2 LDA SKSTAT + 2063 2CA1 29 08 and #$08 + 2064 2CA3 D0 03 BNE NoSHIFTboot + 2065 2CA5 8D 99 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 + 2066 2CA8 NoSHIFTboot + 2067 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie + 2068 2CA8 AD 01 D3 LDA PORTB + 2069 2CAB 29 02 AND #$02 + 2070 2CAD D0 0B BNE BrakBasica + 2071 ; jest Basic + 2072 2CAF A0 02 LDY #$2 + 2073 2CB1 BASstatprint + 2074 2CB1 B9 97 2C LDA ONtext,y + 2075 2CB4 99 64 23 STA BASstatus,y + 2076 2CB7 88 DEY + 2077 2CB8 10 F7 bpl BASstatprint + 2078 2CBA BrakBasica + 2079 ; Sprawdzamy istnienie QMEGa + 2080 2CBA A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy + 2081 2CBC testQMEGloop + 2082 2CBC B9 01 C0 LDA $C001,y + 2083 2CBF D9 EF 2C CMP QMEGstring,y + 2084 2CC2 D0 13 bne brakQMEGa + 2085 2CC4 88 dey + 2086 2CC5 10 F5 bpl testQMEGloop + 2087 ; jest QMEG + 2088 2CC7 A9 00 LDA #0 + 2089 2CC9 8D 97 21 STA QMEG + 2090 2CCC A0 02 LDY #$2 + 2091 2CCE Qstatprint + 2092 2CCE B9 97 2C LDA ONtext,y + 2093 2CD1 99 5C 23 STA QMEGstatus,y + 2094 2CD4 88 DEY + 2095 2CD5 10 F7 bpl Qstatprint + 2096 2CD7 brakQMEGa + 2097 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi + 2098 2CD7 AD 00 03 LDA DDEVIC + 2099 2CDA 18 clc + 2100 2CDB 6D 01 03 ADC DUNIT + 2101 2CDE 38 sec + 2102 2CDF E9 01 SBC #$01 + 2103 2CE1 29 0F AND #$0F ; zapamietanie numeru urzadzenia + 2104 2CE3 8D 98 21 STA BootDrive + 2105 2CE6 20 12 2C JSR SeTDriveNR + 2106 2CE9 20 AB 21 JSR EditorOpen + 2107 2CEC 4C D9 21 JMP mainprog + 2108 2CEF QMEGstring + 2109 2CEF 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 + 2110 2CF7 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" + 2111 ;.OPT List + 2112 + 2113 + 2114 = 0080 MAPCOUNTER + 2114 = 0082 COMPRESSEDMAPCOUNTER + 2114 = 0084 MAPCOUNTERMEM + 2114 = 0086 PREVFILESECTOR + 2114 = 0088 MAPPOSITIONMEM + 2114 = 008A SECTOROFFSET + 2114 = 008C SECTORSCOUNTER + 2114 org $02e0 + 2115 02E0-02E1> FD 1F .WO START + 2116 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) + 2117 ; OPT h- + 2118 ; org $0000 + 2119 ; .WO $0000 + 2120 diff --git a/msdos.xex b/msdos.xex new file mode 100644 index 0000000000000000000000000000000000000000..f543a7d218fd715a703eaa29da49a750b3f66634 GIT binary patch literal 3439 zcmai0eQ;A%7QcC~?MqWjgANi$ce&|jnvW7HV7EhAz%m91!qUZ2*BOH}nrKV0h>N=; zgpXS*+s70Y`PyjA@K|2qvFWsmx<+87-MmQQwoQfdA%(VSS)o2x0ddsqc?paDu`|9& z?z#7#bI(2Z+;i^vB@#bOdeY{6%ZkuuhhTCD6%Jvh18?U%WTuByc!F}H5EuG4zQTouK{d%&n*vwOB_@~^-p~0F z8`a;yj}6%s*A&f?Sqro}^xWI+Tjq9l6~S!ZtPu-vSaUY)Q%t222g8-ol_?8Uvl(9@j658yBz;6*PP_*f!|sI z!xVjw!@D@oK2gg*%kk&AAlfottL%tZz=3AEz^Vfyj5Nydk84G=6JHMe|s5aBwDeQ6MhtbYzG-r=9m`W>u@{0mtBJXYN2uVh7|e=dt38M04yN!yLK zokspmqw?#(v|us*g9W^(=R~AVWd)cIwp({Tm)EGj;dJB%-q_*5wHA+KK79DEM!qE1 zqms$F_=p*ym**~7vSKjQCEgv)_oz%|TlLEHq2lCXZLN zGFH-LBi$23(j=Qbtwltmd>h`B(Q`G@ijWZDkuY@&wWW!%)$&?`h$4_Xry^rha@!&WAxnenb@Zd>YS?_((t@1Q?_tK-E zbd*0>x8eowiq&q6dn0mZ%u-TP@^Bq?c%Sj$s+DecwJOU@?CAZZe0EI@e%f2(UWM_; z90kqzm$2wToL<2`BD9MDX&2ve0D?V zH+X0BQoeAST9b~wN6u8Vdrv9%f`cc5qp^||)P@fi@E^h28_qz!(^263Ha{tA0GY4B zbun;VpU~HF5-w>_h;^I@odvW0e1s9BdOgS*1h6#L z(%2ePt(;M{bdGwjzGt0UBfHn%noze4^(3x&=0Tv}u@W=3UlOO4# z0||O9kO-n3hFVZD!fdVu4Wo>dW8(L6lHSDsjdMw9EGd=JS#rOmWyzE^A2vK7W|OI+ ziBIbhr}AuX&=;jYY{}?pm?q}oQznCi*jf$iO%OYu-6Jt9zG{+m$u>)E1-m*iPR+QR z;$5&noB>J#49+Z;D?|4*((9Y-(BE2$HN}x*Q|Q+)=&(Z>Yu+?%?*qF!r_xPOHMkx@ z&yVYQbk8&wpVPzZdc-mqf>GKYaUXD9E$S9}dQ+WMB{zdH2Dcraal0$1g8-kd3ScF( zb2_~irDMw5sw9R6G79toirgUj zhi+-8j%>OFAv-7yGiAdRz{GI3vUm^O+YMTUSb875JHY%e3 zFeda}g<)UF2k)Rern23Az&+Q|-JC@y3THcLGfQ(^!dZj+3_05zkDr5c3TMlP&w%W? z%TV`RVj6$g99SMStI%Sx#jch1SY?fp;W}~HOh@24_E<$9FId4_56^nbszY~xzo6iU z;faAmfi(Y-SrV+yEoKR_2l|ju|1fWP-`sS_oKoI)Te&8wbqrj~<*GQ)XH#(?_}@b! z9wLJ$FW@;A2mHzBI-S7{P2mOj8QhPO&xH%_$H)cGKH$noamX(#M##Pa+4uB7@j4lY z(lTdJPIiUZvdcJqVC&}*=N0n~hwvyF5ZM+3ti2dGETXLgDrmdec`>U0#`&gmxSV?#~VmMv}zz}Q401!G-7J)pKZtn-l}=p{j18i2Ul z2ri+*xsO#CXSoIA?gKdlvnsyhV5JJ}v?^4yGai?7p=Ck&?&Nz{XAZ6lBinhOjiv+a z5s@p9g|Azn21QiTnIe%C*=2O$466=4G8BPc`jD$N2IWWALE+(Ca%Lz8PqiAnA%0#S z)H6q(D>*!(4g>0tKY;mmGe5nUuQt1+5#}~*{F5~a8~<#TMt_=IlbU?V3dQoii3{g0 zbS^4aktASASM{2;n_k`a_WscOrrRGvUk`nC@gca^*{tmsZ&->sCKijr@YVLRqo|4)YY%THFe9X-Sv3cifX*P yu689XTIH@z;x1gfY$bl`CA`?ZeDx|^h!=b7*Wgn76uZqn%~m>nfVs&0FzLTS`tvgY literal 0 HcmV?d00001 From c63f6d807b7cd18b4621ddb8b600c3ec0e9bf9bb Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 2 May 2024 10:47:41 +0200 Subject: [PATCH 2/9] MAC65 I/O library --- lib/iomac.asm | 292 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/sysequ.asm | 94 ++++++++++++++++ 2 files changed, 386 insertions(+) create mode 100644 lib/iomac.asm create mode 100644 lib/sysequ.asm diff --git a/lib/iomac.asm b/lib/iomac.asm new file mode 100644 index 0000000..6f0a514 --- /dev/null +++ b/lib/iomac.asm @@ -0,0 +1,292 @@ + .TITLE "IOMAC.LIB -- FTe system I/O macros" + .PAGE " Support Macros" + .IF .NOT .DEF IOCB + .ERROR "You must include SYSEQU.M65 ahead of this!!" + .ENDIF +; +; These macros are called by the actual I/O macros +; to perform the rudimentary register load functions. +; +; +; MACRO: @CH +; +; Loads IOCB number (parameter 1) into X register. +; +; If parameter value is 0 to 7, immediate channel number +; is assumed. +; +; If parameter value is > 7 then a memory location +; is assumed to contain the channel number. +; + .MACRO @CH + .IF %1>7 + LDA %1 + ASL A + ASL A + ASL A + ASL A + TAX + .ELSE + LDX #%1*16 + .ENDIF + .ENDM +; +; +; MACRO: @CV +; +; Loads Constant or Value into accumultor (A-register) +; +; If value of parameter 1 is 0-255, @CV +; assumes it's an (immediate) constant. +; +; Otherwise the value is assumed to +; be a memory location (non-zero page). +; +; +; + .MACRO @CV + .IF %1<256 + LDA #%1 + .ELSE + LDA %1 + .ENDIF + .ENDM +; +; +; +; +; MACRO: @FL +; +; @FL is used to establish a filespec (file name) +; +; If a literal string is passed, @FL will +; generate the string in line, jump +; around it, and place its address +; in the IOCB pointed to by the X-register. +; +; If a non-zero page label is passed +; the MACRO assumes it to be the label +; of a valid filespec and uses it instead. +; +; +; + .MACRO @FL + .IF %1<256 + JMP *+%1+4 +@F .BYTE %$1,0 + LDA # <@F + STA ICBADR,X + LDA # >@F + STA ICBADR+1,X + .ELSE + LDA # <%1 + STA ICBADR,X + LDA # >%1 + STA ICBADR+1,X + .ENDIF + .ENDM + .PAGE " XIO macro" +; +; MACRO: XIO +; +; FORM: XIO cmd,ch[,aux1,aux2][,filespec] +; +; ch is given as in the @CH macro +; cmd, aux1, aux2 are given as in the @CV macro +; filespec is given as in the @FL macro +; +; performs familiar XIO operations with/for OS/A+ +; +; If aux1 is given, aux2 must also be given +; If aux1 and aux2 are omitted, they are set to zero +; If the filespec is omitted, "S:" is assumed +; + .MACRO XIO + .IF %0<2 .OR %0>5 + .ERROR "XIO: wrong number of arguments" + .ELSE + @CH %2 + @CV %1 + STA ICCOM,X ; COMMAND + .IF %0>=4 + @CV %3 + STA ICAUX1,X + @CV %4 + STA ICAUX2,X + .ELSE + LDA #0 + STA ICAUX1,X + STA ICAUX2,X + .ENDIF + .IF %0=2 .OR %0=4 + @FL "S:" + .ELSE +@@IO .= %0 + @FL %$(@@IO) + .ENDIF + JSR CIO + .ENDIF + .ENDM + .PAGE " OPEN macro" +; +; MACRO: OPEN +; +; FORM: OPEN ch,aux1,aux2,filespec +; +; ch is given as in the @CH macro +; aux1 and aux2 are given as in the @CV macro +; filespec is given as in the @FL macro +; +; will attempt to open the given file name on +; the given channel, using the open "modes" +; specified by aux1 and aux2 +; + .MACRO OPEN + .IF %0<>4 + .ERROR "OPEN: wrong number of arguments" + .ELSE + .IF %4<256 + XIO COPN,%1,%2,%3,%$4 + .ELSE + XIO COPN,%1,%2,%3,%4 + .ENDIF + .ENDIF + .ENDM + .PAGE " BGET and BPUT macros" +; +; MACROS: BGET and BPUT +; +; FORM: BGET ch,buf,len +; BPUT ch,buf,len +; +; ch is given as in the @CH macro +; len is ALWAYS assumed to be an immediate +; and actual value...never a memory address +; buf must be the address of an appropriate +; buffer in memory +; +; puts or gets length bytes to/from the +; specified buffer, uses binary read/write +; +; +; first: a common macro +; + .MACRO @GP + @CH %1 + LDA #%4 + STA ICCOM,X + LDA # <%2 + STA ICBADR,X + LDA # >%2 + STA ICBADR+1,X + LDA # <%3 + STA ICBLEN,X + LDA # >%3 + STA ICBLEN+1,X + JSR CIO + .ENDM +; + .MACRO BGET + .IF %0<>3 + .ERROR "BGET: wrong number of parameters" + .ELSE + @GP %1,%2,%3,CGBINR + .ENDIF + .ENDM +; + .MACRO BPUT + .IF %0<>3 + .ERROR "BPUT: wrong number of parameters" + .ELSE + @GP %1,%2,%3,CPBINR + .ENDIF + .ENDM +; + .PAGE " PRINT macro" +; +; MACRO: PRINT +; +; FORM: PRINT ch[,buffer[,length]] +; +; ch is as given in @CH macro +; if no buffer, prints just a RETURN +; if no length given, 255 assumed +; +; used to print text. To print text without RETURN, +; length must be given. See OS/A+ manual +; +; EXCEPTION: second parameter may be a literal +; string (e.g., PRINT 0,"test"), in which +; case the length (if given) is ignored. +; + .MACRO PRINT + .IF %0<1 .OR %0>3 + .ERROR "PRINT: wrong number of parameters" + .ELSE + .IF %0>1 + .IF %2<128 + JMP *+4+%2 +@IO .BYTE %$2,$9B + @GP %1,@IO,%2+1,CPTXTR + .ELSE + .IF %0=2 + @GP %1,%2,255,CPTXTR + .ELSE + @GP %1,%2,%3,CPTXTR + .ENDIF + .ENDIF + .ELSE + JMP *+4 +@IO .BYTE $9B + @GP %1,@IO,1,CPTXTR + .ENDIF + .ENDIF + .ENDM +; + .PAGE " INPUT macro" +; +; MACRO: INPUT +; +; FORM: INPUT ch,buf,len +; +; ch is given as in the @CH macro +; buf MUST be a proper buffer address +; len may be omitted, in which case 255 is assumed +; +; gets a line of text input to the given +; buffer, maximum of length bytes +; + .MACRO INPUT + .IF %0<2 .OR %0>3 + .ERROR "INPUT: wrong number of parameters" + .ELSE + .IF %0=2 + @GP %1,%2,255,CGTXTR + .ELSE + @GP %1,%2,%3,CGTXTR + .ENDIF + .ENDIF + .ENDM + .PAGE " CLOSE macro" +; +; MACRO: CLOSE +; +; FORM: CLOSE ch +; +; ch is given as in the @CH macro +; +; closes channel ch +; + .MACRO CLOSE + .IF %0<>1 + .ERROR "CLOSE: wrong number of parameters" + .ELSE + @CH %1 + LDA #CCLOSE + STA ICCOM,X + JSR CIO + .ENDIF + .ENDM +; +;;;;;;;;;;; END OF IOMAC.LIB ;;;;;;;;;;;; +; diff --git a/lib/sysequ.asm b/lib/sysequ.asm new file mode 100644 index 0000000..bac7566 --- /dev/null +++ b/lib/sysequ.asm @@ -0,0 +1,94 @@ + .PAGE "FTe SYSTEM EQUATES FOR ATARI" +; +; FILE = #DN:SYSEQU.ASM +; +; +; I/O CONTROL BLOCK EQUATES +; +SAVEPC = * ; SAVE CURRENT ORG +; + *= $0340 ;START OF SYSTEM IOCBS +IOCB +; +ICHID *= *+1 ;DEVICE HANDLER IS (SET BY OS) +ICDNO *= *+1 ;DEVICE NUMBER (SET BY OS) +ICCOM *= *+1 ;I/O COMMAND +ICSTA *= *+1 ;I/O STATUS +ICBADR *= *+2 ;BUFFER ADDRESS +ICPUT *= *+2 ;DH PUT ROUTINE (ADR-1) +ICBLEN *= *+2 ;BUFFER LENGTH +ICAUX1 *= *+1 ;AUX 1 +ICAUX2 *= *+1 ;AUX 2 +ICAUX3 *= *+1 ;AUX 3 +ICAUX4 *= *+1 ;AUX 4 +ICAUX5 *= *+1 ;AUX 5 +ICAUX6 *= *+1 ;AUX 6 +; +IOCBLEN = *-IOCB ;LENGTH OF ONE IOCB +; +; IOCB COMMAND VALUE EQUATES +; +COPN = 3 ;OPEN +CGBINR = 7 ;GET BINARY RECORD +CGTXTR = 5 ;GET TEXT RECORD +CPBINR = 11 ;PUT BINARY RECORD +CPTXTR = 9 ;PUT TEXT RECORD +CCLOSE = 12 ;CLOSE +CSTAT = 13 ;GET STATUS +; +; DEVICE DEPENDENT COMMAND EQUATES FOR FILE MANAGER +; +CREN = 32 ;RENAME +CERA = 33 ;ERASE +CPRO = 35 ;PROTECT +CUNP = 36 ;UNPROTECT +CPOINT = 37 ;POINT +CNOTE = 38 ;NOTE +; +; AUX1 VALUES REQD FOR OPEN +; +OPIN = 4 ;OPEN INPUT +OPOUT = 8 ;OPEN OUTPUT +OPUPD = 12 ;OPEN UPDATE +OPAPND = 9 ;OPEN APPEND +OPDIR = 6 ;OPEN DIRECTORY +; + .PAGE +; +; EXECUTE FLAG DEFINES +; +EXCYES = $80 ; EXECUTE IN PROGRESS +EXCSCR = $40 ; ECHO EXCUTE INPUT TO SCREEN +EXCNEW = $10 ; EXECUTE START UP MODE +EXCSUP = $20 ; COLD START EXEC FLAG +; +; MISC ADDRESS EQUATES +; +CPALOC = $0A ; POINTER TO CP/A +WARMST = $08 ; WAR, START (0=COLD) +MEMLO = $02E7 ; AVAIL MEM (LOW) PTR +MEMTOP = $02E5 ; AVAIL MEM (HIGH) PTR +APPMHI = $0E ; UPPER LIMIT OF APPLICATION MEMORY +INITADR = $02E2 ; ATARI LOAD/INIT ADR +GOADR = $02E0 ; ATARI LOAD/GO ADR +CARTLOC = $BFFA ; CARTRIDGE RUN LOCATION +CIO = $E456 ;CIO ENTRY ADR +EOL = $9B ; END OF LINE CHAR +; +; CP/A FUNCTION AND VALUE DISPLACEMSNT +; (INDIRECT THROUGH CPALOC) +; IE. (CPALOC),Y +; +CPGNFN = 3 ; GET NEXT FILE NAME +CPDFDV = $07 ; DEFAULT DRIVE (3 BYTES) +CPBUFP = $0A ; CMD BUFF NEXT CHAR POINTR (1 BYTE) +CPEXFL = $0B ; EXECUTE FLAG +CPEXFN = $0C ; EXECUTE FILE NAME (16 BYTES) +CPEXNP = $1C ; EXECUTE NOTE/POINT VALUES +CPFNAM = $21 ; FILENAME BUFFER +RUNLOC = $3D ; CP/A LOAD/RUN ADR +CPCMDB = $3F ; COMMAND BUFFER (60 BYTES) +CPCMDGO = $F3 +; + *= SAVEPC ; RESTORE PC +; From 7ed6169e616455da4313612e190f91bf15a0b472 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 9 May 2024 12:36:46 +0200 Subject: [PATCH 3/9] Test C: --- lib/sysequ.asm | 40 +- lib/sysequ.asm.bak | 94 ++ loaderFN.asm | 2143 +++++++++++++++++++++++++++++++++++++++++ loaderFN.asm.bak | 2143 +++++++++++++++++++++++++++++++++++++++++ loaderFN.lab | 402 ++++++++ loaderFN.lst | 2248 ++++++++++++++++++++++++++++++++++++++++++++ loaderFN.xex | Bin 0 -> 3423 bytes 7 files changed, 7050 insertions(+), 20 deletions(-) create mode 100644 lib/sysequ.asm.bak create mode 100644 loaderFN.asm create mode 100644 loaderFN.asm.bak create mode 100644 loaderFN.lab create mode 100644 loaderFN.lst create mode 100644 loaderFN.xex diff --git a/lib/sysequ.asm b/lib/sysequ.asm index bac7566..09a8fe4 100644 --- a/lib/sysequ.asm +++ b/lib/sysequ.asm @@ -1,30 +1,30 @@ - .PAGE "FTe SYSTEM EQUATES FOR ATARI" +; .PAGE "FTe SYSTEM EQUATES FOR ATARI" ; ; FILE = #DN:SYSEQU.ASM ; ; ; I/O CONTROL BLOCK EQUATES ; -SAVEPC = * ; SAVE CURRENT ORG +;SAVEPC = * ; SAVE CURRENT ORG ; - *= $0340 ;START OF SYSTEM IOCBS -IOCB + +IOCB = $0340 ;START OF SYSTEM IOCBS ; -ICHID *= *+1 ;DEVICE HANDLER IS (SET BY OS) -ICDNO *= *+1 ;DEVICE NUMBER (SET BY OS) -ICCOM *= *+1 ;I/O COMMAND -ICSTA *= *+1 ;I/O STATUS -ICBADR *= *+2 ;BUFFER ADDRESS -ICPUT *= *+2 ;DH PUT ROUTINE (ADR-1) -ICBLEN *= *+2 ;BUFFER LENGTH -ICAUX1 *= *+1 ;AUX 1 -ICAUX2 *= *+1 ;AUX 2 -ICAUX3 *= *+1 ;AUX 3 -ICAUX4 *= *+1 ;AUX 4 -ICAUX5 *= *+1 ;AUX 5 -ICAUX6 *= *+1 ;AUX 6 +ICHID = IOCB ;DEVICE HANDLER IS (SET BY OS) +ICDNO = IOCB+1 ;DEVICE NUMBER (SET BY OS) +ICCOM = IOCB+2 ;I/O COMMAND +ICSTA = IOCB+3 ;I/O STATUS +ICBADR = IOCB+4 ;BUFFER ADDRESS +ICPUT = IOCB+6 ;DH PUT ROUTINE (ADR-1) +ICBLEN = IOCB+8 ;BUFFER LENGTH +ICAUX1 = IOCB+10 ;AUX 1 +ICAUX2 = IOCB+11 ;AUX 2 +ICAUX3 = IOCB+12 ;AUX 3 +ICAUX4 = IOCB+13 ;AUX 4 +ICAUX5 = IOCB+14 ;AUX 5 +ICAUX6 = IOCB+15 ;AUX 6 ; -IOCBLEN = *-IOCB ;LENGTH OF ONE IOCB +IOCBLEN = 16 ;LENGTH OF ONE IOCB ; ; IOCB COMMAND VALUE EQUATES ; @@ -53,7 +53,7 @@ OPUPD = 12 ;OPEN UPDATE OPAPND = 9 ;OPEN APPEND OPDIR = 6 ;OPEN DIRECTORY ; - .PAGE +; .PAGE ; ; EXECUTE FLAG DEFINES ; @@ -90,5 +90,5 @@ RUNLOC = $3D ; CP/A LOAD/RUN ADR CPCMDB = $3F ; COMMAND BUFFER (60 BYTES) CPCMDGO = $F3 ; - *= SAVEPC ; RESTORE PC +; *= SAVEPC ; RESTORE PC ; diff --git a/lib/sysequ.asm.bak b/lib/sysequ.asm.bak new file mode 100644 index 0000000..bac7566 --- /dev/null +++ b/lib/sysequ.asm.bak @@ -0,0 +1,94 @@ + .PAGE "FTe SYSTEM EQUATES FOR ATARI" +; +; FILE = #DN:SYSEQU.ASM +; +; +; I/O CONTROL BLOCK EQUATES +; +SAVEPC = * ; SAVE CURRENT ORG +; + *= $0340 ;START OF SYSTEM IOCBS +IOCB +; +ICHID *= *+1 ;DEVICE HANDLER IS (SET BY OS) +ICDNO *= *+1 ;DEVICE NUMBER (SET BY OS) +ICCOM *= *+1 ;I/O COMMAND +ICSTA *= *+1 ;I/O STATUS +ICBADR *= *+2 ;BUFFER ADDRESS +ICPUT *= *+2 ;DH PUT ROUTINE (ADR-1) +ICBLEN *= *+2 ;BUFFER LENGTH +ICAUX1 *= *+1 ;AUX 1 +ICAUX2 *= *+1 ;AUX 2 +ICAUX3 *= *+1 ;AUX 3 +ICAUX4 *= *+1 ;AUX 4 +ICAUX5 *= *+1 ;AUX 5 +ICAUX6 *= *+1 ;AUX 6 +; +IOCBLEN = *-IOCB ;LENGTH OF ONE IOCB +; +; IOCB COMMAND VALUE EQUATES +; +COPN = 3 ;OPEN +CGBINR = 7 ;GET BINARY RECORD +CGTXTR = 5 ;GET TEXT RECORD +CPBINR = 11 ;PUT BINARY RECORD +CPTXTR = 9 ;PUT TEXT RECORD +CCLOSE = 12 ;CLOSE +CSTAT = 13 ;GET STATUS +; +; DEVICE DEPENDENT COMMAND EQUATES FOR FILE MANAGER +; +CREN = 32 ;RENAME +CERA = 33 ;ERASE +CPRO = 35 ;PROTECT +CUNP = 36 ;UNPROTECT +CPOINT = 37 ;POINT +CNOTE = 38 ;NOTE +; +; AUX1 VALUES REQD FOR OPEN +; +OPIN = 4 ;OPEN INPUT +OPOUT = 8 ;OPEN OUTPUT +OPUPD = 12 ;OPEN UPDATE +OPAPND = 9 ;OPEN APPEND +OPDIR = 6 ;OPEN DIRECTORY +; + .PAGE +; +; EXECUTE FLAG DEFINES +; +EXCYES = $80 ; EXECUTE IN PROGRESS +EXCSCR = $40 ; ECHO EXCUTE INPUT TO SCREEN +EXCNEW = $10 ; EXECUTE START UP MODE +EXCSUP = $20 ; COLD START EXEC FLAG +; +; MISC ADDRESS EQUATES +; +CPALOC = $0A ; POINTER TO CP/A +WARMST = $08 ; WAR, START (0=COLD) +MEMLO = $02E7 ; AVAIL MEM (LOW) PTR +MEMTOP = $02E5 ; AVAIL MEM (HIGH) PTR +APPMHI = $0E ; UPPER LIMIT OF APPLICATION MEMORY +INITADR = $02E2 ; ATARI LOAD/INIT ADR +GOADR = $02E0 ; ATARI LOAD/GO ADR +CARTLOC = $BFFA ; CARTRIDGE RUN LOCATION +CIO = $E456 ;CIO ENTRY ADR +EOL = $9B ; END OF LINE CHAR +; +; CP/A FUNCTION AND VALUE DISPLACEMSNT +; (INDIRECT THROUGH CPALOC) +; IE. (CPALOC),Y +; +CPGNFN = 3 ; GET NEXT FILE NAME +CPDFDV = $07 ; DEFAULT DRIVE (3 BYTES) +CPBUFP = $0A ; CMD BUFF NEXT CHAR POINTR (1 BYTE) +CPEXFL = $0B ; EXECUTE FLAG +CPEXFN = $0C ; EXECUTE FILE NAME (16 BYTES) +CPEXNP = $1C ; EXECUTE NOTE/POINT VALUES +CPFNAM = $21 ; FILENAME BUFFER +RUNLOC = $3D ; CP/A LOAD/RUN ADR +CPCMDB = $3F ; COMMAND BUFFER (60 BYTES) +CPCMDGO = $F3 +; + *= SAVEPC ; RESTORE PC +; diff --git a/loaderFN.asm b/loaderFN.asm new file mode 100644 index 0000000..8fbbe70 --- /dev/null +++ b/loaderFN.asm @@ -0,0 +1,2143 @@ + ;MICRO SPARTA DOS 4.7 + +; w wersji 4.7 dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami +; "prawo"/"lewo" albo "gora"/"dol" ... ... ale to b.trudne +; ze wzgledu na mozliwosc roznej liczby plikow (stron) w zaleznosci czy wyswietlamy +; dlugie nazwy czy nie - nie da sie tego latwo zliczyc + +; dodany "Backspace" jako powrot do katalogu wyzej. + +; w wersji 4.6c zmieniony sposob rozpoznawania wielkosci sektora, dodane czytanie +; bloku PERCOM przy zmianie dysku... +; UWAGA! Bufor na pierwszy sektor ma dalej 128b, bezposrednio za nim jest bufor na sektor +; mapy, ktory moze byc zamazywany w chwili odczytu pierwszego sektora bez problemow. + + +; w wersji 4.6b poprawione dwa male bugi i dodane kulturalne wyjscie do DOS (Shift+Esc) ... +; ..... moznaby w tym momencie sprawdzac czy jest w ogole DOS w pamieci, bo bez DOS bedzie SelfTest + +; w wersji 4.6 wyeliminowane chwilowe przelaczanie na domyslne kolory, różne poprawki procedur, +; żeby więcej gier się uruchamiało (zmiany w resecie i zmiennych systemowych) + +; w wersji 4.5 obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera +; wyswietlanie "numeru" napedu w zaleznosci jak sie go wybierze (Dn: lub n: - cyfra lub litera) + +; w wersji 4.4 (niepublikowanej) poprawiony blad. Nie moze byc dwa razy po sobie znacznika dziury w skompresowanej mapie +; czyli dziura max 127 sektorow a nie jak porzednio 254 +; dodatkowo zapamietanie (na czas resetu przed czyszczeniem pamieci) +; stanu aktywnych urzadzen PBI i odtworzenie go po resecie (dzieki Drac030) + +; stan urzadzen na szynie PBI +PDVMASK = $0247 + +; nowa koncepcja zrobiona: + +; 1. wywalić turbo 'top-drive' + +; 2. przerobić loader i menu na obsługę sektorów dow. długości + +; 3. przepisac czytanie tablicy sektorów indeksowych z loadera do menu: +; a. w menu odczytywane są wszystkie sektory tablicy indeksowej +; b. budowana jest "skompresowana" tablica offsetów w stosunku do pierwszego sektora na nast. zasadzie: +; mamy nast. znaczniki : (nowa koncepcja) +; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) . Opłaci się używać do max 255 sektorów do przeskoczenia. +; 0xxxxxxx -- (0xxxxxxx = ile kolejnych sektorów wczytać) +; 00000000 -- następne 2 bajty to numer kolejnego sektora do odczytania +; + +; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList + + icl 'lib/SYSEQU.ASM' + + +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +;WARMST = $08 +BOOT = $09 +DOSVEC = $0a +DOSINI = $0c +;APPMHI = $0e + +IRQENS = $10 + + +; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) + +; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku +InBlockAddr = $24 ; word +; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) +ToBlockEnd = $26 ; word +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $28 +CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku + +CheckSUM = $30 +SecLenUS = $31 +SecBuffer = $32 +CRETRYZ = $34 +TransmitError =$35 +Looperka = $36 +StackCopy = $37 + + +SAVMSC = $58 +; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego +; katalog +CurrentDirBuf = $CA +; adres konca tego bufora (2 bajty) +CurrentDirBufEnd = $CC +; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) +DirMapSect = $D2 +; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu +; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji +; ma byc wyswietlany katalog od poczatku +LastFilesPageFlag = $D6 +; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony +; zawiera liczbe widocznych na ekranie plikow (1 bajt) +NamesOnScreen = $D9 +; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna +; wczesniej byl 1 bajt w $D6 +InMapPointer = $E2 +; zmienna tymczasowa na ZP (2 bajty) +TempZP = $E4 + +VSERIN = $020a +COLPF1S = $02c5 +COLPF2S = $02c6 +COLBAKS = $02c8 + +COLDST = $0244 +;MEMTOP = $02e5 +;MEMLO = $02e7 + +KBCODES = $02fc + +DDEVIC = $0300 +DUNIT = $0301 +DCOMND = $0302 +DBUFA = $0304 +DBYT = $0308 +DAUX1 = $030a +DAUX2 = $030b + +ICCMD = $0342 +ICBUFA = $0344 +;ICBUFA+1 = $0345 +ICBUFL = $0348 +;ICBUFL+1 = $0349 +ICAX1 = $034a +ICAX2 = $034b + +GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 +PORTB = $d301 + +VCOUNT = $D40B + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura +; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! +FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) + +START + JMP FirstRun ;1FFD 4C 70 21 + + +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania !!!!!! + +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 +FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + TXA + PHA + LDA ToFileEndL + PHA + LDA CompressedMapPos + PHA + LDA CompressedMapPos+1 + PHA + JSR GoInitAddr + PLA + STA CompressedMapPos+1 + PLA + STA CompressedMapPos + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) + AND InBlockAddr + CMP #$FF ; jesli oba sa $FF to..... + BNE FileNoFFFFHead + JSR FileGetBlockStart ; pobranie jeszcze raz +FileNoFFFFHead + JSR FileGetByte ; Pobranie adresu konca ladowanego bloku + SBC InBlockAddr ; i wyliczenie jego dlugosci + EOR #$FF ; UWAGA! Dlugosc jest zEORowana z $FFFF + STA ToBlockEnd ; czyli odjeta od $10000 + PHP ; odliczanie ilosci pobranych bajtow jest wiec potem robione + JSR FileGetByte ; przez dodawanie i sprawdzanie czy nie ZERO + PLP + SBC InBlockAddr+1 + EOR #$FF + STA ToBlockEnd+1 + SEC +WhatIsIt + BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y + ; ktory tylko wylacza skok !!! + DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! + LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ + STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu + LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem + STA $02E1 ; z adresem startu (bywa i tak). +FileNoFirstBlock + LDA #Jrts ; jesli nie jest to blok z adresem inicjacji + STA $02E3 ; to dzieki temu nic sie nie stanie + LDY #$00 +BlockReadLoop ;; petla odczytujaca z pliku blok binarny + INC ToFileEndL ;; zwiekszenie licznika bajtow w calym pliku i jesli ZERO + BEQ GoCheckEOF ;; skok do procedury sprawdzajacej dwa starsze jego bajty + CPX SecLen ;; sprawdzenie czy juz caly sektor przepisany jesli tak + bne NoNextSector1 ; -- + lda InSectorCountH ; -- obsluga sektorow ponad 256b + cmp SecLen+1 ; -- + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora +NoNextSector1 +FileSecBuffHaddr1 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + LDA FileSecBuff,X + INX + bne InBlockReadLoop ; -- + jsr IncrementationXH ; -- obsluga sektorow ponad 256b (ten trik dziala bo tam juz byl RTS :) ) +InBlockReadLoop + STA (InBlockAddr),Y + INY + BNE label15 + INC InBlockAddr+1 +label15 + INC ToBlockEnd + BNE BlockReadLoop + INC ToBlockEnd+1 + BNE BlockReadLoop + BEQ FileInit ; koniec bloku - skok pod adres inicjalizacji +GoCheckEOF + JSR CheckEOF ; skok do procedury wspolnej dla pobierania bloku i bajtu + BCS InBlockReadLoop ;tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +GoGetNextFileSect + JSR GetNextFileSect + BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +FileGetBlockStart + JSR FileGetByte + STA InBlockAddr + JSR FileGetByte + STA InBlockAddr+1 + RTS +GoInitAddr + JMP ($02E2) +GetDataSector +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO_Loader,X + STA DDEVIC,X + DEX + BPL SetDCB +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 +CheckEOF + INC ToFileEndH + BNE NotEOF + INC ToFileEndH+1 + BNE NotEOF +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) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLen ;; nie EOF, ale moze koniec sektora + bne ByteToACCU ; -- + lda InSectorCountH ; -- obsluga sektorow ponad 256b + cmp SecLen+1 ; -- + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU +FileSecBuffHaddr2 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + bne GoToSec ; -- +IncrementationXH ; taki trik - to przypadkiem jest podprogram, wiec mozna tu wskoczyc zamiast zwiekszac liczniki w innym miejscu po raz drugi + inc InSectorCountH ; -- + inc FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + inc FileSecBuffHaddr2 ; -- +GoToSec + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + tya + pha +ReadNextInSequence +SectorSequenceCount = *+1 + lda #$00 ; to już ma być zainicjowane!!! + beq NextMapPosition + dec SectorSequenceCount + inc SectorNumber + bne noIncDAUX2 + inc SectorNumber+1 +noIncDAUX2 + bne ReadyToRead + ;jak jest tutaj to jest błąd... + ;powinien być skok do self-testu... +NextMapPosition + jsr incCompressedMapPos + ;UWAGA! adres w mapie jest zawsze zwiększany o 1 + ;więc przed uruchomieniem loadera trzeba zainicjować adresem-1 + ldy #0 + lda (CompressedMapPos),y + bmi HowManyToSkip + beq SetNewStartSector + ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji + sta SectorSequenceCount + bne ReadNextInSequence ;zawsze skoczy +HowManyToSkip + and #%01111111 + clc + adc SectorNumber + sta SectorNumber + bcc noIncDAUX2_v2 + inc SectorNumber+1 +noIncDAUX2_v2 + bne ReadyToRead + ;jak jest tutaj to jest błąd... + ;powinien być skok do self-testu... +SetNewStartSector + jsr incCompressedMapPos + lda (CompressedMapPos),y + sta SectorNumber + jsr incCompressedMapPos + lda (CompressedMapPos),y + sta SectorNumber+1 +ReadyToRead + JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + + pla + tay + lda #>FileSecBuff ; -- + sta FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + sta FileSecBuffHaddr2 ; -- + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + stx InSectorCountH ; -- + JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + +incCompressedMapPos + inc CompressedMapPos + bne skipIncCompressedMapPos + inc CompressedMapPos+1 +skipIncCompressedMapPos + rts +; 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 +; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora +; mapy pliku do wczytania, potrzebny tylko na starcie ladowania +zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie +FirstMapSectorNr + .WO $0000 +LoadStart + ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + LDY MEMLO + LDA MEMLO+1 + STA InMemClearLoop+2 +OutMemClearLoop + LDA #$00 +InMemClearLoop + STA $0900,Y + INY + BNE InMemClearLoop + INC InMemClearLoop+2 + LDA InMemClearLoop+2 + CMP MEMTOP+1 + BCC OutMemClearLoop + LDA MEMTOP+1 + STA LastMemPageClear+2 + LDY MEMTOP + LDA #$00 +LastMemPageClear + STA $8000,Y + DEY + 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 +tempToFileEndL + .BY $00 + .endl +JAkieTurbo +USmode + .BY $01 ; 0 - brak turbo 1 - Ultra Speed +QMEG + .BY $01 ;1 - brak QMEGa 0 - jest QMEG +BootDrive + .BY $00 ;Numer stacji dysków z której sie BOOT robi +BootShift + .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety +FolderTurbo + .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT +NewColors + .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F + ORA #$30 + CMP #$3A + BCC labelka + CLC + ADC #$07 +labelka + RTS +Edriver + .BY "E:",$9b +EditorOpen + ; otwarcie ekranu !!! + LDX #$00 ; kanal nr 0 + JSR CloseX ; najpierw Zamkniecie Ekranu + BMI ErrorDisplay + LDX #$00 ; kanal nr 0 + LDA #$03 + STA ICCMD,X + LDA #$0C + STA ICAX1,X + STA ICBUFL,X + LDA #$00 + STA ICAX2,X + STA ICBUFL+1,X + LDA #Edriver + STA ICBUFA+1,X + JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 + BMI ErrorDisplay + RTS + +mainprog + LDA QMEG ; jesli jest QMEG to wylacza sie tryb US + AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza + STA USmode + BEQ NoUSSpeed + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler + ldy #blokDanychIO_GetUSSpeed + jsr Table2DCB + jsr JSIOINT ; wysylamy "?" + bpl USSpeed + lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage + sta USmode + beq NoUSSpeed +USSpeed + LDY #$2 +USstatprint + LDA ONtext,y + STA USstatus,y + DEY + bpl USstatprint + +NoUSSpeed + JMP ReadMainDir +Error148 + LDY #$94 ; kod bledu do Y + ; wyswietlenie komunikatu o bledzie - kod bledu w Y +ErrorDisplay + TYA + PHA + JSR Close1 + PLA + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex ; 4 starsze bity na HEX + STA ErrorNumHex + PLA + JSR bin2AsciiHex ; 4 mlodsze bity na HEX + STA ErrorNumHex+1 + JSR PrintXY + .BY $00,$00 + .BY $7d ; kod czyszczenia ekranu + .BY "ERROR - $" +ErrorNumHex + .BY "00",$00 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + STA KBCODES ; w A jest $FF + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie przechodzimy na te z ktorej sie ladowalismy + LDA BootDrive + ;LDA #1 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ; i odpalamy program od nowa +ReadMainDir + JSR ReadPERCOM + LDX #>FirstSectorBuff + LDY #= 4.39 (moga byc sektory wieksze niz 256b) + BNE Error148 ; Nieobslugiwany format dyskietki +SpartaDisk + LDX #$00 +; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 + LDA FirstSectorBuff+$1F + BMI Sektor128b + TAX + LDA #$00 + INX ; i wyliczenie starszego bajtu +Sektor128b + STA .adr loader.SecLen ; przed przepisaniem + STX .adr loader.SecLen+1 ; przed przepisaniem + ; pokazanie na ekranie + LDA DensityCodes,X + STA DensityDisplay +; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + LDY FirstSectorBuff+$09 + LDX FirstSectorBuff+$0A +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR +; ustawienie znacznika wlaczenia Turbo dla katalogu + LDA #$01 + STA FolderTurbo + STY DirMapSect + STX DirMapSect+1 + LDA #>DirSectorBuff + STA CurrentFileInfoBuff+1 + STA CurrentDirBuf+1 + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 + LDA #$00 + STA NamesOnScreen +label68 + LDA CurrentFileInfoBuff+1 + CMP CurrentDirBufEnd+1 + BCC NoLastFileInDir + BNE LastFilesPageJump + LDA CurrentFileInfoBuff + CMP CurrentDirBufEnd + BCS LastFilesPageJump +NoLastFileInDir + LDY #$00 + LDA (CurrentFileInfoBuff),Y + BEQ LastFilesPageJump + LDX #$22 + LDA #$20 ; spacja +label50 + STA GameName,X + DEX + BPL label50 + LDY #$10 + LDX #$0A +label51 + LDA (CurrentFileInfoBuff),Y + STA GameName,X + DEY + DEX + BPL label51 + LDA NamesOnScreen + CLC + ADC #$41 ; literka "A" + STA GameKeySymbol + LDA $D8 + BNE label52 + LDY #$00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y + AND #$19 + CMP #$09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 + LDX $D7 + BEQ label54 + CMP #$08 + BNE label54 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y + AND #$20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 +label56 + LDA SubDirText,X + STA GameName+12 + DEX + BPL label56 +label55 + JMP GameNamePrint +LastFilesPageJump + JMP LastFilesPage +label54 + JMP label59 +label52 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + AND #$18 + CMP #$08 + BNE label54 + LDA CurrentDirBufEnd + STA $D4 + LDA CurrentDirBufEnd+1 + STA $D5 +label65 + LDA $D5 + CMP $CF + BCC label60 + BNE label54 + LDA $D4 + CMP $CE + BCS label54 +; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy +label60 + LDY #$00 + LDA ($D4),Y + CMP #'*' + BNE CompareNames + STA NewColors + JSR Asteriks +CompareNames +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT + LDY #$0A ; 8+3 znaki +Checking62 + LDA ($D4),Y + CMP GameName,Y + BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw + DEY + BPL Checking62 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku +ReplacingName + LDA ($D4),Y + STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania + INY + CPY #$2E + BCC ReplacingName + BCS GameNamePrint +CheckNextName + LDA $D4 + CLC + ADC #$2E + STA $D4 + BCC label64 + INC $D5 +label64 + JMP label65 +GameNamePrint + LDA NamesOnScreen + CLC + ADC #$02 + STA YposGameName + JSR PrintXY + .BY $01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " +GameName + .BY " " + .BY $00 + LDA NamesOnScreen + ASL + TAX + LDA CurrentFileInfoBuff + STA FirstSectorsTable,X + LDA CurrentFileInfoBuff+1 + STA FirstSectorsTable+1,X + LDA CurrentFileInfoBuff + CLC + ADC #$17 + STA CurrentFileInfoBuff + BCC label66 + INC CurrentFileInfoBuff+1 +label66 + INC NamesOnScreen + LDA NamesOnScreen + CMP #$13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 +label59 + LDA CurrentFileInfoBuff + CLC + ADC #$17 + STA CurrentFileInfoBuff + BCC label69 + INC CurrentFileInfoBuff+1 +label69 + JMP label68 +MainDirKEY + JMP ReadMainDir +UpDirKEY + LDY #$02 + LDA (CurrentDirBuf),Y + TAX + DEY + ORA (CurrentDirBuf),Y + BEQ KeyboardProc + LDA (CurrentDirBuf),Y + TAY + JMP ReadDIR +EscKEY + ; sprawdzmy czy z Shift + LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! + and #$08 + BNE NoSHIFTEsc + JSR EditorOpen + JMP (DOSVEC) +NoSHIFTEsc + LDX #$00 + STX $D8 + INX + STX $D7 +ToStartOfDirJump + JMP ToStartOfDir +SpaceKEY + LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy + BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku + JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej +; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie +ContArrowsPrint + JSR PrintXY + .BY $01,$15 + .BY $1D ; strzalka w dol + .BY $00 + JSR PrintXY + .BY $0E,$15 + .BY $1D ; strzalka w dol + .BY $00 + JMP KeyboardProc +LastFilesPage + INC LastFilesPageFlag +KeyboardProc + LDA NewColors + BNE ColorsAlreadySet + LDA #$C4 ; ustawienie koloru tła i liter + STA COLPF2S + STA COLBAKS + LDA #$CA + STA COLPF1S +ColorsAlreadySet + JSR GetKey + AND #%01111111 ; eliminujemy invers + BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + CMP #$3E ; ">" + BEQ MainDirKEY + CMP #$3C ; "<" + BEQ UpDirKEY + CMP #$7E ; BackSpace + BEQ UpDirKEY + CMP #$1B ; Esc + BEQ EscKEY + CMP #$20 ; Spacja + BEQ SpaceKEY + ; ---------------- + ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + CMP #$10 + BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + JSR SeTDriveLetter + JMP mainprog +noCtrlLetter + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR + JMP mainprog + ; ----------------- +NoNumber + CMP #'a' ; czy nie ma capsa + BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany + SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) +BigLetters + SEC + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie + BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz + ASL + TAX + LDA FirstSectorsTable,X + STA $D4 + LDA FirstSectorsTable+1,X + STA $D5 + LDY #$00 + LDA ($D4),Y + AND #$20 ; sprawdzamy czy to klatalog czy plik + BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader + ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran + LDY #$02 + LDA ($D4),Y + TAX + DEY + LDA ($D4),Y + TAY + JMP ReadDIR +SubDirText + .BY "" +GOtoLoader + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiskNotChanged1 + JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego +DiskNotChanged1 + LDA FolderTurbo + BEQ SetTurboOFF + LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT +SetTurboOFF + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO+$A ; od razu do bloku IOCB + INY + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO+$B ; od razu do bloku IOCB + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.tempToFileEndL + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.ToFileEndH+1 ; przed przepisaniem +; wszystko zapamietane mozna robic mape sektorow.... +; skompresowana mapa bedzie tworzona w buforze sektora katalogu +; czyli DirSectorBuff +; sektor mapy przed kompresja leci do DirMapSectorBuff +; UWAGA +; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi +; zawierac rozkaz przeczytania pierwszego sektora!!!!! +CompressedMap = DirSectorBuff +; czytamy pierwszy sektor mapy + LDY #DirMapSectorBuff + Jsr ReadSector +; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! + LDA #00 + STA CompressedMapCounter + STA CompressedMapCounter+1 + JSR AddToCompressedMAP + LDA DirMapSectorBuff+4 + STA PrevFileSector + JSR AddToCompressedMAP + LDA DirMapSectorBuff+5 + sta PrevFileSector+1 + JSR AddToCompressedMAP + ; Inicjujemy liczniki + .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 + .zpvar PrevFileSector, MapPositionMem .word + .zpvar SectorOffset .word + .zpvar SectorsCounter .byte + LDA #$00 + STA MapCounter+1 + STA SectorsCounter + lda #$06 + STA MapCounter +GenerateCompressedMap + CLC + LDA #DirMapSectorBuff + ADC MapCounter+1 + STA MAPPositionMem+1 + LDX #0 + LDY #1 + LDA (MAPPositionMem,x) + ORA (MAPPositionMem),y + BEQ Sector00 + SEC + LDA (MAPPositionMem,x) + SBC PrevFileSector + STA SectorOffset + LDA (MAPPositionMem),y + SBC PrevFileSector+1 + STA SectorOffset+1 + ; mamy odstep miedzy poprzednim a nastepnym sektorem + BNE OffsetToBig + LDA SectorOffset + BMI OffsetToBig ; max przeskok 127 sektorow + CMP #$01 + BNE JumpForward + ; kolejny sektor + ; zwiekszamy wiec licznik + inc SectorsCounter + LDA SectorsCounter + CMP #%01111111 + BNE GetNextMapWord + ; tu licznik dotarl do konca zerujemy go + ; dodajemy wpis do skompresowanej mapy i gotowe + JSR AddToCompressedMAP + LDA #0 + STA SectorsCounter + BEQ GetNextMapWord +; ominiecie wyznaczonej ilości sektorów (w A) +JumpForward + JSR FlushBuffer + LDA SectorOffset + ORA #%10000000 + JSR AddToCompressedMAP + JMP GetNextMapWord +; wyznaczenie skoku do nowego sektora pliku +OffsetToBig + JSR FlushBuffer + LDA #0 + JSR AddToCompressedMAP + LDY #00 + LDA (MAPPositionMem),y + JSR AddToCompressedMAP + LDY #01 + LDA (MAPPositionMem),y + JSR AddToCompressedMAP +GetNextMapWord + ; zapamietanie numeru obecnego sektora do porownania potem + LDY #00 + LDA (MAPPositionMem),y + STA PrevFileSector + INY + LDA (MAPPositionMem),y + STA PrevFileSector+1 +Sector00 + ADW MapCounter #2 +ops01 + ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala + LDA MapCounter+1 + CMP .adr loader.SecLen+1 + bne noteqal01 + LDA MapCounter + CMP .adr loader.SecLen +noteqal01 + JNE GenerateCompressedMap +; czytamy nastepny sektor mapy + ; sprawdzmy czy nie koniec + LDA DirMapSectorBuff + ORA DirMapSectorBuff+1 + BEQ EndMakingMap + LDA DirMapSectorBuff + sta blokDanychIO+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO+$B + LDY #DirMapSectorBuff + Jsr ReadSector + ; zerujemy licznik mapy + LDA #$00 + STA MapCounter+1 + lda #$04 + STA MapCounter + JMP GenerateCompressedMap +; dpisanie bajtu z A do mapy sektorow skompresowanej +AddToCompressedMAP + PHA + ; wyliczamy adresa + CLC + LDA CompressedMapCounter + ADC #CompressedMap + STA xxxxbla+1 + PLA +xxxxbla=*+1 + STA $FFFF + INC CompressedMapCounter + BNE noinc013 + INC CompressedMapCounter+1 +noinc013 + RTS +FlushBuffer + LDA SectorsCounter + BEQ NoFlush + JSR AddToCompressedMAP + LDA #0 + STA SectorsCounter +NoFlush + RTS +EndMakingMap + JSR FlushBuffer +LoaderGo + LDY #$00 + STY COLDST + LDA #$01 + STA BOOT + LDX $700 + CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta + BNE NoRunFromDOS + STA $03F8 ; to wylaczalo BASIC !!! +; STA $D5EC ; to wylacza SpartaDOS X +; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) +NoRunFromDOS + LDA #AfterWormStart + STA DOSINI+1 +; LDA #>JRESETCD +; STA DOSVEC+1 +; LDA #TempMEMLO + ADC .adr loader.SecLen+1 + STA MEMLO+1 + STA CompressedMapPos+1 +; STA pointerMov2b +; STA APPMHI+1 + ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora + ; jest to jednoczesnie adres umieszczenia skompresowanej + ; mapy sektorow pliku dla loadera ale MINUS 1 + DEW CompressedMapPos + ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej + ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) + CLC + LDA MEMLO +; ADC CompressedMapCounter +; STA MEMLO + STA TurboRelocADDR + LDA MEMLO+1 +; ADC CompressedMapCounter+1 +; STA MEMLO+1 + STA TurboRelocADDR+1 + LDA #JTESTROM + STA DOSINI+1 +; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) +; INC $033D ; bajty kontrolne zimnego startu +; INC $033E ; zmiana ich wartosci wymusza +; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) + LDX #$00 + STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) +; STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X + STA $0700,X + LDA movedproc+$0100,X + STA $0800,X + INX + BNE moveloop1 +; przepisanie skompresowanej mapy sektorow pliku za bufor sektora +/* moveloop2 + DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy +pointerMov2a=*+2 + LDA CompressedMap,x ; kod samomodyfikujacy sie +pointerMov2b=*+2 + STA $FFFF,x ; kod samomodyfikujacy sie + LDA CompressedMapCounter + AND CompressedMapCounter+1 + CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! + BEQ SectorMapReady + INX + BNE moveloop2 + inc pointerMov2a + inc pointerMov2b + bne moveloop2 +SectorMapReady + */ + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + + LDX #$00 + TXA +; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) +ClearLoop1 + STA $0100,X ; STOS !!! + STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) + STA $0500,X + STA $0600,X + CPX #$80 ;tylko ponad $80 + BCC NoZpage + STA $00,X ; czyli polowa strony zerowej +NoZpage + INX + BNE ClearLoop1 + LDX #$FF + TXS ; "wyzerowanie wskaznika STOSU + + ; a tutaj otwieramy kanal 1 CIO do odczytu + + LDX #1*16 ; kanal 1 + LDA #COPN ; rozkaz OPEN + STA ICCOM,X ; COMMAND + LDA #$04 ; READ + STA ICAUX1,X + LDA #$00 + STA ICAUX2,X + LDA # FileToOpen + STA ICBADR+1,X + JSR CIO + + JMP loader.LoadStart ; po przepisaniu +FileToOpen + .BYTE "C:",0 +; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba +; na koniec odpowiednie zmodyfikowanie MEMLO +ADDspeedProc + LDA USmode + beq NoHappyLoader +; wyznaczamy offset procedury + SEC + LDA #HappyUSMovedProc + SBC MEMLO+1 + STA HappyOffset+1 + + LDY #0 + LDX #[$A-1] ;xjsrA - the last + ; relokujemy skoki pod offset z MEMLO +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC HappyOffset + STA (SecBuffer),y + INY + LDA (SecBuffer),y + SBC HappyOffset+1 + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + LDX #[EndHappyUSProc-HappyUSMovedProc-1] +label72x + LDA HappyUSMovedProc,X +TurboRelocADDR=*+1 + STA $0A00,X + DEX + CPX #$FF + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA + CLC + ADC MEMLO + STA MEMLO + TXA + ADC MEMLO+1 + STA MEMLO+1 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS + + + +; UWAGA !!!!!!!!!!!!!! +; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! +; powiekszenie jej O BAJT spowoduje ze przekroczy strone +; i nie przepisze sie prawidlowo na swoje miejsce !!!!! +HappyUSMovedProc ; + + LDA DBUFA + STA SecBuffer + LDA DBUFA+1 + STA SecBuffer+1 + + LDA DBYT + STA SecLenUS + + SEI + TSX + STX StackCopy + LDA #$0D + STA CRETRYZ + ;command retry on zero page +CommandLoop +HappySpeed = *+1 + LDA #$28 ;here goes speed from "?" + STA AUDF3 + LDA #$34 + STA PBCTL ;ustawienie linii command + LDX #$80 +DelayLoopCmd + DEX + BNE DelayLoopCmd + STX AUDF4 ; zero + STX TransmitError +; pokey init + LDA #$23 +xjsr1 JSR SecTransReg + ; + + CLC + LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + ADC DUNIT ; dodajemy numer stacji + ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + STA CheckSum + STA SEROUT + LDA DCOMND +xjsr2 JSR PutSIOByte + LDA DAUX1 +xjsr3 JSR PutSIOByte + LDA DAUX2 +xjsr4 JSR PutSIOByte + LDA CheckSum +xjsr5 JSR PutSIOByte + +waitforEndOftransmission + LDA IRQST + AND #$08 + BNE waitforEndOftransmission + + LDA #$13 +xjsr6 JSR SecTransReg + + LDA #$3c + STA PBCTL ;command line off +; two ACK's + LDY #2 +DoubleACK +xjsr7 JSR GetSIOByte + CMP #$44 + BCS ErrorHere + DEY + BNE DoubleACK + + ;ldy #0 + STY CheckSum +ReadSectorLoop +xjsr8 JSR GetSIOByte + STA (SecBuffer),y +xjsr9 JSR AddCheckSum + INY + CPY SecLenUS + BNE ReadSectorLoop + +xjsrA JSR GetSIOByte + CMP CheckSum + BEQ EndOfTransmission +;error!!! +ErrorHere + LDY #$90 + STY TransmitError + LDX StackCopy + TXS + DEC CRETRYZ + BNE CommandLoop + +EndOfTransmission + LDA #0 + STA AUDC4 + LDA IRQENS + STA IRQEN + CLI + LDY TransmitError + RTS + +SecTransReg + STA SKCTL + STA SKSTRES + LDA #$38 + STA IRQEN + LDA #$28 + STA AUDCTL + LDA #$A8 + STA AUDC4 + RTS + +PutSIOByte + TAX +waitforSerial + LDA IRQST + AND #$10 + BNE waitforSerial + + STA IRQEN + LDA #$10 + STA IRQEN + + TXA + STA SEROUT + +AddCheckSum + CLC + ADC CheckSum + ADC #0 + STA CheckSum + RTS + +GetSIOByte + LDX #10 ;acktimeout +ExternalLoop + LDA #0 + STA looperka +InternalLoop + LDA IRQST + AND #$20 + BEQ ACKReceive + DEC looperka + BNE InternalLoop + DEX + BNE ExternalLoop + BEQ ErrorHere +ACKReceive + ; zero we have now + STA IRQST + LDA #$20 + STA IRQST + LDA SKSTAT + STA SKSTRES + AND #$20 + BEQ ErrorHere + ; + LDA SERIN + RTS +EndHappyUSProc + + +; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO_GetUSSpeed + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 +label39 + STA $DA + LDA CurrentFileInfoBuff + STA $DB + LDA CurrentFileInfoBuff+1 + STA $DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 + PLA + PLA + JMP ReadMainDir +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect + STA blokDanychIO+10 + LDA DirMapSect+1 + STA blokDanychIO+11 + ORA blokDanychIO+10 + BEQ DirMapEnd + LDX #>DirMapSectorBuff + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y + STA blokDanychIO+10 + INY + LDA (TempZP),Y + STA blokDanychIO+11 + ORA blokDanychIO+10 + BEQ label75 + ; i zwiekszenie wskaznika mapy o 2 + INY + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + LDA MEMTOP + SEC + SBC CurrentFileInfoBuff + LDA MEMTOP+1 + SBC CurrentFileInfoBuff+1 + BEQ label75 + LDY CurrentFileInfoBuff + LDX CurrentFileInfoBuff+1 + JSR ReadSector + LDA $D4 + ORA $D5 + BNE label79 + LDY #$03 + LDA (CurrentFileInfoBuff),Y + STA $D4 + INY + LDA (CurrentFileInfoBuff),Y + STA $D5 + INY + LDA (CurrentFileInfoBuff),Y + BEQ label79 + LDA #$FF + STA $D4 + STA $D5 +label79 + LDA CurrentFileInfoBuff + CLC + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff + LDA CurrentFileInfoBuff+1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 + LDA $D4 + SEC + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 + LDA $D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 + BCS label80 + LDA CurrentFileInfoBuff + CLC + ADC $D4 + STA CurrentFileInfoBuff + LDA CurrentFileInfoBuff+1 + ADC $D5 + STA CurrentFileInfoBuff+1 +label75 + LDA $DC + CMP CurrentFileInfoBuff+1 + BCC label81 + BNE label82 + LDA $DB + CMP CurrentFileInfoBuff + BCC label81 + BNE label82 + RTS +label81 + LDA $DB + CLC + ADC $DA + STA $DB + BCC label75 + INC $DC + JMP label75 +label82 + LDA $DB + SEC + SBC $DA + STA CurrentFileInfoBuff + LDA $DC + SBC #$00 + STA CurrentFileInfoBuff+1 + RTS +; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora +ReadPERCOM + LDA #$04 + STA DiskRetryCount +ReadPERCOMretry + LDY #blokDanychIO_PERCOM + JSR Table2DCB + JSR GoSIO + BMI PercomError + ; blok odczytany - ustawmy dlugosc 1 sektora + LDA PERCOMdata+6 + CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + RTS +PercomError + DEC DiskRetryCount + BNE ReadPERCOMretry + ; blok nieodczytany - dlugosc 1 sektora na $80 +Set1Sect128 + LDA #$00 + STA PERCOMdata+6 + LDA #$80 + STA PERCOMdata+7 + RTS +blokDanychIO_PERCOM + .BY $31,$01,$4E,$40 + .WO PERCOMdata + .BY $0A,$00,12,$00,$01,$00 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 + STA blokDanychIO+10 + LDA #$00 + STA blokDanychIO+11 + LDA PERCOMdata+6 + STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + LDA PERCOMdata+7 + JMP ReadSector1 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +ReadSector1 + STA blokDanychIO+8 + STX blokDanychIO+5 + STY blokDanychIO+4 + LDA #$04 + STA DiskRetryCount +DiskReadRetry + LDY #blokDanychIO + JSR Table2DCB + JSR GoSIO + BMI label85 + RTS +label85 + DEC DiskRetryCount + BNE DiskReadRetry + PLA + PLA + JMP ErrorDisplay +blokDanychIO + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 +DiskRetryCount + .BY $00 +PrintXY + PLA + STA $C8 + PLA + STA $C9 + LDA #$00 + STA $DF + JSR label87 + PHA + JSR label87 + STA $DE + ASL + ASL + CLC + ADC $DE + ASL + ASL + ROL $DF + ASL + ROL $DF + CLC + ADC SAVMSC + STA $DE + LDA $DF + ADC SAVMSC+1 + STA $DF + PLA + TAY +label92 + JSR label87 + CMP #$00 + BEQ label88 + CMP #$7D + BEQ label89 + LDX #$00 + STX $E0 + CMP #$80 + ROR $E0 + AND #$7F + CMP #$20 + BCS label90 + ORA #$40 + BNE label91 +label90 + CMP #$60 + BCS label91 + SEC + SBC #$20 +label91 + ORA $E0 + STA ($DE),Y + INY + JMP label92 +label89 + TYA + PHA + LDA SAVMSC + STA $E0 + LDA #$03 + TAX + CLC + ADC SAVMSC+1 + STA $E1 + LDY #$BF + LDA #$00 +label93 + STA ($E0),Y + DEY + CPY #$FF + BNE label93 + DEC $E1 + DEX + BPL label93 + PLA + TAY + JMP label92 +label88 + LDA $C9 + PHA + LDA $C8 + PHA + RTS +label87 + INC $C8 + BNE label94 + INC $C9 +label94 + LDX #$00 + LDA ($C8,X) + RTS +GoErrorDisp + JMP ErrorDisplay +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 + STX IOtableAddr+2 + LDX #$0B +IOtableAddr + LDA $FFFF,X + STA DDEVIC,X + DEX + BPL IOtableAddr + RTS +Close1 + LDX #$10 +CloseX + LDA #$0C + STA ICCMD,X + JMP JCIOMAIN +GetKey + LDX #$10 + LDA #$03 + STA ICCMD,X + LDA #$04 + STA ICAX1,X + LDA #$00 + STA ICAX2,X + STA ICBUFL+1,X + LDA #$FF + STA ICBUFL,X + LDA #Kdriver + STA ICBUFA+1,X + JSR JCIOMAIN + BMI GKeyError + LDX #$10 + LDA #$00 + STA ICBUFL,X + STA ICBUFL+1,X + LDA #$07 + STA ICCMD,X + JSR JCIOMAIN + BMI GKeyError + PHA + JSR Close1 + BMI GKeyError + PLA + RTS +GKeyError + JMP GoErrorDisp +Kdriver + .BY "K:",$9B +DiscChangeCheck + LDY #DirMapSectorBuff + JSR ReadFirstSect + LDX #$7F +label98 + LDA FirstSectorBuff,X + CMP DirMapSectorBuff,X + BNE ChangedD + DEX + BPL label98 + LDA #$00 +ChangedD + RTS + ; obsluga gwiazdki + ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * + ; w Y jest ) - X moze lepiej nie ruszac :) +Asteriks + LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + JSR GetHexNumber + STA COLPF1S ; literki + INY + JSR GetHexNumber + STA COLPF2S ; tlo + INY + JSR GetHexNumber + STA COLBAKS ; ramka + INY + JSR GetHexNumber + STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + RTS + ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX + ; i zamienia na bajt w A +GetHexNumber + JSR GetHEX4bits + ASL + ASL + ASL + ASL + STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + INY + JSR GetHEX4bits + ORA TempZP + RTS +GetHEX4bits + LDA ($D4),Y + SEC + SBC #'0' + CMP #$0A ; sprawdzmy czy cyfra + BCC IsNumber + SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow +IsNumber + RTS + ; Ustawia numer satcji wg A +SeTDriveNR + CMP #$09 + BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + JSR SeTblokDanychDrive + CLC + ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + STA DriveDisp1 + LDA #'D'+$80 ; literka D przed numerem napedu + STA DriveDisp1-1 + RTS +SeTDriveLetter + JSR SeTblokDanychDrive + CLC + ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + STA DriveDisp1 + LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + STA DriveDisp1-1 + RTS +SeTblokDanychDrive + STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + STA blokDanychIO+1 + STA blokDanychIO_GetUSSpeed+1 + STA blokDanychIO_PERCOM+1 + RTS +; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku +MEMLOprint + LDA MEMLO + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex + STA MEMLOvalue+2 + PLA + JSR bin2AsciiHex + STA MEMLOvalue+3 + LDA MEMLO+1 + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex + STA MEMLOvalue + PLA + JSR bin2AsciiHex + STA MEMLOvalue+1 + JSR PrintXY + .BY 28,23 + .BY "MEMLO: $" +MEMLOvalue + .BY "0000" + .BY $00 + RTS + +; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo + +xjsrTableL + .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + .BY <[xjsr4+1],<[xjsr5+1] + .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + .BY <[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + .BY >[xjsr4+1],>[xjsr5+1] + .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + .BY >[xjsr9+1],>[xjsrA+1] +; miejsce na wyliczony offset o jaki przesuwamy procedure +HappyOffset + .WO $0000 +; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) +DensityCodes + .by +$80,"sdq" + ;.by "SDQ" + ;.by $0e,$15,$a0 +ONtext + .BY +$80,"ON " +OFFtext + .BY +$80,"OFF" +; miejsce na przechowanie stanu urzadzen PBI (przez reset) +PDVMASKtemp + .BY $00 +; miejsce na blok PERCOM +PERCOMdata +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable=*+12 ; omijamy 12b na percom + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow +ProgramEnd=FirstSectorBuff +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu +FirstRun +; odnotowujemy stan Shift z Bootowania + LDA SKSTAT + and #$08 + BNE NoSHIFTboot + STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 +NoSHIFTboot +; Sprawdzamy czy jest basic i ustawiamy status na ekranie + LDA PORTB + AND #$02 + BNE BrakBasica + ; jest Basic + LDY #$2 +BASstatprint + LDA ONtext,y + STA BASstatus,y + DEY + bpl BASstatprint +BrakBasica +; Sprawdzamy istnienie QMEGa + ldy #$06 ; bo 6 znaków w ROMie testujemy +testQMEGloop + LDA $C001,y + CMP QMEGstring,y + bne brakQMEGa + dey + bpl testQMEGloop + ; jest QMEG + LDA #0 + STA QMEG + LDY #$2 +Qstatprint + LDA ONtext,y + STA QMEGstatus,y + DEY + bpl Qstatprint +brakQMEGa + ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi + LDA DDEVIC + clc + ADC DUNIT + sec + SBC #$01 + AND #$0F ; zapamietanie numeru urzadzenia + STA BootDrive + JSR SeTDriveNR + JSR EditorOpen + JMP mainprog +QMEGstring + .BY "QMEG-OS",0 + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" + ;.OPT List + + + org $02e0 + .WO LoaderGo + ; .WO START + ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) +; OPT h- +; org $0000 +; .WO $0000 + \ No newline at end of file diff --git a/loaderFN.asm.bak b/loaderFN.asm.bak new file mode 100644 index 0000000..860f2e2 --- /dev/null +++ b/loaderFN.asm.bak @@ -0,0 +1,2143 @@ + ;MICRO SPARTA DOS 4.7 + +; w wersji 4.7 dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami +; "prawo"/"lewo" albo "gora"/"dol" ... ... ale to b.trudne +; ze wzgledu na mozliwosc roznej liczby plikow (stron) w zaleznosci czy wyswietlamy +; dlugie nazwy czy nie - nie da sie tego latwo zliczyc + +; dodany "Backspace" jako powrot do katalogu wyzej. + +; w wersji 4.6c zmieniony sposob rozpoznawania wielkosci sektora, dodane czytanie +; bloku PERCOM przy zmianie dysku... +; UWAGA! Bufor na pierwszy sektor ma dalej 128b, bezposrednio za nim jest bufor na sektor +; mapy, ktory moze byc zamazywany w chwili odczytu pierwszego sektora bez problemow. + + +; w wersji 4.6b poprawione dwa male bugi i dodane kulturalne wyjscie do DOS (Shift+Esc) ... +; ..... moznaby w tym momencie sprawdzac czy jest w ogole DOS w pamieci, bo bez DOS bedzie SelfTest + +; w wersji 4.6 wyeliminowane chwilowe przelaczanie na domyslne kolory, różne poprawki procedur, +; żeby więcej gier się uruchamiało (zmiany w resecie i zmiennych systemowych) + +; w wersji 4.5 obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera +; wyswietlanie "numeru" napedu w zaleznosci jak sie go wybierze (Dn: lub n: - cyfra lub litera) + +; w wersji 4.4 (niepublikowanej) poprawiony blad. Nie moze byc dwa razy po sobie znacznika dziury w skompresowanej mapie +; czyli dziura max 127 sektorow a nie jak porzednio 254 +; dodatkowo zapamietanie (na czas resetu przed czyszczeniem pamieci) +; stanu aktywnych urzadzen PBI i odtworzenie go po resecie (dzieki Drac030) + +; stan urzadzen na szynie PBI +PDVMASK = $0247 + +; nowa koncepcja zrobiona: + +; 1. wywalić turbo 'top-drive' + +; 2. przerobić loader i menu na obsługę sektorów dow. długości + +; 3. przepisac czytanie tablicy sektorów indeksowych z loadera do menu: +; a. w menu odczytywane są wszystkie sektory tablicy indeksowej +; b. budowana jest "skompresowana" tablica offsetów w stosunku do pierwszego sektora na nast. zasadzie: +; mamy nast. znaczniki : (nowa koncepcja) +; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) . Opłaci się używać do max 255 sektorów do przeskoczenia. +; 0xxxxxxx -- (0xxxxxxx = ile kolejnych sektorów wczytać) +; 00000000 -- następne 2 bajty to numer kolejnego sektora do odczytania +; + +; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList + + icl 'lib/SYSEQU.ASM' + + +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +WARMST = $08 +BOOT = $09 +DOSVEC = $0a +DOSINI = $0c +APPMHI = $0e + +IRQENS = $10 + + +; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) + +; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku +InBlockAddr = $24 ; word +; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) +ToBlockEnd = $26 ; word +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $28 +CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku + +CheckSUM = $30 +SecLenUS = $31 +SecBuffer = $32 +CRETRYZ = $34 +TransmitError =$35 +Looperka = $36 +StackCopy = $37 + + +SAVMSC = $58 +; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego +; katalog +CurrentDirBuf = $CA +; adres konca tego bufora (2 bajty) +CurrentDirBufEnd = $CC +; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) +DirMapSect = $D2 +; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu +; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji +; ma byc wyswietlany katalog od poczatku +LastFilesPageFlag = $D6 +; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony +; zawiera liczbe widocznych na ekranie plikow (1 bajt) +NamesOnScreen = $D9 +; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna +; wczesniej byl 1 bajt w $D6 +InMapPointer = $E2 +; zmienna tymczasowa na ZP (2 bajty) +TempZP = $E4 + +VSERIN = $020a +COLPF1S = $02c5 +COLPF2S = $02c6 +COLBAKS = $02c8 + +COLDST = $0244 +MEMTOP = $02e5 +MEMLO = $02e7 + +KBCODES = $02fc + +DDEVIC = $0300 +DUNIT = $0301 +DCOMND = $0302 +DBUFA = $0304 +DBYT = $0308 +DAUX1 = $030a +DAUX2 = $030b + +ICCMD = $0342 +ICBUFA = $0344 +;ICBUFA+1 = $0345 +ICBUFL = $0348 +;ICBUFL+1 = $0349 +ICAX1 = $034a +ICAX2 = $034b + +GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 +PORTB = $d301 + +VCOUNT = $D40B + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura +; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! +FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) + +START + JMP FirstRun ;1FFD 4C 70 21 + + +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania !!!!!! + +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 +FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + TXA + PHA + LDA ToFileEndL + PHA + LDA CompressedMapPos + PHA + LDA CompressedMapPos+1 + PHA + JSR GoInitAddr + PLA + STA CompressedMapPos+1 + PLA + STA CompressedMapPos + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) + AND InBlockAddr + CMP #$FF ; jesli oba sa $FF to..... + BNE FileNoFFFFHead + JSR FileGetBlockStart ; pobranie jeszcze raz +FileNoFFFFHead + JSR FileGetByte ; Pobranie adresu konca ladowanego bloku + SBC InBlockAddr ; i wyliczenie jego dlugosci + EOR #$FF ; UWAGA! Dlugosc jest zEORowana z $FFFF + STA ToBlockEnd ; czyli odjeta od $10000 + PHP ; odliczanie ilosci pobranych bajtow jest wiec potem robione + JSR FileGetByte ; przez dodawanie i sprawdzanie czy nie ZERO + PLP + SBC InBlockAddr+1 + EOR #$FF + STA ToBlockEnd+1 + SEC +WhatIsIt + BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y + ; ktory tylko wylacza skok !!! + DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! + LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ + STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu + LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem + STA $02E1 ; z adresem startu (bywa i tak). +FileNoFirstBlock + LDA #Jrts ; jesli nie jest to blok z adresem inicjacji + STA $02E3 ; to dzieki temu nic sie nie stanie + LDY #$00 +BlockReadLoop ;; petla odczytujaca z pliku blok binarny + INC ToFileEndL ;; zwiekszenie licznika bajtow w calym pliku i jesli ZERO + BEQ GoCheckEOF ;; skok do procedury sprawdzajacej dwa starsze jego bajty + CPX SecLen ;; sprawdzenie czy juz caly sektor przepisany jesli tak + bne NoNextSector1 ; -- + lda InSectorCountH ; -- obsluga sektorow ponad 256b + cmp SecLen+1 ; -- + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora +NoNextSector1 +FileSecBuffHaddr1 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + LDA FileSecBuff,X + INX + bne InBlockReadLoop ; -- + jsr IncrementationXH ; -- obsluga sektorow ponad 256b (ten trik dziala bo tam juz byl RTS :) ) +InBlockReadLoop + STA (InBlockAddr),Y + INY + BNE label15 + INC InBlockAddr+1 +label15 + INC ToBlockEnd + BNE BlockReadLoop + INC ToBlockEnd+1 + BNE BlockReadLoop + BEQ FileInit ; koniec bloku - skok pod adres inicjalizacji +GoCheckEOF + JSR CheckEOF ; skok do procedury wspolnej dla pobierania bloku i bajtu + BCS InBlockReadLoop ;tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +GoGetNextFileSect + JSR GetNextFileSect + BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +FileGetBlockStart + JSR FileGetByte + STA InBlockAddr + JSR FileGetByte + STA InBlockAddr+1 + RTS +GoInitAddr + JMP ($02E2) +GetDataSector +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO_Loader,X + STA DDEVIC,X + DEX + BPL SetDCB +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 +CheckEOF + INC ToFileEndH + BNE NotEOF + INC ToFileEndH+1 + BNE NotEOF +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) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLen ;; nie EOF, ale moze koniec sektora + bne ByteToACCU ; -- + lda InSectorCountH ; -- obsluga sektorow ponad 256b + cmp SecLen+1 ; -- + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU +FileSecBuffHaddr2 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + bne GoToSec ; -- +IncrementationXH ; taki trik - to przypadkiem jest podprogram, wiec mozna tu wskoczyc zamiast zwiekszac liczniki w innym miejscu po raz drugi + inc InSectorCountH ; -- + inc FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + inc FileSecBuffHaddr2 ; -- +GoToSec + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + tya + pha +ReadNextInSequence +SectorSequenceCount = *+1 + lda #$00 ; to już ma być zainicjowane!!! + beq NextMapPosition + dec SectorSequenceCount + inc SectorNumber + bne noIncDAUX2 + inc SectorNumber+1 +noIncDAUX2 + bne ReadyToRead + ;jak jest tutaj to jest błąd... + ;powinien być skok do self-testu... +NextMapPosition + jsr incCompressedMapPos + ;UWAGA! adres w mapie jest zawsze zwiększany o 1 + ;więc przed uruchomieniem loadera trzeba zainicjować adresem-1 + ldy #0 + lda (CompressedMapPos),y + bmi HowManyToSkip + beq SetNewStartSector + ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji + sta SectorSequenceCount + bne ReadNextInSequence ;zawsze skoczy +HowManyToSkip + and #%01111111 + clc + adc SectorNumber + sta SectorNumber + bcc noIncDAUX2_v2 + inc SectorNumber+1 +noIncDAUX2_v2 + bne ReadyToRead + ;jak jest tutaj to jest błąd... + ;powinien być skok do self-testu... +SetNewStartSector + jsr incCompressedMapPos + lda (CompressedMapPos),y + sta SectorNumber + jsr incCompressedMapPos + lda (CompressedMapPos),y + sta SectorNumber+1 +ReadyToRead + JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + + pla + tay + lda #>FileSecBuff ; -- + sta FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + sta FileSecBuffHaddr2 ; -- + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + stx InSectorCountH ; -- + JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + +incCompressedMapPos + inc CompressedMapPos + bne skipIncCompressedMapPos + inc CompressedMapPos+1 +skipIncCompressedMapPos + rts +; 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 +; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora +; mapy pliku do wczytania, potrzebny tylko na starcie ladowania +zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie +FirstMapSectorNr + .WO $0000 +LoadStart + ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + LDY MEMLO + LDA MEMLO+1 + STA InMemClearLoop+2 +OutMemClearLoop + LDA #$00 +InMemClearLoop + STA $0900,Y + INY + BNE InMemClearLoop + INC InMemClearLoop+2 + LDA InMemClearLoop+2 + CMP MEMTOP+1 + BCC OutMemClearLoop + LDA MEMTOP+1 + STA LastMemPageClear+2 + LDY MEMTOP + LDA #$00 +LastMemPageClear + STA $8000,Y + DEY + 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 +tempToFileEndL + .BY $00 + .endl +JAkieTurbo +USmode + .BY $01 ; 0 - brak turbo 1 - Ultra Speed +QMEG + .BY $01 ;1 - brak QMEGa 0 - jest QMEG +BootDrive + .BY $00 ;Numer stacji dysków z której sie BOOT robi +BootShift + .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety +FolderTurbo + .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT +NewColors + .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F + ORA #$30 + CMP #$3A + BCC labelka + CLC + ADC #$07 +labelka + RTS +Edriver + .BY "E:",$9b +EditorOpen + ; otwarcie ekranu !!! + LDX #$00 ; kanal nr 0 + JSR CloseX ; najpierw Zamkniecie Ekranu + BMI ErrorDisplay + LDX #$00 ; kanal nr 0 + LDA #$03 + STA ICCMD,X + LDA #$0C + STA ICAX1,X + STA ICBUFL,X + LDA #$00 + STA ICAX2,X + STA ICBUFL+1,X + LDA #Edriver + STA ICBUFA+1,X + JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 + BMI ErrorDisplay + RTS + +mainprog + LDA QMEG ; jesli jest QMEG to wylacza sie tryb US + AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza + STA USmode + BEQ NoUSSpeed + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler + ldy #blokDanychIO_GetUSSpeed + jsr Table2DCB + jsr JSIOINT ; wysylamy "?" + bpl USSpeed + lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage + sta USmode + beq NoUSSpeed +USSpeed + LDY #$2 +USstatprint + LDA ONtext,y + STA USstatus,y + DEY + bpl USstatprint + +NoUSSpeed + JMP ReadMainDir +Error148 + LDY #$94 ; kod bledu do Y + ; wyswietlenie komunikatu o bledzie - kod bledu w Y +ErrorDisplay + TYA + PHA + JSR Close1 + PLA + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex ; 4 starsze bity na HEX + STA ErrorNumHex + PLA + JSR bin2AsciiHex ; 4 mlodsze bity na HEX + STA ErrorNumHex+1 + JSR PrintXY + .BY $00,$00 + .BY $7d ; kod czyszczenia ekranu + .BY "ERROR - $" +ErrorNumHex + .BY "00",$00 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + STA KBCODES ; w A jest $FF + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie przechodzimy na te z ktorej sie ladowalismy + LDA BootDrive + ;LDA #1 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ; i odpalamy program od nowa +ReadMainDir + JSR ReadPERCOM + LDX #>FirstSectorBuff + LDY #= 4.39 (moga byc sektory wieksze niz 256b) + BNE Error148 ; Nieobslugiwany format dyskietki +SpartaDisk + LDX #$00 +; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 + LDA FirstSectorBuff+$1F + BMI Sektor128b + TAX + LDA #$00 + INX ; i wyliczenie starszego bajtu +Sektor128b + STA .adr loader.SecLen ; przed przepisaniem + STX .adr loader.SecLen+1 ; przed przepisaniem + ; pokazanie na ekranie + LDA DensityCodes,X + STA DensityDisplay +; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + LDY FirstSectorBuff+$09 + LDX FirstSectorBuff+$0A +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR +; ustawienie znacznika wlaczenia Turbo dla katalogu + LDA #$01 + STA FolderTurbo + STY DirMapSect + STX DirMapSect+1 + LDA #>DirSectorBuff + STA CurrentFileInfoBuff+1 + STA CurrentDirBuf+1 + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 + LDA #$00 + STA NamesOnScreen +label68 + LDA CurrentFileInfoBuff+1 + CMP CurrentDirBufEnd+1 + BCC NoLastFileInDir + BNE LastFilesPageJump + LDA CurrentFileInfoBuff + CMP CurrentDirBufEnd + BCS LastFilesPageJump +NoLastFileInDir + LDY #$00 + LDA (CurrentFileInfoBuff),Y + BEQ LastFilesPageJump + LDX #$22 + LDA #$20 ; spacja +label50 + STA GameName,X + DEX + BPL label50 + LDY #$10 + LDX #$0A +label51 + LDA (CurrentFileInfoBuff),Y + STA GameName,X + DEY + DEX + BPL label51 + LDA NamesOnScreen + CLC + ADC #$41 ; literka "A" + STA GameKeySymbol + LDA $D8 + BNE label52 + LDY #$00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y + AND #$19 + CMP #$09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 + LDX $D7 + BEQ label54 + CMP #$08 + BNE label54 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y + AND #$20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 +label56 + LDA SubDirText,X + STA GameName+12 + DEX + BPL label56 +label55 + JMP GameNamePrint +LastFilesPageJump + JMP LastFilesPage +label54 + JMP label59 +label52 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + AND #$18 + CMP #$08 + BNE label54 + LDA CurrentDirBufEnd + STA $D4 + LDA CurrentDirBufEnd+1 + STA $D5 +label65 + LDA $D5 + CMP $CF + BCC label60 + BNE label54 + LDA $D4 + CMP $CE + BCS label54 +; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy +label60 + LDY #$00 + LDA ($D4),Y + CMP #'*' + BNE CompareNames + STA NewColors + JSR Asteriks +CompareNames +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT + LDY #$0A ; 8+3 znaki +Checking62 + LDA ($D4),Y + CMP GameName,Y + BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw + DEY + BPL Checking62 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku +ReplacingName + LDA ($D4),Y + STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania + INY + CPY #$2E + BCC ReplacingName + BCS GameNamePrint +CheckNextName + LDA $D4 + CLC + ADC #$2E + STA $D4 + BCC label64 + INC $D5 +label64 + JMP label65 +GameNamePrint + LDA NamesOnScreen + CLC + ADC #$02 + STA YposGameName + JSR PrintXY + .BY $01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " +GameName + .BY " " + .BY $00 + LDA NamesOnScreen + ASL + TAX + LDA CurrentFileInfoBuff + STA FirstSectorsTable,X + LDA CurrentFileInfoBuff+1 + STA FirstSectorsTable+1,X + LDA CurrentFileInfoBuff + CLC + ADC #$17 + STA CurrentFileInfoBuff + BCC label66 + INC CurrentFileInfoBuff+1 +label66 + INC NamesOnScreen + LDA NamesOnScreen + CMP #$13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 +label59 + LDA CurrentFileInfoBuff + CLC + ADC #$17 + STA CurrentFileInfoBuff + BCC label69 + INC CurrentFileInfoBuff+1 +label69 + JMP label68 +MainDirKEY + JMP ReadMainDir +UpDirKEY + LDY #$02 + LDA (CurrentDirBuf),Y + TAX + DEY + ORA (CurrentDirBuf),Y + BEQ KeyboardProc + LDA (CurrentDirBuf),Y + TAY + JMP ReadDIR +EscKEY + ; sprawdzmy czy z Shift + LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! + and #$08 + BNE NoSHIFTEsc + JSR EditorOpen + JMP (DOSVEC) +NoSHIFTEsc + LDX #$00 + STX $D8 + INX + STX $D7 +ToStartOfDirJump + JMP ToStartOfDir +SpaceKEY + LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy + BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku + JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej +; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie +ContArrowsPrint + JSR PrintXY + .BY $01,$15 + .BY $1D ; strzalka w dol + .BY $00 + JSR PrintXY + .BY $0E,$15 + .BY $1D ; strzalka w dol + .BY $00 + JMP KeyboardProc +LastFilesPage + INC LastFilesPageFlag +KeyboardProc + LDA NewColors + BNE ColorsAlreadySet + LDA #$C4 ; ustawienie koloru tła i liter + STA COLPF2S + STA COLBAKS + LDA #$CA + STA COLPF1S +ColorsAlreadySet + JSR GetKey + AND #%01111111 ; eliminujemy invers + BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + CMP #$3E ; ">" + BEQ MainDirKEY + CMP #$3C ; "<" + BEQ UpDirKEY + CMP #$7E ; BackSpace + BEQ UpDirKEY + CMP #$1B ; Esc + BEQ EscKEY + CMP #$20 ; Spacja + BEQ SpaceKEY + ; ---------------- + ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + CMP #$10 + BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + JSR SeTDriveLetter + JMP mainprog +noCtrlLetter + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR + JMP mainprog + ; ----------------- +NoNumber + CMP #'a' ; czy nie ma capsa + BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany + SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) +BigLetters + SEC + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie + BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz + ASL + TAX + LDA FirstSectorsTable,X + STA $D4 + LDA FirstSectorsTable+1,X + STA $D5 + LDY #$00 + LDA ($D4),Y + AND #$20 ; sprawdzamy czy to klatalog czy plik + BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader + ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran + LDY #$02 + LDA ($D4),Y + TAX + DEY + LDA ($D4),Y + TAY + JMP ReadDIR +SubDirText + .BY "" +GOtoLoader + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiskNotChanged1 + JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego +DiskNotChanged1 + LDA FolderTurbo + BEQ SetTurboOFF + LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT +SetTurboOFF + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO+$A ; od razu do bloku IOCB + INY + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO+$B ; od razu do bloku IOCB + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.tempToFileEndL + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY + LDA ($D4),Y + EOR #$FF + STA .adr loader.ToFileEndH+1 ; przed przepisaniem +; wszystko zapamietane mozna robic mape sektorow.... +; skompresowana mapa bedzie tworzona w buforze sektora katalogu +; czyli DirSectorBuff +; sektor mapy przed kompresja leci do DirMapSectorBuff +; UWAGA +; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi +; zawierac rozkaz przeczytania pierwszego sektora!!!!! +CompressedMap = DirSectorBuff +; czytamy pierwszy sektor mapy + LDY #DirMapSectorBuff + Jsr ReadSector +; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! + LDA #00 + STA CompressedMapCounter + STA CompressedMapCounter+1 + JSR AddToCompressedMAP + LDA DirMapSectorBuff+4 + STA PrevFileSector + JSR AddToCompressedMAP + LDA DirMapSectorBuff+5 + sta PrevFileSector+1 + JSR AddToCompressedMAP + ; Inicjujemy liczniki + .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 + .zpvar PrevFileSector, MapPositionMem .word + .zpvar SectorOffset .word + .zpvar SectorsCounter .byte + LDA #$00 + STA MapCounter+1 + STA SectorsCounter + lda #$06 + STA MapCounter +GenerateCompressedMap + CLC + LDA #DirMapSectorBuff + ADC MapCounter+1 + STA MAPPositionMem+1 + LDX #0 + LDY #1 + LDA (MAPPositionMem,x) + ORA (MAPPositionMem),y + BEQ Sector00 + SEC + LDA (MAPPositionMem,x) + SBC PrevFileSector + STA SectorOffset + LDA (MAPPositionMem),y + SBC PrevFileSector+1 + STA SectorOffset+1 + ; mamy odstep miedzy poprzednim a nastepnym sektorem + BNE OffsetToBig + LDA SectorOffset + BMI OffsetToBig ; max przeskok 127 sektorow + CMP #$01 + BNE JumpForward + ; kolejny sektor + ; zwiekszamy wiec licznik + inc SectorsCounter + LDA SectorsCounter + CMP #%01111111 + BNE GetNextMapWord + ; tu licznik dotarl do konca zerujemy go + ; dodajemy wpis do skompresowanej mapy i gotowe + JSR AddToCompressedMAP + LDA #0 + STA SectorsCounter + BEQ GetNextMapWord +; ominiecie wyznaczonej ilości sektorów (w A) +JumpForward + JSR FlushBuffer + LDA SectorOffset + ORA #%10000000 + JSR AddToCompressedMAP + JMP GetNextMapWord +; wyznaczenie skoku do nowego sektora pliku +OffsetToBig + JSR FlushBuffer + LDA #0 + JSR AddToCompressedMAP + LDY #00 + LDA (MAPPositionMem),y + JSR AddToCompressedMAP + LDY #01 + LDA (MAPPositionMem),y + JSR AddToCompressedMAP +GetNextMapWord + ; zapamietanie numeru obecnego sektora do porownania potem + LDY #00 + LDA (MAPPositionMem),y + STA PrevFileSector + INY + LDA (MAPPositionMem),y + STA PrevFileSector+1 +Sector00 + ADW MapCounter #2 +ops01 + ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala + LDA MapCounter+1 + CMP .adr loader.SecLen+1 + bne noteqal01 + LDA MapCounter + CMP .adr loader.SecLen +noteqal01 + JNE GenerateCompressedMap +; czytamy nastepny sektor mapy + ; sprawdzmy czy nie koniec + LDA DirMapSectorBuff + ORA DirMapSectorBuff+1 + BEQ EndMakingMap + LDA DirMapSectorBuff + sta blokDanychIO+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO+$B + LDY #DirMapSectorBuff + Jsr ReadSector + ; zerujemy licznik mapy + LDA #$00 + STA MapCounter+1 + lda #$04 + STA MapCounter + JMP GenerateCompressedMap +; dpisanie bajtu z A do mapy sektorow skompresowanej +AddToCompressedMAP + PHA + ; wyliczamy adresa + CLC + LDA CompressedMapCounter + ADC #CompressedMap + STA xxxxbla+1 + PLA +xxxxbla=*+1 + STA $FFFF + INC CompressedMapCounter + BNE noinc013 + INC CompressedMapCounter+1 +noinc013 + RTS +FlushBuffer + LDA SectorsCounter + BEQ NoFlush + JSR AddToCompressedMAP + LDA #0 + STA SectorsCounter +NoFlush + RTS +EndMakingMap + JSR FlushBuffer +LoaderGo + LDY #$00 + STY COLDST + LDA #$01 + STA BOOT + LDX $700 + CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta + BNE NoRunFromDOS + STA $03F8 ; to wylaczalo BASIC !!! +; STA $D5EC ; to wylacza SpartaDOS X +; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) +NoRunFromDOS + LDA #AfterWormStart + STA DOSINI+1 +; LDA #>JRESETCD +; STA DOSVEC+1 +; LDA #TempMEMLO + ADC .adr loader.SecLen+1 + STA MEMLO+1 + STA CompressedMapPos+1 +; STA pointerMov2b +; STA APPMHI+1 + ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora + ; jest to jednoczesnie adres umieszczenia skompresowanej + ; mapy sektorow pliku dla loadera ale MINUS 1 + DEW CompressedMapPos + ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej + ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) + CLC + LDA MEMLO +; ADC CompressedMapCounter +; STA MEMLO + STA TurboRelocADDR + LDA MEMLO+1 +; ADC CompressedMapCounter+1 +; STA MEMLO+1 + STA TurboRelocADDR+1 + LDA #JTESTROM + STA DOSINI+1 +; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) +; INC $033D ; bajty kontrolne zimnego startu +; INC $033E ; zmiana ich wartosci wymusza +; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) + LDX #$00 + STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) +; STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X + STA $0700,X + LDA movedproc+$0100,X + STA $0800,X + INX + BNE moveloop1 +; przepisanie skompresowanej mapy sektorow pliku za bufor sektora +/* moveloop2 + DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy +pointerMov2a=*+2 + LDA CompressedMap,x ; kod samomodyfikujacy sie +pointerMov2b=*+2 + STA $FFFF,x ; kod samomodyfikujacy sie + LDA CompressedMapCounter + AND CompressedMapCounter+1 + CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! + BEQ SectorMapReady + INX + BNE moveloop2 + inc pointerMov2a + inc pointerMov2b + bne moveloop2 +SectorMapReady + */ + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + + LDX #$00 + TXA +; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) +ClearLoop1 + STA $0100,X ; STOS !!! + STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) + STA $0500,X + STA $0600,X + CPX #$80 ;tylko ponad $80 + BCC NoZpage + STA $00,X ; czyli polowa strony zerowej +NoZpage + INX + BNE ClearLoop1 + LDX #$FF + TXS ; "wyzerowanie wskaznika STOSU + + ; a tutaj otwieramy kanal 1 CIO do odczytu + + LDX #1*16 ; kanal 1 + LDA #COPN ; rozkaz OPEN + STA ICCOM,X ; COMMAND + LDA #$04 ; READ + STA ICAUX1,X + LDA #$00 + STA ICAUX2,X + LDA # FileToOpen + STA ICBADR+1,X + JSR CIO + + JMP loader.LoadStart ; po przepisaniu +FileToOpen + .BYTE "C:",0 +; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba +; na koniec odpowiednie zmodyfikowanie MEMLO +ADDspeedProc + LDA USmode + beq NoHappyLoader +; wyznaczamy offset procedury + SEC + LDA #HappyUSMovedProc + SBC MEMLO+1 + STA HappyOffset+1 + + LDY #0 + LDX #[$A-1] ;xjsrA - the last + ; relokujemy skoki pod offset z MEMLO +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC HappyOffset + STA (SecBuffer),y + INY + LDA (SecBuffer),y + SBC HappyOffset+1 + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + LDX #[EndHappyUSProc-HappyUSMovedProc-1] +label72x + LDA HappyUSMovedProc,X +TurboRelocADDR=*+1 + STA $0A00,X + DEX + CPX #$FF + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA + CLC + ADC MEMLO + STA MEMLO + TXA + ADC MEMLO+1 + STA MEMLO+1 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS + + + +; UWAGA !!!!!!!!!!!!!! +; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! +; powiekszenie jej O BAJT spowoduje ze przekroczy strone +; i nie przepisze sie prawidlowo na swoje miejsce !!!!! +HappyUSMovedProc ; + + LDA DBUFA + STA SecBuffer + LDA DBUFA+1 + STA SecBuffer+1 + + LDA DBYT + STA SecLenUS + + SEI + TSX + STX StackCopy + LDA #$0D + STA CRETRYZ + ;command retry on zero page +CommandLoop +HappySpeed = *+1 + LDA #$28 ;here goes speed from "?" + STA AUDF3 + LDA #$34 + STA PBCTL ;ustawienie linii command + LDX #$80 +DelayLoopCmd + DEX + BNE DelayLoopCmd + STX AUDF4 ; zero + STX TransmitError +; pokey init + LDA #$23 +xjsr1 JSR SecTransReg + ; + + CLC + LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + ADC DUNIT ; dodajemy numer stacji + ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + STA CheckSum + STA SEROUT + LDA DCOMND +xjsr2 JSR PutSIOByte + LDA DAUX1 +xjsr3 JSR PutSIOByte + LDA DAUX2 +xjsr4 JSR PutSIOByte + LDA CheckSum +xjsr5 JSR PutSIOByte + +waitforEndOftransmission + LDA IRQST + AND #$08 + BNE waitforEndOftransmission + + LDA #$13 +xjsr6 JSR SecTransReg + + LDA #$3c + STA PBCTL ;command line off +; two ACK's + LDY #2 +DoubleACK +xjsr7 JSR GetSIOByte + CMP #$44 + BCS ErrorHere + DEY + BNE DoubleACK + + ;ldy #0 + STY CheckSum +ReadSectorLoop +xjsr8 JSR GetSIOByte + STA (SecBuffer),y +xjsr9 JSR AddCheckSum + INY + CPY SecLenUS + BNE ReadSectorLoop + +xjsrA JSR GetSIOByte + CMP CheckSum + BEQ EndOfTransmission +;error!!! +ErrorHere + LDY #$90 + STY TransmitError + LDX StackCopy + TXS + DEC CRETRYZ + BNE CommandLoop + +EndOfTransmission + LDA #0 + STA AUDC4 + LDA IRQENS + STA IRQEN + CLI + LDY TransmitError + RTS + +SecTransReg + STA SKCTL + STA SKSTRES + LDA #$38 + STA IRQEN + LDA #$28 + STA AUDCTL + LDA #$A8 + STA AUDC4 + RTS + +PutSIOByte + TAX +waitforSerial + LDA IRQST + AND #$10 + BNE waitforSerial + + STA IRQEN + LDA #$10 + STA IRQEN + + TXA + STA SEROUT + +AddCheckSum + CLC + ADC CheckSum + ADC #0 + STA CheckSum + RTS + +GetSIOByte + LDX #10 ;acktimeout +ExternalLoop + LDA #0 + STA looperka +InternalLoop + LDA IRQST + AND #$20 + BEQ ACKReceive + DEC looperka + BNE InternalLoop + DEX + BNE ExternalLoop + BEQ ErrorHere +ACKReceive + ; zero we have now + STA IRQST + LDA #$20 + STA IRQST + LDA SKSTAT + STA SKSTRES + AND #$20 + BEQ ErrorHere + ; + LDA SERIN + RTS +EndHappyUSProc + + +; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO_GetUSSpeed + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 +label39 + STA $DA + LDA CurrentFileInfoBuff + STA $DB + LDA CurrentFileInfoBuff+1 + STA $DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 + PLA + PLA + JMP ReadMainDir +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect + STA blokDanychIO+10 + LDA DirMapSect+1 + STA blokDanychIO+11 + ORA blokDanychIO+10 + BEQ DirMapEnd + LDX #>DirMapSectorBuff + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y + STA blokDanychIO+10 + INY + LDA (TempZP),Y + STA blokDanychIO+11 + ORA blokDanychIO+10 + BEQ label75 + ; i zwiekszenie wskaznika mapy o 2 + INY + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + LDA MEMTOP + SEC + SBC CurrentFileInfoBuff + LDA MEMTOP+1 + SBC CurrentFileInfoBuff+1 + BEQ label75 + LDY CurrentFileInfoBuff + LDX CurrentFileInfoBuff+1 + JSR ReadSector + LDA $D4 + ORA $D5 + BNE label79 + LDY #$03 + LDA (CurrentFileInfoBuff),Y + STA $D4 + INY + LDA (CurrentFileInfoBuff),Y + STA $D5 + INY + LDA (CurrentFileInfoBuff),Y + BEQ label79 + LDA #$FF + STA $D4 + STA $D5 +label79 + LDA CurrentFileInfoBuff + CLC + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff + LDA CurrentFileInfoBuff+1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 + LDA $D4 + SEC + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 + LDA $D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 + BCS label80 + LDA CurrentFileInfoBuff + CLC + ADC $D4 + STA CurrentFileInfoBuff + LDA CurrentFileInfoBuff+1 + ADC $D5 + STA CurrentFileInfoBuff+1 +label75 + LDA $DC + CMP CurrentFileInfoBuff+1 + BCC label81 + BNE label82 + LDA $DB + CMP CurrentFileInfoBuff + BCC label81 + BNE label82 + RTS +label81 + LDA $DB + CLC + ADC $DA + STA $DB + BCC label75 + INC $DC + JMP label75 +label82 + LDA $DB + SEC + SBC $DA + STA CurrentFileInfoBuff + LDA $DC + SBC #$00 + STA CurrentFileInfoBuff+1 + RTS +; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora +ReadPERCOM + LDA #$04 + STA DiskRetryCount +ReadPERCOMretry + LDY #blokDanychIO_PERCOM + JSR Table2DCB + JSR GoSIO + BMI PercomError + ; blok odczytany - ustawmy dlugosc 1 sektora + LDA PERCOMdata+6 + CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + RTS +PercomError + DEC DiskRetryCount + BNE ReadPERCOMretry + ; blok nieodczytany - dlugosc 1 sektora na $80 +Set1Sect128 + LDA #$00 + STA PERCOMdata+6 + LDA #$80 + STA PERCOMdata+7 + RTS +blokDanychIO_PERCOM + .BY $31,$01,$4E,$40 + .WO PERCOMdata + .BY $0A,$00,12,$00,$01,$00 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 + STA blokDanychIO+10 + LDA #$00 + STA blokDanychIO+11 + LDA PERCOMdata+6 + STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + LDA PERCOMdata+7 + JMP ReadSector1 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +ReadSector1 + STA blokDanychIO+8 + STX blokDanychIO+5 + STY blokDanychIO+4 + LDA #$04 + STA DiskRetryCount +DiskReadRetry + LDY #blokDanychIO + JSR Table2DCB + JSR GoSIO + BMI label85 + RTS +label85 + DEC DiskRetryCount + BNE DiskReadRetry + PLA + PLA + JMP ErrorDisplay +blokDanychIO + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 +DiskRetryCount + .BY $00 +PrintXY + PLA + STA $C8 + PLA + STA $C9 + LDA #$00 + STA $DF + JSR label87 + PHA + JSR label87 + STA $DE + ASL + ASL + CLC + ADC $DE + ASL + ASL + ROL $DF + ASL + ROL $DF + CLC + ADC SAVMSC + STA $DE + LDA $DF + ADC SAVMSC+1 + STA $DF + PLA + TAY +label92 + JSR label87 + CMP #$00 + BEQ label88 + CMP #$7D + BEQ label89 + LDX #$00 + STX $E0 + CMP #$80 + ROR $E0 + AND #$7F + CMP #$20 + BCS label90 + ORA #$40 + BNE label91 +label90 + CMP #$60 + BCS label91 + SEC + SBC #$20 +label91 + ORA $E0 + STA ($DE),Y + INY + JMP label92 +label89 + TYA + PHA + LDA SAVMSC + STA $E0 + LDA #$03 + TAX + CLC + ADC SAVMSC+1 + STA $E1 + LDY #$BF + LDA #$00 +label93 + STA ($E0),Y + DEY + CPY #$FF + BNE label93 + DEC $E1 + DEX + BPL label93 + PLA + TAY + JMP label92 +label88 + LDA $C9 + PHA + LDA $C8 + PHA + RTS +label87 + INC $C8 + BNE label94 + INC $C9 +label94 + LDX #$00 + LDA ($C8,X) + RTS +GoErrorDisp + JMP ErrorDisplay +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 + STX IOtableAddr+2 + LDX #$0B +IOtableAddr + LDA $FFFF,X + STA DDEVIC,X + DEX + BPL IOtableAddr + RTS +Close1 + LDX #$10 +CloseX + LDA #$0C + STA ICCMD,X + JMP JCIOMAIN +GetKey + LDX #$10 + LDA #$03 + STA ICCMD,X + LDA #$04 + STA ICAX1,X + LDA #$00 + STA ICAX2,X + STA ICBUFL+1,X + LDA #$FF + STA ICBUFL,X + LDA #Kdriver + STA ICBUFA+1,X + JSR JCIOMAIN + BMI GKeyError + LDX #$10 + LDA #$00 + STA ICBUFL,X + STA ICBUFL+1,X + LDA #$07 + STA ICCMD,X + JSR JCIOMAIN + BMI GKeyError + PHA + JSR Close1 + BMI GKeyError + PLA + RTS +GKeyError + JMP GoErrorDisp +Kdriver + .BY "K:",$9B +DiscChangeCheck + LDY #DirMapSectorBuff + JSR ReadFirstSect + LDX #$7F +label98 + LDA FirstSectorBuff,X + CMP DirMapSectorBuff,X + BNE ChangedD + DEX + BPL label98 + LDA #$00 +ChangedD + RTS + ; obsluga gwiazdki + ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * + ; w Y jest ) - X moze lepiej nie ruszac :) +Asteriks + LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + JSR GetHexNumber + STA COLPF1S ; literki + INY + JSR GetHexNumber + STA COLPF2S ; tlo + INY + JSR GetHexNumber + STA COLBAKS ; ramka + INY + JSR GetHexNumber + STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + RTS + ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX + ; i zamienia na bajt w A +GetHexNumber + JSR GetHEX4bits + ASL + ASL + ASL + ASL + STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + INY + JSR GetHEX4bits + ORA TempZP + RTS +GetHEX4bits + LDA ($D4),Y + SEC + SBC #'0' + CMP #$0A ; sprawdzmy czy cyfra + BCC IsNumber + SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow +IsNumber + RTS + ; Ustawia numer satcji wg A +SeTDriveNR + CMP #$09 + BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + JSR SeTblokDanychDrive + CLC + ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + STA DriveDisp1 + LDA #'D'+$80 ; literka D przed numerem napedu + STA DriveDisp1-1 + RTS +SeTDriveLetter + JSR SeTblokDanychDrive + CLC + ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + STA DriveDisp1 + LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + STA DriveDisp1-1 + RTS +SeTblokDanychDrive + STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + STA blokDanychIO+1 + STA blokDanychIO_GetUSSpeed+1 + STA blokDanychIO_PERCOM+1 + RTS +; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku +MEMLOprint + LDA MEMLO + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex + STA MEMLOvalue+2 + PLA + JSR bin2AsciiHex + STA MEMLOvalue+3 + LDA MEMLO+1 + PHA + LSR + LSR + LSR + LSR + JSR bin2AsciiHex + STA MEMLOvalue + PLA + JSR bin2AsciiHex + STA MEMLOvalue+1 + JSR PrintXY + .BY 28,23 + .BY "MEMLO: $" +MEMLOvalue + .BY "0000" + .BY $00 + RTS + +; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo + +xjsrTableL + .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + .BY <[xjsr4+1],<[xjsr5+1] + .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + .BY <[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + .BY >[xjsr4+1],>[xjsr5+1] + .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + .BY >[xjsr9+1],>[xjsrA+1] +; miejsce na wyliczony offset o jaki przesuwamy procedure +HappyOffset + .WO $0000 +; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) +DensityCodes + .by +$80,"sdq" + ;.by "SDQ" + ;.by $0e,$15,$a0 +ONtext + .BY +$80,"ON " +OFFtext + .BY +$80,"OFF" +; miejsce na przechowanie stanu urzadzen PBI (przez reset) +PDVMASKtemp + .BY $00 +; miejsce na blok PERCOM +PERCOMdata +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable=*+12 ; omijamy 12b na percom + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow +ProgramEnd=FirstSectorBuff +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu +FirstRun +; odnotowujemy stan Shift z Bootowania + LDA SKSTAT + and #$08 + BNE NoSHIFTboot + STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 +NoSHIFTboot +; Sprawdzamy czy jest basic i ustawiamy status na ekranie + LDA PORTB + AND #$02 + BNE BrakBasica + ; jest Basic + LDY #$2 +BASstatprint + LDA ONtext,y + STA BASstatus,y + DEY + bpl BASstatprint +BrakBasica +; Sprawdzamy istnienie QMEGa + ldy #$06 ; bo 6 znaków w ROMie testujemy +testQMEGloop + LDA $C001,y + CMP QMEGstring,y + bne brakQMEGa + dey + bpl testQMEGloop + ; jest QMEG + LDA #0 + STA QMEG + LDY #$2 +Qstatprint + LDA ONtext,y + STA QMEGstatus,y + DEY + bpl Qstatprint +brakQMEGa + ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi + LDA DDEVIC + clc + ADC DUNIT + sec + SBC #$01 + AND #$0F ; zapamietanie numeru urzadzenia + STA BootDrive + JSR SeTDriveNR + JSR EditorOpen + JMP mainprog +QMEGstring + .BY "QMEG-OS",0 + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" + ;.OPT List + + + org $02e0 + .WO LoaderGo + ; .WO START + ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) +; OPT h- +; org $0000 +; .WO $0000 + \ No newline at end of file diff --git a/loaderFN.lab b/loaderFN.lab new file mode 100644 index 0000000..9aa678c --- /dev/null +++ b/loaderFN.lab @@ -0,0 +1,402 @@ +mads 2.1.6 build 65 (4 Jun 23) +Label table: +00 0247 PDVMASK +00 0340 IOCB +00 0340 ICHID +00 0341 ICDNO +00 0342 ICCOM +00 0343 ICSTA +00 0344 ICBADR +00 0346 ICPUT +00 0348 ICBLEN +00 034A ICAUX1 +00 034B ICAUX2 +00 034C ICAUX3 +00 034D ICAUX4 +00 034E ICAUX5 +00 034F ICAUX6 +00 0010 IOCBLEN +00 0003 COPN +00 0007 CGBINR +00 0005 CGTXTR +00 000B CPBINR +00 0009 CPTXTR +00 000C CCLOSE +00 000D CSTAT +00 0020 CREN +00 0021 CERA +00 0023 CPRO +00 0024 CUNP +00 0025 CPOINT +00 0026 CNOTE +00 0004 OPIN +00 0008 OPOUT +00 000C OPUPD +00 0009 OPAPND +00 0006 OPDIR +00 0080 EXCYES +00 0040 EXCSCR +00 0010 EXCNEW +00 0020 EXCSUP +00 000A CPALOC +00 0008 WARMST +00 02E7 MEMLO +00 02E5 MEMTOP +00 000E APPMHI +00 02E2 INITADR +00 02E0 GOADR +00 BFFA CARTLOC +00 E456 CIO +00 009B EOL +00 0003 CPGNFN +00 0007 CPDFDV +00 000A CPBUFP +00 000B CPEXFL +00 000C CPEXFN +00 001C CPEXNP +00 0021 CPFNAM +00 003D RUNLOC +00 003F CPCMDB +00 00F3 CPCMDGO +00 000A ACKTIMEOUT +00 0002 READTIMEOUT +00 0318 STACKP +00 0042 CRITIC +00 02BD DRETRY +00 030F CASFLG +00 029C CRETRY +00 0002 CASINI +00 0009 BOOT +00 000A DOSVEC +00 000C DOSINI +00 0010 IRQENS +00 0024 INBLOCKADDR +00 0026 TOBLOCKEND +00 0028 TOFILEENDL +00 003D COMPRESSEDMAPPOS +00 0030 CHECKSUM +00 0031 SECLENUS +00 0032 SECBUFFER +00 0034 CRETRYZ +00 0035 TRANSMITERROR +00 0036 LOOPERKA +00 0037 STACKCOPY +00 0058 SAVMSC +00 00CA CURRENTDIRBUF +00 00CC CURRENTDIRBUFEND +00 00D0 CURRENTFILEINFOBUFF +00 00D2 DIRMAPSECT +00 00D6 LASTFILESPAGEFLAG +00 00D9 NAMESONSCREEN +00 00E2 INMAPPOINTER +00 00E4 TEMPZP +00 020A VSERIN +00 02C5 COLPF1S +00 02C6 COLPF2S +00 02C8 COLBAKS +00 0244 COLDST +00 02FC KBCODES +00 0300 DDEVIC +00 0301 DUNIT +00 0302 DCOMND +00 0304 DBUFA +00 0308 DBYT +00 030A DAUX1 +00 030B DAUX2 +00 0342 ICCMD +00 0344 ICBUFA +00 0348 ICBUFL +00 034A ICAX1 +00 034B ICAX2 +00 03FA GINTLK +00 D204 AUDF3 +00 D206 AUDF4 +00 D207 AUDC4 +00 D208 AUDCTL +00 D20A SKSTRES +00 D20D SEROUT +00 D20D SERIN +00 D20E IRQEN +00 D20E IRQST +00 D20F SKSTAT +00 D20F SKCTL +00 D303 PBCTL +00 D301 PORTB +00 D40B VCOUNT +00 E456 JCIOMAIN +00 E459 JSIOINT +00 E471 JTESTROM +00 E474 JRESETWM +00 E477 JRESETCD +00 084B FILESECBUFF +00 084B TEMPMEMLO +00 1FFD START +00 2000 MOVEDPROC +00 0700 LOADER +00 0700 LOADER.TOFILEENDH +00 0702 LOADER.FILEINIT +00 071B LOADER.FILENEXTBLOCK +00 0727 LOADER.FILENOFFFFHEAD +00 073C LOADER.WHATISIT +00 074B LOADER.FILENOFIRSTBLOCK +00 0757 LOADER.BLOCKREADLOOP +00 0768 LOADER.NONEXTSECTOR1 +00 076A LOADER.FILESECBUFFHADDR1 +00 0771 LOADER.INBLOCKREADLOOP +00 0778 LOADER.LABEL15 +00 0782 LOADER.GOCHECKEOF +00 0787 LOADER.GOGETNEXTFILESECT +00 078C LOADER.FILEGETBLOCKSTART +00 0797 LOADER.GOINITADDR +00 079A LOADER.GETDATASECTOR +00 079A LOADER.READERRORLOOP +00 079C LOADER.SETDCB +00 07A5 LOADER.SIOJMP +00 07AB LOADER.BLOKDANYCHIO_LOADER +00 07B3 LOADER.SECLEN +00 07B5 LOADER.SECTORNUMBER +00 07B7 LOADER.CHECKEOF +00 07C1 LOADER.ENDOFFILE +00 07CA LOADER.FILEGETBYTE +00 07CE LOADER.NOTEOF +00 07DB LOADER.BYTETOACCU +00 07DD LOADER.FILESECBUFFHADDR2 +00 07E1 LOADER.INCREMENTATIONXH +00 07EA LOADER.GOTOSEC +00 07EB LOADER.JRTS +00 07EC LOADER.GETNEXTFILESECT +00 07EE LOADER.READNEXTINSEQUENCE +00 07EF LOADER.SECTORSEQUENCECOUNT +00 07FD LOADER.NOINCDAUX2 +00 07FF LOADER.NEXTMAPPOSITION +00 080F LOADER.HOWMANYTOSKIP +00 081D LOADER.NOINCDAUX2_V2 +00 081F LOADER.SETNEWSTARTSECTOR +00 082F LOADER.READYTOREAD +00 0843 LOADER.INCCOMPRESSEDMAPPOS +00 0849 LOADER.SKIPINCCOMPRESSEDMAPPOS +00 084A LOADER.INSECTORCOUNTH +00 084B LOADER.ZZZZZZ +00 084B LOADER.FIRSTMAPSECTORNR +00 084D LOADER.LOADSTART +00 0856 LOADER.OUTMEMCLEARLOOP +00 0858 LOADER.INMEMCLEARLOOP +00 0874 LOADER.LASTMEMPAGECLEAR +00 0895 LOADER.TEMPTOFILEENDL +00 2196 JAKIETURBO +00 2196 USMODE +00 2197 QMEG +00 2198 BOOTDRIVE +00 2199 BOOTSHIFT +00 219A FOLDERTURBO +00 219B NEWCOLORS +00 219C BIN2ASCIIHEX +00 21A7 LABELKA +00 21A8 EDRIVER +00 21AB EDITOROPEN +00 21D9 MAINPROG +00 21F7 USSPEED +00 21F9 USSTATPRINT +00 2202 NOUSSPEED +00 2205 ERROR148 +00 2207 ERRORDISPLAY +00 222E ERRORNUMHEX +00 2236 WAITKLOOP +00 2248 READMAINDIR +00 2261 SPARTADISK +00 226C SEKTOR128B +00 227E READDIR +00 22B7 LABEL46 +00 22C5 LABEL40 +00 22D3 LABEL43 +00 22E0 PROGNAME +00 22EB LABEL42 +00 22F6 LABEL45 +00 22F9 DATFILEFOUND +00 2319 LABEL47 +00 2330 TOSTARTOFDIR +00 2341 STATUSBARPRINT +00 2347 DENSITYDISPLAY +00 2349 DRIVEDISP1 +00 235C QMEGSTATUS +00 2364 BASSTATUS +00 236B USSTATUS +00 23E7 LABEL68 +00 23F5 NOLASTFILEINDIR +00 23FF LABEL50 +00 2409 LABEL51 +00 2430 LABEL53 +00 2438 LABEL56 +00 2441 LABEL55 +00 2444 LASTFILESPAGEJUMP +00 2447 LABEL54 +00 244A LABEL52 +00 245C LABEL65 +00 246A LABEL60 +00 2478 COMPARENAMES +00 247A CHECKING62 +00 2486 REPLACINGNAME +00 2492 CHECKNEXTNAME +00 249D LABEL64 +00 24A0 GAMENAMEPRINT +00 24AC YPOSGAMENAME +00 24AD GAMEKEYSYMBOL +00 24B0 GAMENAME +00 24ED LABEL66 +00 24F8 LABEL59 +00 2503 LABEL69 +00 2506 MAINDIRKEY +00 2509 UPDIRKEY +00 2519 ESCKEY +00 2526 NOSHIFTESC +00 252D TOSTARTOFDIRJUMP +00 2530 SPACEKEY +00 2537 CONTARROWSPRINT +00 2548 LASTFILESPAGE +00 254A KEYBOARDPROC +00 255C COLORSALREADYSET +00 2581 NOCTRLLETTER +00 2592 NONUMBER +00 2598 BIGLETTERS +00 25BF SUBDIRTEXT +00 25C8 GOTOLOADER +00 25D0 DISKNOTCHANGED1 +00 25DC SETTURBOOFF +00 25DF NOSHIFT +00 2F80 COMPRESSEDMAP +00 2634 GENERATECOMPRESSEDMAP +00 2673 JUMPFORWARD +00 2680 OFFSETTOBIG +00 2696 GETNEXTMAPWORD +00 26A1 SECTOR00 +00 26AC OPS01 +00 26B8 NOTEQAL01 +00 26E3 ADDTOCOMPRESSEDMAP +00 26F5 XXXXBLA +00 26FD NOINC013 +00 26FE FLUSHBUFFER +00 2709 NOFLUSH +00 270A ENDMAKINGMAP +00 270D LOADERGO +00 2720 NORUNFROMDOS +00 2731 AFTERWORMSTART +00 276D MOVELOOP1 +00 2785 CLEARLOOP1 +00 2797 NOZPAGE +00 27BE FILETOOPEN +00 27C1 ADDSPEEDPROC +00 27DB HAPPYRELOCATE +00 27FB LABEL72X +00 27FF TURBORELOCADDR +00 280A LABEL73 +00 2825 NOHAPPYLOADER +00 2826 HAPPYUSMOVEDPROC +00 283D COMMANDLOOP +00 283E HAPPYSPEED +00 2849 DELAYLOOPCMD +00 2853 XJSR1 +00 2867 XJSR2 +00 286D XJSR3 +00 2873 XJSR4 +00 2878 XJSR5 +00 287B WAITFORENDOFTRANSMISSION +00 2884 XJSR6 +00 288E DOUBLEACK +00 288E XJSR7 +00 289A READSECTORLOOP +00 289A XJSR8 +00 289F XJSR9 +00 28A7 XJSRA +00 28AE ERRORHERE +00 28B9 ENDOFTRANSMISSION +00 28C7 SECTRANSREG +00 28DD PUTSIOBYTE +00 28DE WAITFORSERIAL +00 28F1 ADDCHECKSUM +00 28F9 GETSIOBYTE +00 28FB EXTERNALLOOP +00 28FF INTERNALLOOP +00 290F ACKRECEIVE +00 2925 ENDHAPPYUSPROC +00 2925 BLOKDANYCHIO_GETUSSPEED +00 2931 DIRMAPEND +00 2934 LABEL39 +00 2948 DISCNOTCHANGED2 +00 2970 LABEL80 +00 297E NONEXTMAPSECTOR +00 29A0 NOINCH +00 29D0 LABEL79 +00 29FD LABEL75 +00 2A0E LABEL81 +00 2A1C LABEL82 +00 2A2A READPERCOM +00 2A2F READPERCOMRETRY +00 2A43 PERCOMERROR +00 2A48 SET1SECT128 +00 2A53 BLOKDANYCHIO_PERCOM +00 2A5F READFIRSTSECT +00 2A75 READSECTOR +00 2A7E READSECTOR1 +00 2A8C DISKREADRETRY +00 2A99 LABEL85 +00 2AA3 BLOKDANYCHIO +00 2AAF DISKRETRYCOUNT +00 2AB0 PRINTXY +00 2ADC LABEL92 +00 2AF9 LABEL90 +00 2B00 LABEL91 +00 2B08 LABEL89 +00 2B1A LABEL93 +00 2B2B LABEL88 +00 2B32 LABEL87 +00 2B38 LABEL94 +00 2B3D GOERRORDISP +00 2B40 GOSIO +00 2B48 STANDARDSPEED +00 2B4B TABLE2DCB +00 2B53 IOTABLEADDR +00 2B5D CLOSE1 +00 2B5F CLOSEX +00 2B67 GETKEY +00 2BAB GKEYERROR +00 2BAE KDRIVER +00 2BB1 DISCCHANGECHECK +00 2BBA LABEL98 +00 2BC7 CHANGEDD +00 2BC8 ASTERIKS +00 2BE6 GETHEXNUMBER +00 2BF6 GETHEX4BITS +00 2C01 ISNUMBER +00 2C02 SETDRIVENR +00 2C15 SETDRIVELETTER +00 2C24 SETBLOKDANYCHDRIVE +00 2C31 MEMLOPRINT +00 2C68 MEMLOVALUE +00 2C6E XJSRTABLEL +00 2C78 XJSRTABLEH +00 2C82 HAPPYOFFSET +00 2C84 DENSITYCODES +00 2C87 ONTEXT +00 2C8A OFFTEXT +00 2C8D PDVMASKTEMP +00 2C8E PERCOMDATA +00 2C9A FIRSTSECTORSTABLE +00 2D00 FIRSTSECTORBUFF +00 2D00 PROGRAMEND +00 2D80 DIRMAPSECTORBUFF +00 2F80 DIRSECTORBUFF +00 2C8E FIRSTRUN +00 2C98 NOSHIFTBOOT +00 2CA1 BASSTATPRINT +00 2CAA BRAKBASICA +00 2CAC TESTQMEGLOOP +00 2CBE QSTATPRINT +00 2CC7 BRAKQMEGA +00 2CDF QMEGSTRING +00 0080 MAPCOUNTER +00 0082 COMPRESSEDMAPCOUNTER +00 0084 MAPCOUNTERMEM +00 0086 PREVFILESECTOR +00 0088 MAPPOSITIONMEM +00 008A SECTOROFFSET +00 008C SECTORSCOUNTER diff --git a/loaderFN.lst b/loaderFN.lst new file mode 100644 index 0000000..796342f --- /dev/null +++ b/loaderFN.lst @@ -0,0 +1,2248 @@ +mads 2.1.6 build 65 (4 Jun 23) +Source: loaderFN.asm + 1 ;MICRO SPARTA DOS 4.7 + 2 + 3 ; w wersji 4.7 dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami + 4 ; "prawo"/"lewo" albo "gora"/"dol" ... ... ale to b.trudne + 5 ; ze wzgledu na mozliwosc roznej liczby plikow (stron) w zaleznosci czy wyswietlamy + 6 ; dlugie nazwy czy nie - nie da sie tego latwo zliczyc + 7 + 8 ; dodany "Backspace" jako powrot do katalogu wyzej. + 9 + 10 ; w wersji 4.6c zmieniony sposob rozpoznawania wielkosci sektora, dodane czytanie + 11 ; bloku PERCOM przy zmianie dysku... + 12 ; UWAGA! Bufor na pierwszy sektor ma dalej 128b, bezposrednio za nim jest bufor na sektor + 13 ; mapy, ktory moze byc zamazywany w chwili odczytu pierwszego sektora bez problemow. + 14 + 15 + 16 ; w wersji 4.6b poprawione dwa male bugi i dodane kulturalne wyjscie do DOS (Shift+Esc) ... + 17 ; ..... moznaby w tym momencie sprawdzac czy jest w ogole DOS w pamieci, bo bez DOS bedzie SelfTest + 18 + 19 ; w wersji 4.6 wyeliminowane chwilowe przelaczanie na domyslne kolory, różne poprawki procedur, + 20 ; żeby więcej gier się uruchamiało (zmiany w resecie i zmiennych systemowych) + 21 + 22 ; w wersji 4.5 obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera + 23 ; wyswietlanie "numeru" napedu w zaleznosci jak sie go wybierze (Dn: lub n: - cyfra lub litera) + 24 + 25 ; w wersji 4.4 (niepublikowanej) poprawiony blad. Nie moze byc dwa razy po sobie znacznika dziury w skompresowanej mapie + 26 ; czyli dziura max 127 sektorow a nie jak porzednio 254 + 27 ; dodatkowo zapamietanie (na czas resetu przed czyszczeniem pamieci) + 28 ; stanu aktywnych urzadzen PBI i odtworzenie go po resecie (dzieki Drac030) + 29 + 30 ; stan urzadzen na szynie PBI + 31 = 0247 PDVMASK = $0247 + 32 + 33 ; nowa koncepcja zrobiona: + 34 + 35 ; 1. wywalić turbo 'top-drive' + 36 + 37 ; 2. przerobić loader i menu na obsługę sektorów dow. długości + 38 + 39 ; 3. przepisac czytanie tablicy sektorów indeksowych z loadera do menu: + 40 ; a. w menu odczytywane są wszystkie sektory tablicy indeksowej + 41 ; b. budowana jest "skompresowana" tablica offsetów w stosunku do pierwszego sektora na nast. zasadzie: + 42 ; mamy nast. znaczniki : (nowa koncepcja) + 43 ; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) . Opłaci się używać do max 255 sektorów do przeskoczenia. + 44 ; 0xxxxxxx -- (0xxxxxxx = ile kolejnych sektorów wczytać) + 45 ; 00000000 -- następne 2 bajty to numer kolejnego sektora do odczytania + 46 ; + 47 + 48 ; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo + 49 + 50 + 51 ;START ADDR = 1FFD + 52 ;END ADDR = 28C9 + 53 ;.OPT noList + 54 + 55 icl 'lib/SYSEQU.ASM' +Source: SYSEQU.ASM + 1 ; .PAGE "FTe SYSTEM EQUATES FOR ATARI" + 2 ; + 3 ; FILE = #DN:SYSEQU.ASM + 4 ; + 5 ; + 6 ; I/O CONTROL BLOCK EQUATES + 7 ; + 8 ;SAVEPC = * ; SAVE CURRENT ORG + 9 ; + 10 + 11 = 0340 IOCB = $0340 ;START OF SYSTEM IOCBS + 12 ; + 13 = 0340 ICHID = IOCB ;DEVICE HANDLER IS (SET BY OS) + 14 = 0341 ICDNO = IOCB+1 ;DEVICE NUMBER (SET BY OS) + 15 = 0342 ICCOM = IOCB+2 ;I/O COMMAND + 16 = 0343 ICSTA = IOCB+3 ;I/O STATUS + 17 = 0344 ICBADR = IOCB+4 ;BUFFER ADDRESS + 18 = 0346 ICPUT = IOCB+6 ;DH PUT ROUTINE (ADR-1) + 19 = 0348 ICBLEN = IOCB+8 ;BUFFER LENGTH + 20 = 034A ICAUX1 = IOCB+10 ;AUX 1 + 21 = 034B ICAUX2 = IOCB+11 ;AUX 2 + 22 = 034C ICAUX3 = IOCB+12 ;AUX 3 + 23 = 034D ICAUX4 = IOCB+13 ;AUX 4 + 24 = 034E ICAUX5 = IOCB+14 ;AUX 5 + 25 = 034F ICAUX6 = IOCB+15 ;AUX 6 + 26 ; + 27 = 0010 IOCBLEN = 16 ;LENGTH OF ONE IOCB + 28 ; + 29 ; IOCB COMMAND VALUE EQUATES + 30 ; + 31 = 0003 COPN = 3 ;OPEN + 32 = 0007 CGBINR = 7 ;GET BINARY RECORD + 33 = 0005 CGTXTR = 5 ;GET TEXT RECORD + 34 = 000B CPBINR = 11 ;PUT BINARY RECORD + 35 = 0009 CPTXTR = 9 ;PUT TEXT RECORD + 36 = 000C CCLOSE = 12 ;CLOSE + 37 = 000D CSTAT = 13 ;GET STATUS + 38 ; + 39 ; DEVICE DEPENDENT COMMAND EQUATES FOR FILE MANAGER + 40 ; + 41 = 0020 CREN = 32 ;RENAME + 42 = 0021 CERA = 33 ;ERASE + 43 = 0023 CPRO = 35 ;PROTECT + 44 = 0024 CUNP = 36 ;UNPROTECT + 45 = 0025 CPOINT = 37 ;POINT + 46 = 0026 CNOTE = 38 ;NOTE + 47 ; + 48 ; AUX1 VALUES REQD FOR OPEN + 49 ; + 50 = 0004 OPIN = 4 ;OPEN INPUT + 51 = 0008 OPOUT = 8 ;OPEN OUTPUT + 52 = 000C OPUPD = 12 ;OPEN UPDATE + 53 = 0009 OPAPND = 9 ;OPEN APPEND + 54 = 0006 OPDIR = 6 ;OPEN DIRECTORY + 55 ; + 56 ; .PAGE + 57 ; + 58 ; EXECUTE FLAG DEFINES + 59 ; + 60 = 0080 EXCYES = $80 ; EXECUTE IN PROGRESS + 61 = 0040 EXCSCR = $40 ; ECHO EXCUTE INPUT TO SCREEN + 62 = 0010 EXCNEW = $10 ; EXECUTE START UP MODE + 63 = 0020 EXCSUP = $20 ; COLD START EXEC FLAG + 64 ; + 65 ; MISC ADDRESS EQUATES + 66 ; + 67 = 000A CPALOC = $0A ; POINTER TO CP/A + 68 = 0008 WARMST = $08 ; WAR, START (0=COLD) + 69 = 02E7 MEMLO = $02E7 ; AVAIL MEM (LOW) PTR + 70 = 02E5 MEMTOP = $02E5 ; AVAIL MEM (HIGH) PTR + 71 = 000E APPMHI = $0E ; UPPER LIMIT OF APPLICATION MEMORY + 72 = 02E2 INITADR = $02E2 ; ATARI LOAD/INIT ADR + 73 = 02E0 GOADR = $02E0 ; ATARI LOAD/GO ADR + 74 = BFFA CARTLOC = $BFFA ; CARTRIDGE RUN LOCATION + 75 = E456 CIO = $E456 ;CIO ENTRY ADR + 76 = 009B EOL = $9B ; END OF LINE CHAR + 77 ; + 78 ; CP/A FUNCTION AND VALUE DISPLACEMSNT + 79 ; (INDIRECT THROUGH CPALOC) + 80 ; IE. (CPALOC),Y + 81 ; + 82 = 0003 CPGNFN = 3 ; GET NEXT FILE NAME + 83 = 0007 CPDFDV = $07 ; DEFAULT DRIVE (3 BYTES) + 84 = 000A CPBUFP = $0A ; CMD BUFF NEXT CHAR POINTR (1 BYTE) + 85 = 000B CPEXFL = $0B ; EXECUTE FLAG + 86 = 000C CPEXFN = $0C ; EXECUTE FILE NAME (16 BYTES) + 87 = 001C CPEXNP = $1C ; EXECUTE NOTE/POINT VALUES + 88 = 0021 CPFNAM = $21 ; FILENAME BUFFER + 89 = 003D RUNLOC = $3D ; CP/A LOAD/RUN ADR + 90 = 003F CPCMDB = $3F ; COMMAND BUFFER (60 BYTES) + 91 = 00F3 CPCMDGO = $F3 + 92 ; + 93 ; *= SAVEPC ; RESTORE PC + 94 ; + 56 + 57 + 58 = 000A acktimeout = $a + 59 = 0002 readtimeout = 2 + 60 + 61 + 62 = 0318 STACKP = $0318 + 63 = 0042 CRITIC = $42 + 64 = 02BD DRETRY = $02BD + 65 = 030F CASFLG = $030F + 66 = 029C CRETRY = $029C + 67 + 68 + 69 = 0002 CASINI = $02 + 70 ;WARMST = $08 + 71 = 0009 BOOT = $09 + 72 = 000A DOSVEC = $0a + 73 = 000C DOSINI = $0c + 74 ;APPMHI = $0e + 75 + 76 = 0010 IRQENS = $10 + 77 + 78 + 79 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) + 80 + 81 ; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku + 82 = 0024 InBlockAddr = $24 ; word + 83 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) + 84 = 0026 ToBlockEnd = $26 ; word + 85 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH + 86 = 0028 ToFileEndL = $28 + 87 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku + 88 + 89 = 0030 CheckSUM = $30 + 90 = 0031 SecLenUS = $31 + 91 = 0032 SecBuffer = $32 + 92 = 0034 CRETRYZ = $34 + 93 = 0035 TransmitError =$35 + 94 = 0036 Looperka = $36 + 95 = 0037 StackCopy = $37 + 96 + 97 + 98 = 0058 SAVMSC = $58 + 99 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego + 100 ; katalog + 101 = 00CA CurrentDirBuf = $CA + 102 ; adres konca tego bufora (2 bajty) + 103 = 00CC CurrentDirBufEnd = $CC + 104 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji + 105 ; o obrabianym pliku (skok co $17) + 106 = 00D0 CurrentFileInfoBuff = $D0 + 107 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) + 108 = 00D2 DirMapSect = $D2 + 109 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu + 110 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji + 111 ; ma byc wyswietlany katalog od poczatku + 112 = 00D6 LastFilesPageFlag = $D6 + 113 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony + 114 ; zawiera liczbe widocznych na ekranie plikow (1 bajt) + 115 = 00D9 NamesOnScreen = $D9 + 116 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna + 117 ; wczesniej byl 1 bajt w $D6 + 118 = 00E2 InMapPointer = $E2 + 119 ; zmienna tymczasowa na ZP (2 bajty) + 120 = 00E4 TempZP = $E4 + 121 + 122 = 020A VSERIN = $020a + 123 = 02C5 COLPF1S = $02c5 + 124 = 02C6 COLPF2S = $02c6 + 125 = 02C8 COLBAKS = $02c8 + 126 + 127 = 0244 COLDST = $0244 + 128 ;MEMTOP = $02e5 + 129 ;MEMLO = $02e7 + 130 + 131 = 02FC KBCODES = $02fc + 132 + 133 = 0300 DDEVIC = $0300 + 134 = 0301 DUNIT = $0301 + 135 = 0302 DCOMND = $0302 + 136 = 0304 DBUFA = $0304 + 137 = 0308 DBYT = $0308 + 138 = 030A DAUX1 = $030a + 139 = 030B DAUX2 = $030b + 140 + 141 = 0342 ICCMD = $0342 + 142 = 0344 ICBUFA = $0344 + 143 ;ICBUFA+1 = $0345 + 144 = 0348 ICBUFL = $0348 + 145 ;ICBUFL+1 = $0349 + 146 = 034A ICAX1 = $034a + 147 = 034B ICAX2 = $034b + 148 + 149 = 03FA GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta + 150 + 151 = D204 AUDF3 = $d204 + 152 = D206 AUDF4 = $d206 + 153 = D207 AUDC4 = $d207 + 154 = D208 AUDCTL = $d208 + 155 = D20A SKSTRES = $d20a + 156 = D20D SEROUT = $D20d + 157 = D20D SERIN = $D20d + 158 = D20E IRQEN = $D20e + 159 = D20E IRQST = $D20e + 160 + 161 + 162 = D20F SKSTAT = $d20f + 163 = D20F SKCTL = $d20f + 164 + 165 + 166 = D303 PBCTL = $d303 + 167 = D301 PORTB = $d301 + 168 + 169 = D40B VCOUNT = $D40B + 170 + 171 = E456 JCIOMAIN = $e456 + 172 = E459 JSIOINT = $e459 + 173 = E471 JTESTROM = $e471 + 174 = E474 JRESETWM = $e474 + 175 = E477 JRESETCD = $e477 + 176 + 177 org $1FFD + 178 + 179 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura + 180 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! + 181 = 084B FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu + 182 = 084B TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) + 183 + 184 START + 185 FFFF> 1FFD-2D4F> 4C 8E + JMP FirstRun ;1FFD 4C 70 21 + 186 + 187 + 188 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu + 189 ; do wczytania !!!!!! + 190 + 191 2000 movedproc + 192 0700 .local loader, $0700 + 193 + 194 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 + 195 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych + 196 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO + 197 0700 ToFileEndH + 198 0700 00 00 .WO $0000 + 199 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + 200 0702 8A TXA + 201 0703 48 PHA + 202 0704 A5 28 LDA ToFileEndL + 203 0706 48 PHA + 204 0707 A5 3D LDA CompressedMapPos + 205 0709 48 PHA + 206 070A A5 3E LDA CompressedMapPos+1 + 207 070C 48 PHA + 208 070D 20 97 07 JSR GoInitAddr + 209 0710 68 PLA + 210 0711 85 3E STA CompressedMapPos+1 + 211 0713 68 PLA + 212 0714 85 3D STA CompressedMapPos + 213 0716 68 PLA + 214 0717 85 28 STA ToFileEndL + 215 0719 68 PLA + 216 071A AA TAX + 217 071B FileNextBlock ; wczytanie kolejnego bloku binarnego + 218 071B 20 8C 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) + 219 071E 25 24 AND InBlockAddr + 220 0720 C9 FF CMP #$FF ; jesli oba sa $FF to..... + 221 0722 D0 03 BNE FileNoFFFFHead + 222 0724 20 8C 07 JSR FileGetBlockStart ; pobranie jeszcze raz + 223 0727 FileNoFFFFHead + 224 0727 20 CA 07 JSR FileGetByte ; Pobranie adresu konca ladowanego bloku + 225 072A E5 24 SBC InBlockAddr ; i wyliczenie jego dlugosci + 226 072C 49 FF EOR #$FF ; UWAGA! Dlugosc jest zEORowana z $FFFF + 227 072E 85 26 STA ToBlockEnd ; czyli odjeta od $10000 + 228 0730 08 PHP ; odliczanie ilosci pobranych bajtow jest wiec potem robione + 229 0731 20 CA 07 JSR FileGetByte ; przez dodawanie i sprawdzanie czy nie ZERO + 230 0734 28 PLP + 231 0735 E5 25 SBC InBlockAddr+1 + 232 0737 49 FF EOR #$FF + 233 0739 85 27 STA ToBlockEnd+1 + 234 073B 38 SEC + 235 073C WhatIsIt + 236 073C B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y + 237 ; ktory tylko wylacza skok !!! + 238 073E CE 3C 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! + 239 0741 A5 24 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ + 240 0743 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu + 241 0746 A5 25 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem + 242 0748 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). + 243 074B FileNoFirstBlock + 244 074B A9 EB LDA #Jrts ; jesli nie jest to blok z adresem inicjacji + 247 0752 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie + 248 0755 A0 00 LDY #$00 + 249 0757 BlockReadLoop ;; petla odczytujaca z pliku blok binarny + 250 0757 E6 28 INC ToFileEndL ;; zwiekszenie licznika bajtow w calym pliku i jesli ZERO + 251 0759 F0 27 BEQ GoCheckEOF ;; skok do procedury sprawdzajacej dwa starsze jego bajty + 252 075B EC B3 07 CPX SecLen ;; sprawdzenie czy juz caly sektor przepisany jesli tak + 253 075E D0 08 bne NoNextSector1 ; -- + 254 0760 AD 4A 08 lda InSectorCountH ; -- obsluga sektorow ponad 256b + 255 0763 CD B4 07 cmp SecLen+1 ; -- + 256 0766 F0 1F BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + 257 0768 NoNextSector1 + 258 = 076A FileSecBuffHaddr1 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + 259 0768 BD 4B 08 LDA FileSecBuff,X + 260 076B E8 INX + 261 076C D0 03 bne InBlockReadLoop ; -- + 262 076E 20 E1 07 jsr IncrementationXH ; -- obsluga sektorow ponad 256b (ten trik dziala bo tam juz byl RTS :) ) + 263 0771 InBlockReadLoop + 264 0771 91 24 STA (InBlockAddr),Y + 265 0773 C8 INY + 266 0774 D0 02 BNE label15 + 267 0776 E6 25 INC InBlockAddr+1 + 268 0778 label15 + 269 0778 E6 26 INC ToBlockEnd + 270 077A D0 DB BNE BlockReadLoop + 271 077C E6 27 INC ToBlockEnd+1 + 272 077E D0 D7 BNE BlockReadLoop + 273 0780 F0 80 BEQ FileInit ; koniec bloku - skok pod adres inicjalizacji + 274 0782 GoCheckEOF + 275 0782 20 B7 07 JSR CheckEOF ; skok do procedury wspolnej dla pobierania bloku i bajtu + 276 0785 B0 EA BCS InBlockReadLoop ;tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli + 277 0787 GoGetNextFileSect + 278 0787 20 EC 07 JSR GetNextFileSect + 279 078A B0 E5 BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli + 280 078C FileGetBlockStart + 281 078C 20 CA 07 JSR FileGetByte + 282 078F 85 24 STA InBlockAddr + 283 0791 20 CA 07 JSR FileGetByte + 284 0794 85 25 STA InBlockAddr+1 + 285 0796 60 RTS + 286 0797 GoInitAddr + 287 0797 6C E2 02 JMP ($02E2) + 288 079A GetDataSector + 289 079A ReadErrorLoop + 290 079A A2 0B LDX #$0B + 291 079C SetDCB + 292 079C BD AB 07 LDA blokDanychIO_Loader,X + 293 079F 9D 00 03 STA DDEVIC,X + 294 07A2 CA DEX + 295 07A3 10 F7 BPL SetDCB + 296 07A5 SioJMP + 297 07A5 20 59 E4 JSR JSIOINT + 298 07A8 30 F0 BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + 299 07AA 60 RTS + 300 07AB blokDanychIO_Loader + 301 07AB 31 01 52 40 4B 08 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 + 302 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) + 303 = 07B3 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 + 304 07B5 SectorNumber + 305 07B5 00 00 .WO $0000 + 306 07B7 CheckEOF + 307 07B7 EE 00 07 INC ToFileEndH + 308 07BA D0 12 BNE NotEOF + 309 07BC EE 01 07 INC ToFileEndH+1 + 310 07BF D0 0D BNE NotEOF + 311 07C1 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + 312 07C1 A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu + 313 07C3 48 PHA + 314 07C4 A9 73 LDA #<(JRESETWM-1) + 315 07C6 48 PHA + 316 ;WaitLine0 + 317 ; LDA VCOUNT + 318 ; bne WaitLine0 + 319 07C7 6C E0 02 JMP ($02E0) + 320 ; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! + 321 07CA FileGetByte + 322 07CA E6 28 INC ToFileEndL + 323 07CC F0 E9 BEQ CheckEOF + 324 07CE NotEOF + 325 07CE EC B3 07 CPX SecLen ;; nie EOF, ale moze koniec sektora + 326 07D1 D0 08 bne ByteToACCU ; -- + 327 07D3 AD 4A 08 lda InSectorCountH ; -- obsluga sektorow ponad 256b + 328 07D6 CD B4 07 cmp SecLen+1 ; -- + 329 07D9 F0 11 BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny + 330 07DB ByteToACCU + 331 = 07DD FileSecBuffHaddr2 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! + 332 07DB BD 4B 08 LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + 333 07DE E8 INX + 334 07DF D0 09 bne GoToSec ; -- + 335 07E1 IncrementationXH ; taki trik - to przypadkiem jest podprogram, wiec mozna tu wskoczyc zamiast zwiekszac liczniki w innym miejscu po raz drugi + 336 07E1 EE 4A 08 inc InSectorCountH ; -- + 337 07E4 EE 6A 07 inc FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + 338 07E7 EE DD 07 inc FileSecBuffHaddr2 ; -- + 339 07EA GoToSec + 340 07EA 38 SEC + 341 07EB Jrts + 342 07EB 60 RTS + 343 ; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! + 344 07EC GetNextFileSect + 345 07EC 98 tya + 346 07ED 48 pha + 347 07EE ReadNextInSequence + 348 = 07EF SectorSequenceCount = *+1 + 349 07EE A9 00 lda #$00 ; to już ma być zainicjowane!!! + 350 07F0 F0 0D beq NextMapPosition + 351 07F2 CE EF 07 dec SectorSequenceCount + 352 07F5 EE B5 07 inc SectorNumber + 353 07F8 D0 03 bne noIncDAUX2 + 354 07FA EE B6 07 inc SectorNumber+1 + 355 07FD noIncDAUX2 + 356 07FD D0 30 bne ReadyToRead + 357 ;jak jest tutaj to jest błąd... + 358 ;powinien być skok do self-testu... + 359 07FF NextMapPosition + 360 07FF 20 43 08 jsr incCompressedMapPos + 361 ;UWAGA! adres w mapie jest zawsze zwiększany o 1 + 362 ;więc przed uruchomieniem loadera trzeba zainicjować adresem-1 + 363 0802 A0 00 ldy #0 + 364 0804 B1 3D lda (CompressedMapPos),y + 365 0806 30 07 bmi HowManyToSkip + 366 0808 F0 15 beq SetNewStartSector + 367 ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji + 368 080A 8D EF 07 sta SectorSequenceCount + 369 080D D0 DF bne ReadNextInSequence ;zawsze skoczy + 370 080F HowManyToSkip + 371 080F 29 7F and #%01111111 + 372 0811 18 clc + 373 0812 6D B5 07 adc SectorNumber + 374 0815 8D B5 07 sta SectorNumber + 375 0818 90 03 bcc noIncDAUX2_v2 + 376 081A EE B6 07 inc SectorNumber+1 + 377 081D noIncDAUX2_v2 + 378 081D D0 10 bne ReadyToRead + 379 ;jak jest tutaj to jest błąd... + 380 ;powinien być skok do self-testu... + 381 081F SetNewStartSector + 382 081F 20 43 08 jsr incCompressedMapPos + 383 0822 B1 3D lda (CompressedMapPos),y + 384 0824 8D B5 07 sta SectorNumber + 385 0827 20 43 08 jsr incCompressedMapPos + 386 082A B1 3D lda (CompressedMapPos),y + 387 082C 8D B6 07 sta SectorNumber+1 + 388 082F ReadyToRead + 389 082F 20 9A 07 JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + 390 + 391 0832 68 pla + 392 0833 A8 tay + 393 0834 A9 08 lda #>FileSecBuff ; -- + 394 0836 8D 6A 07 sta FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b + 395 0839 8D DD 07 sta FileSecBuffHaddr2 ; -- + 396 083C A2 00 LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + 397 083E 8E 4A 08 stx InSectorCountH ; -- + 398 0841 F0 98 JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + 399 + 400 0843 incCompressedMapPos + 401 0843 E6 3D inc CompressedMapPos + 402 0845 D0 02 bne skipIncCompressedMapPos + 403 0847 E6 3E inc CompressedMapPos+1 + 404 0849 skipIncCompressedMapPos + 405 0849 60 rts + 406 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X + 407 ; potrzebny do obslugi sektorow wiekszych od 256b + 408 084A InSectorCountH + 409 084A 00 .BY $00 + 410 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 + 411 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz + 412 ; w tym miejscu potem bedzie bufor + 413 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora + 414 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania + 415 084B zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie + 416 084B FirstMapSectorNr + 417 084B 00 00 .WO $0000 + 418 084D LoadStart + 419 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + 420 084D AC E7 02 LDY MEMLO + 421 0850 AD E8 02 LDA MEMLO+1 + 422 0853 8D 5A 08 STA InMemClearLoop+2 + 423 0856 OutMemClearLoop + 424 0856 A9 00 LDA #$00 + 425 0858 InMemClearLoop + 426 0858 99 00 09 STA $0900,Y + 427 085B C8 INY + 428 085C D0 FA BNE InMemClearLoop + 429 085E EE 5A 08 INC InMemClearLoop+2 + 430 0861 AD 5A 08 LDA InMemClearLoop+2 + 431 0864 CD E6 02 CMP MEMTOP+1 + 432 0867 90 ED BCC OutMemClearLoop + 433 0869 AD E6 02 LDA MEMTOP+1 + 434 086C 8D 76 08 STA LastMemPageClear+2 + 435 086F AC E5 02 LDY MEMTOP + 436 0872 A9 00 LDA #$00 + 437 0874 LastMemPageClear + 438 0874 99 00 80 STA $8000,Y + 439 0877 88 DEY + 440 0878 C0 FF CPY #$FF + 441 087A D0 F8 BNE LastMemPageClear + 442 ; wyczyszczona, wiec .... + 443 087C AD 95 08 LDA tempToFileEndL + 444 087F 85 28 STA ToFileEndL + 445 0881 A9 FF LDA #$FF + 446 0883 8D FC 02 STA KBCODES + 447 0886 EE 3C 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) + 448 0889 AE B3 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora + 449 088C AD B4 07 LDA Seclen+1 ; -- + 450 088F 8D 4A 08 STA InSectorCountH ; -- obsluga sektorow ponad 256b + 451 ;jmp * + 452 0892 4C 1B 07 JMP FileNextBlock + 453 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku + 454 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera + 455 0895 tempToFileEndL + 456 0895 00 .BY $00 + 457 .endl + 458 2196 JAkieTurbo + 459 2196 USmode + 460 2196 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed + 461 2197 QMEG + 462 2197 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG + 463 2198 BootDrive + 464 2198 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi + 465 2199 BootShift + 466 2199 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety + 467 219A FolderTurbo + 468 219A 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT + 469 219B NewColors + 470 219B 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano + 471 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) + 472 219C bin2AsciiHex + 473 219C 29 0F AND #$0F + 474 219E 09 30 ORA #$30 + 475 21A0 C9 3A CMP #$3A + 476 21A2 90 03 BCC labelka + 477 21A4 18 CLC + 478 21A5 69 07 ADC #$07 + 479 21A7 labelka + 480 21A7 60 RTS + 481 21A8 Edriver + 482 21A8 45 3A 9B .BY "E:",$9b + 483 21AB EditorOpen + 484 ; otwarcie ekranu !!! + 485 21AB A2 00 LDX #$00 ; kanal nr 0 + 486 21AD 20 5F 2B JSR CloseX ; najpierw Zamkniecie Ekranu + 487 21B0 30 55 BMI ErrorDisplay + 488 21B2 A2 00 LDX #$00 ; kanal nr 0 + 489 21B4 A9 03 LDA #$03 + 490 21B6 9D 42 03 STA ICCMD,X + 491 21B9 A9 0C LDA #$0C + 492 21BB 9D 4A 03 STA ICAX1,X + 493 21BE 9D 48 03 STA ICBUFL,X + 494 21C1 A9 00 LDA #$00 + 495 21C3 9D 4B 03 STA ICAX2,X + 496 21C6 9D 49 03 STA ICBUFL+1,X + 497 21C9 A9 A8 LDA #Edriver + 500 21D0 9D 45 03 STA ICBUFA+1,X + 501 21D3 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 + 502 21D6 30 2F BMI ErrorDisplay + 503 21D8 60 RTS + 504 + 505 21D9 mainprog + 506 21D9 AD 97 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US + 507 21DC 2D 99 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza + 508 21DF 8D 96 21 STA USmode + 509 21E2 F0 1E BEQ NoUSSpeed + 510 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler + 511 21E4 A0 25 ldy #blokDanychIO_GetUSSpeed + 513 21E8 20 4B 2B jsr Table2DCB + 514 21EB 20 59 E4 jsr JSIOINT ; wysylamy "?" + 515 21EE 10 07 bpl USSpeed + 516 21F0 A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage + 517 21F2 8D 96 21 sta USmode + 518 21F5 F0 0B beq NoUSSpeed + 519 21F7 USSpeed + 520 21F7 A0 02 LDY #$2 + 521 21F9 USstatprint + 522 21F9 B9 87 2C LDA ONtext,y + 523 21FC 99 6B 23 STA USstatus,y + 524 21FF 88 DEY + 525 2200 10 F7 bpl USstatprint + 526 + 527 2202 NoUSSpeed + 528 2202 4C 48 22 JMP ReadMainDir + 529 2205 Error148 + 530 2205 A0 94 LDY #$94 ; kod bledu do Y + 531 ; wyswietlenie komunikatu o bledzie - kod bledu w Y + 532 2207 ErrorDisplay + 533 2207 98 TYA + 534 2208 48 PHA + 535 2209 20 5D 2B JSR Close1 + 536 220C 68 PLA + 537 220D 48 PHA + 538 220E 4A LSR + 539 220F 4A LSR + 540 2210 4A LSR + 541 2211 4A LSR + 542 2212 20 9C 21 JSR bin2AsciiHex ; 4 starsze bity na HEX + 543 2215 8D 2E 22 STA ErrorNumHex + 544 2218 68 PLA + 545 2219 20 9C 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX + 546 221C 8D 2F 22 STA ErrorNumHex+1 + 547 221F 20 B0 2A JSR PrintXY + 548 2222 00 00 .BY $00,$00 + 549 2224 7D .BY $7d ; kod czyszczenia ekranu + 550 2225 45 52 52 4F 52 20 + .BY "ERROR - $" + 551 222E ErrorNumHex + 552 222E 30 30 00 .BY "00",$00 + 553 ; czekamy na dowolny klawisz + 554 2231 A9 FF LDA #$FF + 555 2233 8D FC 02 STA KBCODES + 556 2236 WaitKloop + 557 2236 AE FC 02 LDX KBCODES + 558 2239 E8 INX + 559 223A F0 FA BEQ WaitKloop + 560 223C 8D FC 02 STA KBCODES ; w A jest $FF + 561 ; ------------------ + 562 ; na wypadek wybrania nieistniejacej stacji + 563 ; po bledzie przechodzimy na te z ktorej sie ladowalismy + 564 223F AD 98 21 LDA BootDrive + 565 ;LDA #1 + 566 2242 20 02 2C JSR SeTDriveNR + 567 ; ----------------- + 568 2245 4C D9 21 JMP mainprog ; i odpalamy program od nowa + 569 2248 ReadMainDir + 570 2248 20 2A 2A JSR ReadPERCOM + 571 224B A2 2D LDX #>FirstSectorBuff + 572 224D A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) + 581 225F D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki + 582 2261 SpartaDisk + 583 2261 A2 00 LDX #$00 + 584 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 + 585 2263 AD 1F 2D LDA FirstSectorBuff+$1F + 586 2266 30 04 BMI Sektor128b + 587 2268 AA TAX + 588 2269 A9 00 LDA #$00 + 589 226B E8 INX ; i wyliczenie starszego bajtu + 590 226C Sektor128b + 591 226C 8D B3 20 STA .adr loader.SecLen ; przed przepisaniem + 592 226F 8E B4 20 STX .adr loader.SecLen+1 ; przed przepisaniem + 593 ; pokazanie na ekranie + 594 2272 BD 84 2C LDA DensityCodes,X + 595 2275 8D 47 23 STA DensityDisplay + 596 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + 597 2278 AC 09 2D LDY FirstSectorBuff+$09 + 598 227B AE 0A 2D LDX FirstSectorBuff+$0A + 599 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x + 600 227E ReadDIR + 601 ; ustawienie znacznika wlaczenia Turbo dla katalogu + 602 227E A9 01 LDA #$01 + 603 2280 8D 9A 21 STA FolderTurbo + 604 2283 84 D2 STY DirMapSect + 605 2285 86 D3 STX DirMapSect+1 + 606 2287 A9 2F LDA #>DirSectorBuff + 607 2289 85 D1 STA CurrentFileInfoBuff+1 + 608 228B 85 CB STA CurrentDirBuf+1 + 609 228D A9 80 LDA #" + 751 23CD 3A 4D 61 69 6E 20 + .BY ":Main Dir. " + 752 23D9 BC .BY +$80,"<" + 753 23DA 3A 55 50 2D 44 49 + .BY ":UP-DIR." + 754 23E2 00 .BY $00 + 755 23E3 A9 00 LDA #$00 + 756 23E5 85 D9 STA NamesOnScreen + 757 23E7 label68 + 758 23E7 A5 D1 LDA CurrentFileInfoBuff+1 + 759 23E9 C5 CD CMP CurrentDirBufEnd+1 + 760 23EB 90 08 BCC NoLastFileInDir + 761 23ED D0 55 BNE LastFilesPageJump + 762 23EF A5 D0 LDA CurrentFileInfoBuff + 763 23F1 C5 CC CMP CurrentDirBufEnd + 764 23F3 B0 4F BCS LastFilesPageJump + 765 23F5 NoLastFileInDir + 766 23F5 A0 00 LDY #$00 + 767 23F7 B1 D0 LDA (CurrentFileInfoBuff),Y + 768 23F9 F0 49 BEQ LastFilesPageJump + 769 23FB A2 22 LDX #$22 + 770 23FD A9 20 LDA #$20 ; spacja + 771 23FF label50 + 772 23FF 9D B0 24 STA GameName,X + 773 2402 CA DEX + 774 2403 10 FA BPL label50 + 775 2405 A0 10 LDY #$10 + 776 2407 A2 0A LDX #$0A + 777 2409 label51 + 778 2409 B1 D0 LDA (CurrentFileInfoBuff),Y + 779 240B 9D B0 24 STA GameName,X + 780 240E 88 DEY + 781 240F CA DEX + 782 2410 10 F7 BPL label51 + 783 2412 A5 D9 LDA NamesOnScreen + 784 2414 18 CLC + 785 2415 69 41 ADC #$41 ; literka "A" + 786 2417 8D AD 24 STA GameKeySymbol + 787 241A A5 D8 LDA $D8 + 788 241C D0 2C BNE label52 + 789 241E A0 00 LDY #$00 + 790 ; status sprawdzanego pliku + 791 2420 B1 D0 LDA (CurrentFileInfoBuff),Y + 792 2422 29 19 AND #$19 + 793 2424 C9 09 CMP #$09 + 794 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + 795 2426 F0 08 BEQ label53 + 796 2428 A6 D7 LDX $D7 + 797 242A F0 1B BEQ label54 + 798 242C C9 08 CMP #$08 + 799 242E D0 17 BNE label54 + 800 2430 label53 + 801 ; jeszcze raz status sprawdzanego pliku + 802 2430 B1 D0 LDA (CurrentFileInfoBuff),Y + 803 2432 29 20 AND #$20 + 804 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + 805 2434 F0 0B BEQ label55 + 806 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + 807 2436 A2 08 LDX #$08 + 808 2438 label56 + 809 2438 BD BF 25 LDA SubDirText,X + 810 243B 8D BC 24 STA GameName+12 + 811 243E CA DEX + 812 243F 10 F7 BPL label56 + 813 2441 label55 + 814 2441 4C A0 24 JMP GameNamePrint + 815 2444 LastFilesPageJump + 816 2444 4C 48 25 JMP LastFilesPage + 817 2447 label54 + 818 2447 4C F8 24 JMP label59 + 819 244A label52 + 820 244A A0 00 LDY #$00 + 821 244C B1 D0 LDA (CurrentFileInfoBuff),Y + 822 244E 29 18 AND #$18 + 823 2450 C9 08 CMP #$08 + 824 2452 D0 F3 BNE label54 + 825 2454 A5 CC LDA CurrentDirBufEnd + 826 2456 85 D4 STA $D4 + 827 2458 A5 CD LDA CurrentDirBufEnd+1 + 828 245A 85 D5 STA $D5 + 829 245C label65 + 830 245C A5 D5 LDA $D5 + 831 245E C5 CF CMP $CF + 832 2460 90 08 BCC label60 + 833 2462 D0 E3 BNE label54 + 834 2464 A5 D4 LDA $D4 + 835 2466 C5 CE CMP $CE + 836 2468 B0 DD BCS label54 + 837 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy + 838 246A label60 + 839 246A A0 00 LDY #$00 + 840 246C B1 D4 LDA ($D4),Y + 841 246E C9 2A CMP #'*' + 842 2470 D0 06 BNE CompareNames + 843 2472 8D 9B 21 STA NewColors + 844 2475 20 C8 2B JSR Asteriks + 845 2478 CompareNames + 846 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT + 847 2478 A0 0A LDY #$0A ; 8+3 znaki + 848 247A Checking62 + 849 247A B1 D4 LDA ($D4),Y + 850 247C D9 B0 24 CMP GameName,Y + 851 247F D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw + 852 2481 88 DEY + 853 2482 10 F6 BPL Checking62 + 854 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + 855 2484 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku + 856 2486 ReplacingName + 857 2486 B1 D4 LDA ($D4),Y + 858 2488 99 A5 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania + 859 248B C8 INY + 860 248C C0 2E CPY #$2E + 861 248E 90 F6 BCC ReplacingName + 862 2490 B0 0E BCS GameNamePrint + 863 2492 CheckNextName + 864 2492 A5 D4 LDA $D4 + 865 2494 18 CLC + 866 2495 69 2E ADC #$2E + 867 2497 85 D4 STA $D4 + 868 2499 90 02 BCC label64 + 869 249B E6 D5 INC $D5 + 870 249D label64 + 871 249D 4C 5C 24 JMP label65 + 872 24A0 GameNamePrint + 873 24A0 A5 D9 LDA NamesOnScreen + 874 24A2 18 CLC + 875 24A3 69 02 ADC #$02 + 876 24A5 8D AC 24 STA YposGameName + 877 24A8 20 B0 2A JSR PrintXY + 878 24AB 01 .BY $01 + 879 24AC YposGameName + 880 24AC 02 .BY $02 + 881 24AD GameKeySymbol + 882 24AD 41 29 20 .BY "A) " + 883 24B0 GameName + 884 24B0 20 20 20 20 20 20 + .BY " " + 885 24D3 00 .BY $00 + 886 24D4 A5 D9 LDA NamesOnScreen + 887 24D6 0A ASL + 888 24D7 AA TAX + 889 24D8 A5 D0 LDA CurrentFileInfoBuff + 890 24DA 9D 9A 2C STA FirstSectorsTable,X + 891 24DD A5 D1 LDA CurrentFileInfoBuff+1 + 892 24DF 9D 9B 2C STA FirstSectorsTable+1,X + 893 24E2 A5 D0 LDA CurrentFileInfoBuff + 894 24E4 18 CLC + 895 24E5 69 17 ADC #$17 + 896 24E7 85 D0 STA CurrentFileInfoBuff + 897 24E9 90 02 BCC label66 + 898 24EB E6 D1 INC CurrentFileInfoBuff+1 + 899 24ED label66 + 900 24ED E6 D9 INC NamesOnScreen + 901 24EF A5 D9 LDA NamesOnScreen + 902 24F1 C9 13 CMP #$13 + 903 24F3 B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + 904 24F5 4C E7 23 JMP label68 + 905 24F8 label59 + 906 24F8 A5 D0 LDA CurrentFileInfoBuff + 907 24FA 18 CLC + 908 24FB 69 17 ADC #$17 + 909 24FD 85 D0 STA CurrentFileInfoBuff + 910 24FF 90 02 BCC label69 + 911 2501 E6 D1 INC CurrentFileInfoBuff+1 + 912 2503 label69 + 913 2503 4C E7 23 JMP label68 + 914 2506 MainDirKEY + 915 2506 4C 48 22 JMP ReadMainDir + 916 2509 UpDirKEY + 917 2509 A0 02 LDY #$02 + 918 250B B1 CA LDA (CurrentDirBuf),Y + 919 250D AA TAX + 920 250E 88 DEY + 921 250F 11 CA ORA (CurrentDirBuf),Y + 922 2511 F0 37 BEQ KeyboardProc + 923 2513 B1 CA LDA (CurrentDirBuf),Y + 924 2515 A8 TAY + 925 2516 4C 7E 22 JMP ReadDIR + 926 2519 EscKEY + 927 ; sprawdzmy czy z Shift + 928 2519 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! + 929 251C 29 08 and #$08 + 930 251E D0 06 BNE NoSHIFTEsc + 931 2520 20 AB 21 JSR EditorOpen + 932 2523 6C 0A 00 JMP (DOSVEC) + 933 2526 NoSHIFTEsc + 934 2526 A2 00 LDX #$00 + 935 2528 86 D8 STX $D8 + 936 252A E8 INX + 937 252B 86 D7 STX $D7 + 938 252D ToStartOfDirJump + 939 252D 4C 30 23 JMP ToStartOfDir + 940 2530 SpaceKEY + 941 2530 A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy + 942 2532 D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku + 943 2534 4C 41 23 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej + 944 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie + 945 2537 ContArrowsPrint + 946 2537 20 B0 2A JSR PrintXY + 947 253A 01 15 .BY $01,$15 + 948 253C 1D .BY $1D ; strzalka w dol + 949 253D 00 .BY $00 + 950 253E 20 B0 2A JSR PrintXY + 951 2541 0E 15 .BY $0E,$15 + 952 2543 1D .BY $1D ; strzalka w dol + 953 2544 00 .BY $00 + 954 2545 4C 4A 25 JMP KeyboardProc + 955 2548 LastFilesPage + 956 2548 E6 D6 INC LastFilesPageFlag + 957 254A KeyboardProc + 958 254A AD 9B 21 LDA NewColors + 959 254D D0 0D BNE ColorsAlreadySet + 960 254F A9 C4 LDA #$C4 ; ustawienie koloru tła i liter + 961 2551 8D C6 02 STA COLPF2S + 962 2554 8D C8 02 STA COLBAKS + 963 2557 A9 CA LDA #$CA + 964 2559 8D C5 02 STA COLPF1S + 965 255C ColorsAlreadySet + 966 255C 20 67 2B JSR GetKey + 967 255F 29 7F AND #%01111111 ; eliminujemy invers + 968 2561 F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + 969 2563 C9 3E CMP #$3E ; ">" + 970 2565 F0 9F BEQ MainDirKEY + 971 2567 C9 3C CMP #$3C ; "<" + 972 2569 F0 9E BEQ UpDirKEY + 973 256B C9 7E CMP #$7E ; BackSpace + 974 256D F0 9A BEQ UpDirKEY + 975 256F C9 1B CMP #$1B ; Esc + 976 2571 F0 A6 BEQ EscKEY + 977 2573 C9 20 CMP #$20 ; Spacja + 978 2575 F0 B9 BEQ SpaceKEY + 979 ; ---------------- + 980 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + 981 2577 C9 10 CMP #$10 + 982 2579 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + 983 257B 20 15 2C JSR SeTDriveLetter + 984 257E 4C D9 21 JMP mainprog + 985 2581 noCtrlLetter + 986 ; sprawdzenie klawiszy 1-8 + 987 2581 C9 31 CMP #'1' + 988 2583 90 0D BCC NoNumber + 989 2585 C9 39 CMP #'9' + 990 2587 B0 09 BCS NoNumber + 991 2589 38 SEC + 992 258A E9 30 SBC #'0' + 993 258C 20 02 2C JSR SeTDriveNR + 994 258F 4C D9 21 JMP mainprog + 995 ; ----------------- + 996 2592 NoNumber + 997 2592 C9 61 CMP #'a' ; czy nie ma capsa + 998 2594 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany + 999 2596 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) + 1000 2598 BigLetters + 1001 2598 38 SEC + 1002 2599 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy + 1003 259B C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie + 1004 259D B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz + 1005 259F 0A ASL + 1006 25A0 AA TAX + 1007 25A1 BD 9A 2C LDA FirstSectorsTable,X + 1008 25A4 85 D4 STA $D4 + 1009 25A6 BD 9B 2C LDA FirstSectorsTable+1,X + 1010 25A9 85 D5 STA $D5 + 1011 25AB A0 00 LDY #$00 + 1012 25AD B1 D4 LDA ($D4),Y + 1013 25AF 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik + 1014 25B1 F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader + 1015 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran + 1016 25B3 A0 02 LDY #$02 + 1017 25B5 B1 D4 LDA ($D4),Y + 1018 25B7 AA TAX + 1019 25B8 88 DEY + 1020 25B9 B1 D4 LDA ($D4),Y + 1021 25BB A8 TAY + 1022 25BC 4C 7E 22 JMP ReadDIR + 1023 25BF SubDirText + 1024 25BF 3C 53 55 42 2D 44 + .BY "" + 1025 25C8 GOtoLoader + 1026 25C8 20 B1 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 1027 25CB F0 03 BEQ DiskNotChanged1 + 1028 25CD 4C 48 22 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego + 1029 25D0 DiskNotChanged1 + 1030 25D0 AD 9A 21 LDA FolderTurbo + 1031 25D3 F0 07 BEQ SetTurboOFF + 1032 25D5 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + 1033 25D8 29 08 and #$08 + 1034 25DA D0 03 BNE NoSHIFT + 1035 25DC SetTurboOFF + 1036 25DC 8D 96 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 + 1037 25DF NoSHIFT + 1038 25DF A0 01 LDY #$01 + 1039 25E1 B1 D4 LDA ($D4),Y + 1040 25E3 8D 4B 21 STA .adr loader.FirstMapSectorNr ; przed przepisaniem + 1041 25E6 8D AD 2A sta blokDanychIO+$A ; od razu do bloku IOCB + 1042 25E9 C8 INY + 1043 25EA B1 D4 LDA ($D4),Y + 1044 25EC 8D 4C 21 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + 1045 25EF 8D AE 2A sta blokDanychIO+$B ; od razu do bloku IOCB + 1046 25F2 C8 INY + 1047 25F3 B1 D4 LDA ($D4),Y + 1048 25F5 49 FF EOR #$FF + 1049 25F7 8D 95 21 STA .adr loader.tempToFileEndL + 1050 25FA C8 INY + 1051 25FB B1 D4 LDA ($D4),Y + 1052 25FD 49 FF EOR #$FF + 1053 25FF 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem + 1054 2602 C8 INY + 1055 2603 B1 D4 LDA ($D4),Y + 1056 2605 49 FF EOR #$FF + 1057 2607 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem + 1058 ; wszystko zapamietane mozna robic mape sektorow.... + 1059 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu + 1060 ; czyli DirSectorBuff + 1061 ; sektor mapy przed kompresja leci do DirMapSectorBuff + 1062 ; UWAGA + 1063 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi + 1064 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! + 1065 = 2F80 CompressedMap = DirSectorBuff + 1066 ; czytamy pierwszy sektor mapy + 1067 260A A0 80 LDY #DirMapSectorBuff + 1069 260E 20 75 2A Jsr ReadSector + 1070 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! + 1071 2611 A9 00 LDA #00 + 1072 2613 85 82 STA CompressedMapCounter + 1073 2615 85 83 STA CompressedMapCounter+1 + 1074 2617 20 E3 26 JSR AddToCompressedMAP + 1075 261A AD 84 2D LDA DirMapSectorBuff+4 + 1076 261D 85 86 STA PrevFileSector + 1077 261F 20 E3 26 JSR AddToCompressedMAP + 1078 2622 AD 85 2D LDA DirMapSectorBuff+5 + 1079 2625 85 87 sta PrevFileSector+1 + 1080 2627 20 E3 26 JSR AddToCompressedMAP + 1081 ; Inicjujemy liczniki + 1082 262A .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 + 1083 262A .zpvar PrevFileSector, MapPositionMem .word + 1084 262A .zpvar SectorOffset .word + 1085 262A .zpvar SectorsCounter .byte + 1086 262A A9 00 LDA #$00 + 1087 262C 85 81 STA MapCounter+1 + 1088 262E 85 8C STA SectorsCounter + 1089 2630 A9 06 lda #$06 + 1090 2632 85 80 STA MapCounter + 1091 2634 GenerateCompressedMap + 1092 2634 18 CLC + 1093 2635 A9 80 LDA #DirMapSectorBuff + 1097 263D 65 81 ADC MapCounter+1 + 1098 263F 85 89 STA MAPPositionMem+1 + 1099 2641 A2 00 LDX #0 + 1100 2643 A0 01 LDY #1 + 1101 2645 A1 88 LDA (MAPPositionMem,x) + 1102 2647 11 88 ORA (MAPPositionMem),y + 1103 2649 F0 56 BEQ Sector00 + 1104 264B 38 SEC + 1105 264C A1 88 LDA (MAPPositionMem,x) + 1106 264E E5 86 SBC PrevFileSector + 1107 2650 85 8A STA SectorOffset + 1108 2652 B1 88 LDA (MAPPositionMem),y + 1109 2654 E5 87 SBC PrevFileSector+1 + 1110 2656 85 8B STA SectorOffset+1 + 1111 ; mamy odstep miedzy poprzednim a nastepnym sektorem + 1112 2658 D0 26 BNE OffsetToBig + 1113 265A A5 8A LDA SectorOffset + 1114 265C 30 22 BMI OffsetToBig ; max przeskok 127 sektorow + 1115 265E C9 01 CMP #$01 + 1116 2660 D0 11 BNE JumpForward + 1117 ; kolejny sektor + 1118 ; zwiekszamy wiec licznik + 1119 2662 E6 8C inc SectorsCounter + 1120 2664 A5 8C LDA SectorsCounter + 1121 2666 C9 7F CMP #%01111111 + 1122 2668 D0 2C BNE GetNextMapWord + 1123 ; tu licznik dotarl do konca zerujemy go + 1124 ; dodajemy wpis do skompresowanej mapy i gotowe + 1125 266A 20 E3 26 JSR AddToCompressedMAP + 1126 266D A9 00 LDA #0 + 1127 266F 85 8C STA SectorsCounter + 1128 2671 F0 23 BEQ GetNextMapWord + 1129 ; ominiecie wyznaczonej ilości sektorów (w A) + 1130 2673 JumpForward + 1131 2673 20 FE 26 JSR FlushBuffer + 1132 2676 A5 8A LDA SectorOffset + 1133 2678 09 80 ORA #%10000000 + 1134 267A 20 E3 26 JSR AddToCompressedMAP + 1135 267D 4C 96 26 JMP GetNextMapWord + 1136 ; wyznaczenie skoku do nowego sektora pliku + 1137 2680 OffsetToBig + 1138 2680 20 FE 26 JSR FlushBuffer + 1139 2683 A9 00 LDA #0 + 1140 2685 20 E3 26 JSR AddToCompressedMAP + 1141 2688 A0 00 LDY #00 + 1142 268A B1 88 LDA (MAPPositionMem),y + 1143 268C 20 E3 26 JSR AddToCompressedMAP + 1144 268F A0 01 LDY #01 + 1145 2691 B1 88 LDA (MAPPositionMem),y + 1146 2693 20 E3 26 JSR AddToCompressedMAP + 1147 2696 GetNextMapWord + 1148 ; zapamietanie numeru obecnego sektora do porownania potem + 1149 2696 A0 00 LDY #00 + 1150 2698 B1 88 LDA (MAPPositionMem),y + 1151 269A 85 86 STA PrevFileSector + 1152 269C C8 INY + 1153 269D B1 88 LDA (MAPPositionMem),y + 1154 269F 85 87 STA PrevFileSector+1 + 1155 26A1 Sector00 + 1156 26A1 18 A5 80 69 02 85 + ADW MapCounter #2 + 1157 26AC ops01 + 1158 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala + 1159 26AC A5 81 LDA MapCounter+1 + 1160 26AE CD B4 20 CMP .adr loader.SecLen+1 + 1161 26B1 D0 05 bne noteqal01 + 1162 26B3 A5 80 LDA MapCounter + 1163 26B5 CD B3 20 CMP .adr loader.SecLen + 1164 26B8 noteqal01 + 1165 26B8 F0 03 4C 34 26 JNE GenerateCompressedMap + 1166 ; czytamy nastepny sektor mapy + 1167 ; sprawdzmy czy nie koniec + 1168 26BD AD 80 2D LDA DirMapSectorBuff + 1169 26C0 0D 81 2D ORA DirMapSectorBuff+1 + 1170 26C3 F0 45 BEQ EndMakingMap + 1171 26C5 AD 80 2D LDA DirMapSectorBuff + 1172 26C8 8D AD 2A sta blokDanychIO+$A + 1173 26CB AD 81 2D LDA DirMapSectorBuff+1 + 1174 26CE 8D AE 2A sta blokDanychIO+$B + 1175 26D1 A0 80 LDY #DirMapSectorBuff + 1177 26D5 20 75 2A Jsr ReadSector + 1178 ; zerujemy licznik mapy + 1179 26D8 A9 00 LDA #$00 + 1180 26DA 85 81 STA MapCounter+1 + 1181 26DC A9 04 lda #$04 + 1182 26DE 85 80 STA MapCounter + 1183 26E0 4C 34 26 JMP GenerateCompressedMap + 1184 ; dpisanie bajtu z A do mapy sektorow skompresowanej + 1185 26E3 AddToCompressedMAP + 1186 26E3 48 PHA + 1187 ; wyliczamy adresa + 1188 26E4 18 CLC + 1189 26E5 A5 82 LDA CompressedMapCounter + 1190 26E7 69 80 ADC #CompressedMap + 1194 26F0 8D F6 26 STA xxxxbla+1 + 1195 26F3 68 PLA + 1196 = 26F5 xxxxbla=*+1 + 1197 26F4 8D FF FF STA $FFFF + 1198 26F7 E6 82 INC CompressedMapCounter + 1199 26F9 D0 02 BNE noinc013 + 1200 26FB E6 83 INC CompressedMapCounter+1 + 1201 26FD noinc013 + 1202 26FD 60 RTS + 1203 26FE FlushBuffer + 1204 26FE A5 8C LDA SectorsCounter + 1205 2700 F0 07 BEQ NoFlush + 1206 2702 20 E3 26 JSR AddToCompressedMAP + 1207 2705 A9 00 LDA #0 + 1208 2707 85 8C STA SectorsCounter + 1209 2709 NoFlush + 1210 2709 60 RTS + 1211 270A EndMakingMap + 1212 270A 20 FE 26 JSR FlushBuffer + 1213 270D LoaderGo + 1214 270D A0 00 LDY #$00 + 1215 270F 8C 44 02 STY COLDST + 1216 2712 A9 01 LDA #$01 + 1217 2714 85 09 STA BOOT + 1218 2716 AE 00 07 LDX $700 + 1219 2719 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta + 1220 271B D0 03 BNE NoRunFromDOS + 1221 271D 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! + 1222 ; STA $D5EC ; to wylacza SpartaDOS X + 1223 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) + 1224 2720 NoRunFromDOS + 1225 2720 A9 31 LDA #AfterWormStart + 1228 2726 85 0D STA DOSINI+1 + 1229 ; LDA #>JRESETCD + 1230 ; STA DOSVEC+1 + 1231 ; LDA #TempMEMLO + 1252 2744 6D B4 20 ADC .adr loader.SecLen+1 + 1253 2747 8D E8 02 STA MEMLO+1 + 1254 274A 85 3E STA CompressedMapPos+1 + 1255 ; STA pointerMov2b + 1256 ; STA APPMHI+1 + 1257 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora + 1258 ; jest to jednoczesnie adres umieszczenia skompresowanej + 1259 ; mapy sektorow pliku dla loadera ale MINUS 1 + 1260 274C A5 3D D0 02 C6 3E + DEW CompressedMapPos + 1261 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej + 1262 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) + 1263 2754 18 CLC + 1264 2755 AD E7 02 LDA MEMLO + 1265 ; ADC CompressedMapCounter + 1266 ; STA MEMLO + 1267 2758 8D FF 27 STA TurboRelocADDR + 1268 275B AD E8 02 LDA MEMLO+1 + 1269 ; ADC CompressedMapCounter+1 + 1270 ; STA MEMLO+1 + 1271 275E 8D 00 28 STA TurboRelocADDR+1 + 1272 2761 A9 71 LDA #JTESTROM + 1275 2767 85 0D STA DOSINI+1 + 1276 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) + 1277 ; INC $033D ; bajty kontrolne zimnego startu + 1278 ; INC $033E ; zmiana ich wartosci wymusza + 1279 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) + 1280 2769 A2 00 LDX #$00 + 1281 276B 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) + 1282 ; STX BOOT + 1283 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci + 1284 276D moveloop1 + 1285 276D BD 00 20 LDA movedproc,X + 1286 2770 9D 00 07 STA $0700,X + 1287 2773 BD 00 21 LDA movedproc+$0100,X + 1288 2776 9D 00 08 STA $0800,X + 1289 2779 E8 INX + 1290 277A D0 F1 BNE moveloop1 + 1291 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora + 1292 /* moveloop2 + 1293 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy + 1294 pointerMov2a=*+2 + 1295 LDA CompressedMap,x ; kod samomodyfikujacy sie + 1296 pointerMov2b=*+2 + 1297 STA $FFFF,x ; kod samomodyfikujacy sie + 1298 LDA CompressedMapCounter + 1299 AND CompressedMapCounter+1 + 1300 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! + 1301 BEQ SectorMapReady + 1302 INX + 1303 BNE moveloop2 + 1304 inc pointerMov2a + 1305 inc pointerMov2b + 1306 bne moveloop2 + 1307 SectorMapReady + 1308 */ + 1308 + 1309 277C 20 C1 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + 1310 277F 20 31 2C JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 1311 + 1312 2782 A2 00 LDX #$00 + 1313 2784 8A TXA + 1314 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) + 1315 2785 ClearLoop1 + 1316 2785 9D 00 01 STA $0100,X ; STOS !!! + 1317 2788 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) + 1318 278B 9D 00 05 STA $0500,X + 1319 278E 9D 00 06 STA $0600,X + 1320 2791 E0 80 CPX #$80 ;tylko ponad $80 + 1321 2793 90 02 BCC NoZpage + 1322 2795 95 00 STA $00,X ; czyli polowa strony zerowej + 1323 2797 NoZpage + 1324 2797 E8 INX + 1325 2798 D0 EB BNE ClearLoop1 + 1326 279A A2 FF LDX #$FF + 1327 279C 9A TXS ; "wyzerowanie wskaznika STOSU + 1328 + 1329 ; a tutaj otwieramy kanal 1 CIO do odczytu + 1330 + 1331 279D A2 10 LDX #1*16 ; kanal 1 + 1332 279F A9 03 LDA #COPN ; rozkaz OPEN + 1333 27A1 9D 42 03 STA ICCOM,X ; COMMAND + 1334 27A4 A9 04 LDA #$04 ; READ + 1335 27A6 9D 4A 03 STA ICAUX1,X + 1336 27A9 A9 00 LDA #$00 + 1337 27AB 9D 4B 03 STA ICAUX2,X + 1338 27AE A9 BE LDA # FileToOpen + 1341 27B5 9D 45 03 STA ICBADR+1,X + 1342 27B8 20 56 E4 JSR CIO + 1343 + 1344 27BB 4C 4D 08 JMP loader.LoadStart ; po przepisaniu + 1345 27BE FileToOpen + 1346 27BE 23 1A 00 .BYTE "C:",0 + 1347 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba + 1348 ; na koniec odpowiednie zmodyfikowanie MEMLO + 1349 27C1 ADDspeedProc + 1350 27C1 AD 96 21 LDA USmode + 1351 27C4 F0 5F beq NoHappyLoader + 1352 ; wyznaczamy offset procedury + 1353 27C6 38 SEC + 1354 27C7 A9 26 LDA #HappyUSMovedProc + 1358 27D1 ED E8 02 SBC MEMLO+1 + 1359 27D4 8D 83 2C STA HappyOffset+1 + 1360 + 1361 27D7 A0 00 LDY #0 + 1362 27D9 A2 09 LDX #[$A-1] ;xjsrA - the last + 1363 ; relokujemy skoki pod offset z MEMLO + 1364 27DB HappyRelocate + 1365 27DB 38 SEC + 1366 27DC BD 6E 2C LDA xjsrTableL,x + 1367 27DF 85 32 STA SecBuffer + 1368 27E1 BD 78 2C LDA xjsrTableH,x + 1369 27E4 85 33 STA SecBuffer+1 + 1370 27E6 B1 32 LDA (SecBuffer),y + 1371 27E8 ED 82 2C SBC HappyOffset + 1372 27EB 91 32 STA (SecBuffer),y + 1373 27ED C8 INY + 1374 27EE B1 32 LDA (SecBuffer),y + 1375 27F0 ED 83 2C SBC HappyOffset+1 + 1376 27F3 91 32 STA (SecBuffer),y + 1377 27F5 88 DEY + 1378 27F6 CA DEX + 1379 27F7 10 E2 BPL HappyRelocate + 1380 + 1381 27F9 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] + 1382 27FB label72x + 1383 27FB BD 26 28 LDA HappyUSMovedProc,X + 1384 = 27FF TurboRelocADDR=*+1 + 1385 27FE 9D 00 0A STA $0A00,X + 1386 2801 CA DEX + 1387 2802 E0 FF CPX #$FF + 1388 2804 D0 F5 BNE label72x + 1389 2806 A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] + 1390 2808 A2 00 LDX #$00 + 1391 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. + 1392 280A label73 + 1393 280A 98 TYA + 1394 280B 18 CLC + 1395 280C 6D E7 02 ADC MEMLO + 1396 280F 8D E7 02 STA MEMLO + 1397 2812 8A TXA + 1398 2813 6D E8 02 ADC MEMLO+1 + 1399 2816 8D E8 02 STA MEMLO+1 + 1400 2819 AD FF 27 LDA TurboRelocADDR + 1401 281C 8D A6 07 STA loader.SioJMP+1 ; po przepisaniu + 1402 281F AD 00 28 LDA TurboRelocADDR+1 + 1403 2822 8D A7 07 STA loader.SioJMP+2 ; po przepisaniu + 1404 2825 NoHappyLoader + 1405 2825 60 RTS + 1406 + 1407 + 1408 + 1409 ; UWAGA !!!!!!!!!!!!!! + 1410 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! + 1411 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone + 1412 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! + 1413 2826 HappyUSMovedProc ; + 1414 + 1415 2826 AD 04 03 LDA DBUFA + 1416 2829 85 32 STA SecBuffer + 1417 282B AD 05 03 LDA DBUFA+1 + 1418 282E 85 33 STA SecBuffer+1 + 1419 + 1420 2830 AD 08 03 LDA DBYT + 1421 2833 85 31 STA SecLenUS + 1422 + 1423 2835 78 SEI + 1424 2836 BA TSX + 1425 2837 86 37 STX StackCopy + 1426 2839 A9 0D LDA #$0D + 1427 283B 85 34 STA CRETRYZ + 1428 ;command retry on zero page + 1429 283D CommandLoop + 1430 = 283E HappySpeed = *+1 + 1431 283D A9 28 LDA #$28 ;here goes speed from "?" + 1432 283F 8D 04 D2 STA AUDF3 + 1433 2842 A9 34 LDA #$34 + 1434 2844 8D 03 D3 STA PBCTL ;ustawienie linii command + 1435 2847 A2 80 LDX #$80 + 1436 2849 DelayLoopCmd + 1437 2849 CA DEX + 1438 284A D0 FD BNE DelayLoopCmd + 1439 284C 8E 06 D2 STX AUDF4 ; zero + 1440 284F 86 35 STX TransmitError + 1441 ; pokey init + 1442 2851 A9 23 LDA #$23 + 1443 2853 20 C7 28 xjsr1 JSR SecTransReg + 1444 ; + 1445 + 1446 2856 18 CLC + 1447 2857 AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + 1448 285A 6D 01 03 ADC DUNIT ; dodajemy numer stacji + 1449 285D 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + 1450 285F 85 30 STA CheckSum + 1451 2861 8D 0D D2 STA SEROUT + 1452 2864 AD 02 03 LDA DCOMND + 1453 2867 20 DD 28 xjsr2 JSR PutSIOByte + 1454 286A AD 0A 03 LDA DAUX1 + 1455 286D 20 DD 28 xjsr3 JSR PutSIOByte + 1456 2870 AD 0B 03 LDA DAUX2 + 1457 2873 20 DD 28 xjsr4 JSR PutSIOByte + 1458 2876 A5 30 LDA CheckSum + 1459 2878 20 DD 28 xjsr5 JSR PutSIOByte + 1460 + 1461 287B waitforEndOftransmission + 1462 287B AD 0E D2 LDA IRQST + 1463 287E 29 08 AND #$08 + 1464 2880 D0 F9 BNE waitforEndOftransmission + 1465 + 1466 2882 A9 13 LDA #$13 + 1467 2884 20 C7 28 xjsr6 JSR SecTransReg + 1468 + 1469 2887 A9 3C LDA #$3c + 1470 2889 8D 03 D3 STA PBCTL ;command line off + 1471 ; two ACK's + 1472 288C A0 02 LDY #2 + 1473 288E DoubleACK + 1474 288E 20 F9 28 xjsr7 JSR GetSIOByte + 1475 2891 C9 44 CMP #$44 + 1476 2893 B0 19 BCS ErrorHere + 1477 2895 88 DEY + 1478 2896 D0 F6 BNE DoubleACK + 1479 + 1480 ;ldy #0 + 1481 2898 84 30 STY CheckSum + 1482 289A ReadSectorLoop + 1483 289A 20 F9 28 xjsr8 JSR GetSIOByte + 1484 289D 91 32 STA (SecBuffer),y + 1485 289F 20 F1 28 xjsr9 JSR AddCheckSum + 1486 28A2 C8 INY + 1487 28A3 C4 31 CPY SecLenUS + 1488 28A5 D0 F3 BNE ReadSectorLoop + 1489 + 1490 28A7 20 F9 28 xjsrA JSR GetSIOByte + 1491 28AA C5 30 CMP CheckSum + 1492 28AC F0 0B BEQ EndOfTransmission + 1493 ;error!!! + 1494 28AE ErrorHere + 1495 28AE A0 90 LDY #$90 + 1496 28B0 84 35 STY TransmitError + 1497 28B2 A6 37 LDX StackCopy + 1498 28B4 9A TXS + 1499 28B5 C6 34 DEC CRETRYZ + 1500 28B7 D0 84 BNE CommandLoop + 1501 + 1502 28B9 EndOfTransmission + 1503 28B9 A9 00 LDA #0 + 1504 28BB 8D 07 D2 STA AUDC4 + 1505 28BE A5 10 LDA IRQENS + 1506 28C0 8D 0E D2 STA IRQEN + 1507 28C3 58 CLI + 1508 28C4 A4 35 LDY TransmitError + 1509 28C6 60 RTS + 1510 + 1511 28C7 SecTransReg + 1512 28C7 8D 0F D2 STA SKCTL + 1513 28CA 8D 0A D2 STA SKSTRES + 1514 28CD A9 38 LDA #$38 + 1515 28CF 8D 0E D2 STA IRQEN + 1516 28D2 A9 28 LDA #$28 + 1517 28D4 8D 08 D2 STA AUDCTL + 1518 28D7 A9 A8 LDA #$A8 + 1519 28D9 8D 07 D2 STA AUDC4 + 1520 28DC 60 RTS + 1521 + 1522 28DD PutSIOByte + 1523 28DD AA TAX + 1524 28DE waitforSerial + 1525 28DE AD 0E D2 LDA IRQST + 1526 28E1 29 10 AND #$10 + 1527 28E3 D0 F9 BNE waitforSerial + 1528 + 1529 28E5 8D 0E D2 STA IRQEN + 1530 28E8 A9 10 LDA #$10 + 1531 28EA 8D 0E D2 STA IRQEN + 1532 + 1533 28ED 8A TXA + 1534 28EE 8D 0D D2 STA SEROUT + 1535 + 1536 28F1 AddCheckSum + 1537 28F1 18 CLC + 1538 28F2 65 30 ADC CheckSum + 1539 28F4 69 00 ADC #0 + 1540 28F6 85 30 STA CheckSum + 1541 28F8 60 RTS + 1542 + 1543 28F9 GetSIOByte + 1544 28F9 A2 0A LDX #10 ;acktimeout + 1545 28FB ExternalLoop + 1546 28FB A9 00 LDA #0 + 1547 28FD 85 36 STA looperka + 1548 28FF InternalLoop + 1549 28FF AD 0E D2 LDA IRQST + 1550 2902 29 20 AND #$20 + 1551 2904 F0 09 BEQ ACKReceive + 1552 2906 C6 36 DEC looperka + 1553 2908 D0 F5 BNE InternalLoop + 1554 290A CA DEX + 1555 290B D0 EE BNE ExternalLoop + 1556 290D F0 9F BEQ ErrorHere + 1557 290F ACKReceive + 1558 ; zero we have now + 1559 290F 8D 0E D2 STA IRQST + 1560 2912 A9 20 LDA #$20 + 1561 2914 8D 0E D2 STA IRQST + 1562 2917 AD 0F D2 LDA SKSTAT + 1563 291A 8D 0A D2 STA SKSTRES + 1564 291D 29 20 AND #$20 + 1565 291F F0 8D BEQ ErrorHere + 1566 ; + 1567 2921 AD 0D D2 LDA SERIN + 1568 2924 60 RTS + 1569 2925 EndHappyUSProc + 1570 + 1571 + 1572 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler + 1573 2925 blokDanychIO_GetUSSpeed + 1574 2925 31 01 3F 40 .BY $31,$01,"?",$40 + 1575 2929 3E 28 .WO HappySpeed + 1576 292B 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A + 1577 2931 DirMapEnd + 1578 2931 4C FD 29 JMP label75 + 1579 2934 label39 + 1580 2934 85 DA STA $DA + 1581 2936 A5 D0 LDA CurrentFileInfoBuff + 1582 2938 85 DB STA $DB + 1583 293A A5 D1 LDA CurrentFileInfoBuff+1 + 1584 293C 85 DC STA $DC + 1585 293E 20 B1 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 1586 2941 F0 05 BEQ DiscNotChanged2 + 1587 2943 68 PLA + 1588 2944 68 PLA + 1589 2945 4C 48 22 JMP ReadMainDir + 1590 2948 DiscNotChanged2 + 1591 ; odczyt sektora mapy wskazywanego przez DirMapSec + 1592 2948 A5 D2 LDA DirMapSect + 1593 294A 8D AD 2A STA blokDanychIO+10 + 1594 294D A5 D3 LDA DirMapSect+1 + 1595 294F 8D AE 2A STA blokDanychIO+11 + 1596 2952 0D AD 2A ORA blokDanychIO+10 + 1597 2955 F0 DA BEQ DirMapEnd + 1598 2957 A2 2D LDX #>DirMapSectorBuff + 1599 2959 A0 80 LDY #DirMapSectorBuff ; -- + 1625 2985 65 E3 ADC InMapPointer+1 ; -- + 1626 2987 85 E5 STA TempZP+1 ; -- + 1627 2989 B1 E4 LDA (TempZP),Y + 1628 298B 8D AD 2A STA blokDanychIO+10 + 1629 298E C8 INY + 1630 298F B1 E4 LDA (TempZP),Y + 1631 2991 8D AE 2A STA blokDanychIO+11 + 1632 2994 0D AD 2A ORA blokDanychIO+10 + 1633 2997 F0 64 BEQ label75 + 1634 ; i zwiekszenie wskaznika mapy o 2 + 1635 2999 C8 INY + 1636 299A 84 E2 STY InMapPointer + 1637 299C D0 02 BNE NoIncH ; -- + 1638 299E E6 E3 INC InMapPointer+1 ; -- + 1639 29A0 NoIncH + 1640 29A0 AD E5 02 LDA MEMTOP + 1641 29A3 38 SEC + 1642 29A4 E5 D0 SBC CurrentFileInfoBuff + 1643 29A6 AD E6 02 LDA MEMTOP+1 + 1644 29A9 E5 D1 SBC CurrentFileInfoBuff+1 + 1645 29AB F0 50 BEQ label75 + 1646 29AD A4 D0 LDY CurrentFileInfoBuff + 1647 29AF A6 D1 LDX CurrentFileInfoBuff+1 + 1648 29B1 20 75 2A JSR ReadSector + 1649 29B4 A5 D4 LDA $D4 + 1650 29B6 05 D5 ORA $D5 + 1651 29B8 D0 16 BNE label79 + 1652 29BA A0 03 LDY #$03 + 1653 29BC B1 D0 LDA (CurrentFileInfoBuff),Y + 1654 29BE 85 D4 STA $D4 + 1655 29C0 C8 INY + 1656 29C1 B1 D0 LDA (CurrentFileInfoBuff),Y + 1657 29C3 85 D5 STA $D5 + 1658 29C5 C8 INY + 1659 29C6 B1 D0 LDA (CurrentFileInfoBuff),Y + 1660 29C8 F0 06 BEQ label79 + 1661 29CA A9 FF LDA #$FF + 1662 29CC 85 D4 STA $D4 + 1663 29CE 85 D5 STA $D5 + 1664 29D0 label79 + 1665 29D0 A5 D0 LDA CurrentFileInfoBuff + 1666 29D2 18 CLC + 1667 29D3 6D B3 20 ADC .adr loader.SecLen ; przed przepisaniem + 1668 29D6 85 D0 STA CurrentFileInfoBuff + 1669 29D8 A5 D1 LDA CurrentFileInfoBuff+1 + 1670 29DA 6D B4 20 ADC .adr loader.SecLen+1 ; przed przepisaniem + 1671 29DD 85 D1 STA CurrentFileInfoBuff+1 + 1672 29DF A5 D4 LDA $D4 + 1673 29E1 38 SEC + 1674 29E2 ED B3 20 SBC .adr loader.SecLen ; przed przepisaniem + 1675 29E5 85 D4 STA $D4 + 1676 29E7 A5 D5 LDA $D5 + 1677 29E9 ED B4 20 SBC .adr loader.SecLen+1 ; przed przepisaniem + 1678 29EC 85 D5 STA $D5 + 1679 29EE B0 80 BCS label80 + 1680 29F0 A5 D0 LDA CurrentFileInfoBuff + 1681 29F2 18 CLC + 1682 29F3 65 D4 ADC $D4 + 1683 29F5 85 D0 STA CurrentFileInfoBuff + 1684 29F7 A5 D1 LDA CurrentFileInfoBuff+1 + 1685 29F9 65 D5 ADC $D5 + 1686 29FB 85 D1 STA CurrentFileInfoBuff+1 + 1687 29FD label75 + 1688 29FD A5 DC LDA $DC + 1689 29FF C5 D1 CMP CurrentFileInfoBuff+1 + 1690 2A01 90 0B BCC label81 + 1691 2A03 D0 17 BNE label82 + 1692 2A05 A5 DB LDA $DB + 1693 2A07 C5 D0 CMP CurrentFileInfoBuff + 1694 2A09 90 03 BCC label81 + 1695 2A0B D0 0F BNE label82 + 1696 2A0D 60 RTS + 1697 2A0E label81 + 1698 2A0E A5 DB LDA $DB + 1699 2A10 18 CLC + 1700 2A11 65 DA ADC $DA + 1701 2A13 85 DB STA $DB + 1702 2A15 90 E6 BCC label75 + 1703 2A17 E6 DC INC $DC + 1704 2A19 4C FD 29 JMP label75 + 1705 2A1C label82 + 1706 2A1C A5 DB LDA $DB + 1707 2A1E 38 SEC + 1708 2A1F E5 DA SBC $DA + 1709 2A21 85 D0 STA CurrentFileInfoBuff + 1710 2A23 A5 DC LDA $DC + 1711 2A25 E9 00 SBC #$00 + 1712 2A27 85 D1 STA CurrentFileInfoBuff+1 + 1713 2A29 60 RTS + 1714 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora + 1715 2A2A ReadPERCOM + 1716 2A2A A9 04 LDA #$04 + 1717 2A2C 8D AF 2A STA DiskRetryCount + 1718 2A2F ReadPERCOMretry + 1719 2A2F A0 53 LDY #blokDanychIO_PERCOM + 1721 2A33 20 4B 2B JSR Table2DCB + 1722 2A36 20 40 2B JSR GoSIO + 1723 2A39 30 08 BMI PercomError + 1724 ; blok odczytany - ustawmy dlugosc 1 sektora + 1725 2A3B AD 94 2C LDA PERCOMdata+6 + 1726 2A3E C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + 1727 2A40 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + 1728 2A42 60 RTS + 1729 2A43 PercomError + 1730 2A43 CE AF 2A DEC DiskRetryCount + 1731 2A46 D0 E7 BNE ReadPERCOMretry + 1732 ; blok nieodczytany - dlugosc 1 sektora na $80 + 1733 2A48 Set1Sect128 + 1734 2A48 A9 00 LDA #$00 + 1735 2A4A 8D 94 2C STA PERCOMdata+6 + 1736 2A4D A9 80 LDA #$80 + 1737 2A4F 8D 95 2C STA PERCOMdata+7 + 1738 2A52 60 RTS + 1739 2A53 blokDanychIO_PERCOM + 1740 2A53 31 01 4E 40 .BY $31,$01,$4E,$40 + 1741 2A57 8E 2C .WO PERCOMdata + 1742 2A59 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 + 1743 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) + 1744 2A5F ReadFirstSect + 1745 2A5F A9 01 LDA #$01 + 1746 2A61 8D AD 2A STA blokDanychIO+10 + 1747 2A64 A9 00 LDA #$00 + 1748 2A66 8D AE 2A STA blokDanychIO+11 + 1749 2A69 AD 94 2C LDA PERCOMdata+6 + 1750 2A6C 8D AC 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1751 2A6F AD 95 2C LDA PERCOMdata+7 + 1752 2A72 4C 7E 2A JMP ReadSector1 + 1753 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) + 1754 ; reszta danych jak nizej (A nie wazne) + 1755 2A75 ReadSector + 1756 2A75 AD B4 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + 1757 2A78 8D AC 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1758 2A7B AD B3 20 LDA .adr loader.SecLen ; przed przepisaniem + 1759 2A7E ReadSector1 + 1760 2A7E 8D AB 2A STA blokDanychIO+8 + 1761 2A81 8E A8 2A STX blokDanychIO+5 + 1762 2A84 8C A7 2A STY blokDanychIO+4 + 1763 2A87 A9 04 LDA #$04 + 1764 2A89 8D AF 2A STA DiskRetryCount + 1765 2A8C DiskReadRetry + 1766 2A8C A0 A3 LDY #blokDanychIO + 1768 2A90 20 4B 2B JSR Table2DCB + 1769 2A93 20 40 2B JSR GoSIO + 1770 2A96 30 01 BMI label85 + 1771 2A98 60 RTS + 1772 2A99 label85 + 1773 2A99 CE AF 2A DEC DiskRetryCount + 1774 2A9C D0 EE BNE DiskReadRetry + 1775 2A9E 68 PLA + 1776 2A9F 68 PLA + 1777 2AA0 4C 07 22 JMP ErrorDisplay + 1778 2AA3 blokDanychIO + 1779 2AA3 31 01 52 40 .BY $31,$01,$52,$40 + 1780 2AA7 80 2D .WO DirMapSectorBuff + 1781 2AA9 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 + 1782 2AAF DiskRetryCount + 1783 2AAF 00 .BY $00 + 1784 2AB0 PrintXY + 1785 2AB0 68 PLA + 1786 2AB1 85 C8 STA $C8 + 1787 2AB3 68 PLA + 1788 2AB4 85 C9 STA $C9 + 1789 2AB6 A9 00 LDA #$00 + 1790 2AB8 85 DF STA $DF + 1791 2ABA 20 32 2B JSR label87 + 1792 2ABD 48 PHA + 1793 2ABE 20 32 2B JSR label87 + 1794 2AC1 85 DE STA $DE + 1795 2AC3 0A ASL + 1796 2AC4 0A ASL + 1797 2AC5 18 CLC + 1798 2AC6 65 DE ADC $DE + 1799 2AC8 0A ASL + 1800 2AC9 0A ASL + 1801 2ACA 26 DF ROL $DF + 1802 2ACC 0A ASL + 1803 2ACD 26 DF ROL $DF + 1804 2ACF 18 CLC + 1805 2AD0 65 58 ADC SAVMSC + 1806 2AD2 85 DE STA $DE + 1807 2AD4 A5 DF LDA $DF + 1808 2AD6 65 59 ADC SAVMSC+1 + 1809 2AD8 85 DF STA $DF + 1810 2ADA 68 PLA + 1811 2ADB A8 TAY + 1812 2ADC label92 + 1813 2ADC 20 32 2B JSR label87 + 1814 2ADF C9 00 CMP #$00 + 1815 2AE1 F0 48 BEQ label88 + 1816 2AE3 C9 7D CMP #$7D + 1817 2AE5 F0 21 BEQ label89 + 1818 2AE7 A2 00 LDX #$00 + 1819 2AE9 86 E0 STX $E0 + 1820 2AEB C9 80 CMP #$80 + 1821 2AED 66 E0 ROR $E0 + 1822 2AEF 29 7F AND #$7F + 1823 2AF1 C9 20 CMP #$20 + 1824 2AF3 B0 04 BCS label90 + 1825 2AF5 09 40 ORA #$40 + 1826 2AF7 D0 07 BNE label91 + 1827 2AF9 label90 + 1828 2AF9 C9 60 CMP #$60 + 1829 2AFB B0 03 BCS label91 + 1830 2AFD 38 SEC + 1831 2AFE E9 20 SBC #$20 + 1832 2B00 label91 + 1833 2B00 05 E0 ORA $E0 + 1834 2B02 91 DE STA ($DE),Y + 1835 2B04 C8 INY + 1836 2B05 4C DC 2A JMP label92 + 1837 2B08 label89 + 1838 2B08 98 TYA + 1839 2B09 48 PHA + 1840 2B0A A5 58 LDA SAVMSC + 1841 2B0C 85 E0 STA $E0 + 1842 2B0E A9 03 LDA #$03 + 1843 2B10 AA TAX + 1844 2B11 18 CLC + 1845 2B12 65 59 ADC SAVMSC+1 + 1846 2B14 85 E1 STA $E1 + 1847 2B16 A0 BF LDY #$BF + 1848 2B18 A9 00 LDA #$00 + 1849 2B1A label93 + 1850 2B1A 91 E0 STA ($E0),Y + 1851 2B1C 88 DEY + 1852 2B1D C0 FF CPY #$FF + 1853 2B1F D0 F9 BNE label93 + 1854 2B21 C6 E1 DEC $E1 + 1855 2B23 CA DEX + 1856 2B24 10 F4 BPL label93 + 1857 2B26 68 PLA + 1858 2B27 A8 TAY + 1859 2B28 4C DC 2A JMP label92 + 1860 2B2B label88 + 1861 2B2B A5 C9 LDA $C9 + 1862 2B2D 48 PHA + 1863 2B2E A5 C8 LDA $C8 + 1864 2B30 48 PHA + 1865 2B31 60 RTS + 1866 2B32 label87 + 1867 2B32 E6 C8 INC $C8 + 1868 2B34 D0 02 BNE label94 + 1869 2B36 E6 C9 INC $C9 + 1870 2B38 label94 + 1871 2B38 A2 00 LDX #$00 + 1872 2B3A A1 C8 LDA ($C8,X) + 1873 2B3C 60 RTS + 1874 2B3D GoErrorDisp + 1875 2B3D 4C 07 22 JMP ErrorDisplay + 1876 ; Skok do Sio lub procedury Turbo + 1877 2B40 GoSIO + 1878 2B40 AC 96 21 LDY USmode + 1879 2B43 F0 03 BEQ StandardSpeed + 1880 2B45 4C 26 28 JMP HappyUSMovedProc ; mozna skakac do tej procki + 1881 2B48 StandardSpeed + 1882 2B48 4C 59 E4 JMP JSIOINT + 1883 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) + 1884 ; do bloku kontroli transmisji szeregowej DCB + 1885 2B4B Table2DCB + 1886 2B4B 8C 54 2B STY IOtableAddr+1 + 1887 2B4E 8E 55 2B STX IOtableAddr+2 + 1888 2B51 A2 0B LDX #$0B + 1889 2B53 IOtableAddr + 1890 2B53 BD FF FF LDA $FFFF,X + 1891 2B56 9D 00 03 STA DDEVIC,X + 1892 2B59 CA DEX + 1893 2B5A 10 F7 BPL IOtableAddr + 1894 2B5C 60 RTS + 1895 2B5D Close1 + 1896 2B5D A2 10 LDX #$10 + 1897 2B5F CloseX + 1898 2B5F A9 0C LDA #$0C + 1899 2B61 9D 42 03 STA ICCMD,X + 1900 2B64 4C 56 E4 JMP JCIOMAIN + 1901 2B67 GetKey + 1902 2B67 A2 10 LDX #$10 + 1903 2B69 A9 03 LDA #$03 + 1904 2B6B 9D 42 03 STA ICCMD,X + 1905 2B6E A9 04 LDA #$04 + 1906 2B70 9D 4A 03 STA ICAX1,X + 1907 2B73 A9 00 LDA #$00 + 1908 2B75 9D 4B 03 STA ICAX2,X + 1909 2B78 9D 49 03 STA ICBUFL+1,X + 1910 2B7B A9 FF LDA #$FF + 1911 2B7D 9D 48 03 STA ICBUFL,X + 1912 2B80 A9 AE LDA #Kdriver + 1915 2B87 9D 45 03 STA ICBUFA+1,X + 1916 2B8A 20 56 E4 JSR JCIOMAIN + 1917 2B8D 30 1C BMI GKeyError + 1918 2B8F A2 10 LDX #$10 + 1919 2B91 A9 00 LDA #$00 + 1920 2B93 9D 48 03 STA ICBUFL,X + 1921 2B96 9D 49 03 STA ICBUFL+1,X + 1922 2B99 A9 07 LDA #$07 + 1923 2B9B 9D 42 03 STA ICCMD,X + 1924 2B9E 20 56 E4 JSR JCIOMAIN + 1925 2BA1 30 08 BMI GKeyError + 1926 2BA3 48 PHA + 1927 2BA4 20 5D 2B JSR Close1 + 1928 2BA7 30 02 BMI GKeyError + 1929 2BA9 68 PLA + 1930 2BAA 60 RTS + 1931 2BAB GKeyError + 1932 2BAB 4C 3D 2B JMP GoErrorDisp + 1933 2BAE Kdriver + 1934 2BAE 4B 3A 9B .BY "K:",$9B + 1935 2BB1 DiscChangeCheck + 1936 2BB1 A0 80 LDY #DirMapSectorBuff + 1938 2BB5 20 5F 2A JSR ReadFirstSect + 1939 2BB8 A2 7F LDX #$7F + 1940 2BBA label98 + 1941 2BBA BD 00 2D LDA FirstSectorBuff,X + 1942 2BBD DD 80 2D CMP DirMapSectorBuff,X + 1943 2BC0 D0 05 BNE ChangedD + 1944 2BC2 CA DEX + 1945 2BC3 10 F5 BPL label98 + 1946 2BC5 A9 00 LDA #$00 + 1947 2BC7 ChangedD + 1948 2BC7 60 RTS + 1949 ; obsluga gwiazdki + 1950 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * + 1951 ; w Y jest ) - X moze lepiej nie ruszac :) + 1952 2BC8 Asteriks + 1953 2BC8 A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + 1954 2BCA 20 E6 2B JSR GetHexNumber + 1955 2BCD 8D C5 02 STA COLPF1S ; literki + 1956 2BD0 C8 INY + 1957 2BD1 20 E6 2B JSR GetHexNumber + 1958 2BD4 8D C6 02 STA COLPF2S ; tlo + 1959 2BD7 C8 INY + 1960 2BD8 20 E6 2B JSR GetHexNumber + 1961 2BDB 8D C8 02 STA COLBAKS ; ramka + 1962 2BDE C8 INY + 1963 2BDF 20 E6 2B JSR GetHexNumber + 1964 2BE2 8D 9A 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + 1965 2BE5 60 RTS + 1966 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX + 1967 ; i zamienia na bajt w A + 1968 2BE6 GetHexNumber + 1969 2BE6 20 F6 2B JSR GetHEX4bits + 1970 2BE9 0A ASL + 1971 2BEA 0A ASL + 1972 2BEB 0A ASL + 1973 2BEC 0A ASL + 1974 2BED 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + 1975 2BEF C8 INY + 1976 2BF0 20 F6 2B JSR GetHEX4bits + 1977 2BF3 05 E4 ORA TempZP + 1978 2BF5 60 RTS + 1979 2BF6 GetHEX4bits + 1980 2BF6 B1 D4 LDA ($D4),Y + 1981 2BF8 38 SEC + 1982 2BF9 E9 30 SBC #'0' + 1983 2BFB C9 0A CMP #$0A ; sprawdzmy czy cyfra + 1984 2BFD 90 02 BCC IsNumber + 1985 2BFF E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow + 1986 2C01 IsNumber + 1987 2C01 60 RTS + 1988 ; Ustawia numer satcji wg A + 1989 2C02 SeTDriveNR + 1990 2C02 C9 09 CMP #$09 + 1991 2C04 B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + 1992 2C06 20 24 2C JSR SeTblokDanychDrive + 1993 2C09 18 CLC + 1994 2C0A 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + 1995 2C0C 8D 49 23 STA DriveDisp1 + 1996 2C0F A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu + 1997 2C11 8D 48 23 STA DriveDisp1-1 + 1998 2C14 60 RTS + 1999 2C15 SeTDriveLetter + 2000 2C15 20 24 2C JSR SeTblokDanychDrive + 2001 2C18 18 CLC + 2002 2C19 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + 2003 2C1B 8D 49 23 STA DriveDisp1 + 2004 2C1E A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + 2005 2C20 8D 48 23 STA DriveDisp1-1 + 2006 2C23 60 RTS + 2007 2C24 SeTblokDanychDrive + 2008 2C24 8D AC 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + 2009 2C27 8D A4 2A STA blokDanychIO+1 + 2010 2C2A 8D 26 29 STA blokDanychIO_GetUSSpeed+1 + 2011 2C2D 8D 54 2A STA blokDanychIO_PERCOM+1 + 2012 2C30 60 RTS + 2013 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku + 2014 2C31 MEMLOprint + 2015 2C31 AD E7 02 LDA MEMLO + 2016 2C34 48 PHA + 2017 2C35 4A LSR + 2018 2C36 4A LSR + 2019 2C37 4A LSR + 2020 2C38 4A LSR + 2021 2C39 20 9C 21 JSR bin2AsciiHex + 2022 2C3C 8D 6A 2C STA MEMLOvalue+2 + 2023 2C3F 68 PLA + 2024 2C40 20 9C 21 JSR bin2AsciiHex + 2025 2C43 8D 6B 2C STA MEMLOvalue+3 + 2026 2C46 AD E8 02 LDA MEMLO+1 + 2027 2C49 48 PHA + 2028 2C4A 4A LSR + 2029 2C4B 4A LSR + 2030 2C4C 4A LSR + 2031 2C4D 4A LSR + 2032 2C4E 20 9C 21 JSR bin2AsciiHex + 2033 2C51 8D 68 2C STA MEMLOvalue + 2034 2C54 68 PLA + 2035 2C55 20 9C 21 JSR bin2AsciiHex + 2036 2C58 8D 69 2C STA MEMLOvalue+1 + 2037 2C5B 20 B0 2A JSR PrintXY + 2038 2C5E 1C 17 .BY 28,23 + 2039 2C60 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" + 2040 2C68 MEMLOvalue + 2041 2C68 30 30 30 30 .BY "0000" + 2042 2C6C 00 .BY $00 + 2043 2C6D 60 RTS + 2044 + 2045 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo + 2046 + 2047 2C6E xjsrTableL + 2048 2C6E 54 68 6E .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + 2049 2C71 74 79 .BY <[xjsr4+1],<[xjsr5+1] + 2050 2C73 85 8F 9B .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + 2051 2C76 A0 A8 .BY <[xjsr9+1],<[xjsrA+1] + 2052 2C78 xjsrTableH + 2053 2C78 28 28 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + 2054 2C7B 28 28 .BY >[xjsr4+1],>[xjsr5+1] + 2055 2C7D 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + 2056 2C80 28 28 .BY >[xjsr9+1],>[xjsrA+1] + 2057 ; miejsce na wyliczony offset o jaki przesuwamy procedure + 2058 2C82 HappyOffset + 2059 2C82 00 00 .WO $0000 + 2060 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) + 2061 2C84 DensityCodes + 2062 2C84 F3 E4 F1 .by +$80,"sdq" + 2063 ;.by "SDQ" + 2064 ;.by $0e,$15,$a0 + 2065 2C87 ONtext + 2066 2C87 CF CE A0 .BY +$80,"ON " + 2067 2C8A OFFtext + 2068 2C8A CF C6 C6 .BY +$80,"OFF" + 2069 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) + 2070 2C8D PDVMASKtemp + 2071 2C8D 00 .BY $00 + 2072 ; miejsce na blok PERCOM + 2073 2C8E PERCOMdata + 2074 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie + 2075 = 2C9A FirstSectorsTable=*+12 ; omijamy 12b na percom + 2076 ; zostawiamy $30 bajtow wolnego + 2077 + 2078 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow + 2079 = 2D00 ProgramEnd=FirstSectorBuff + 2080 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu + 2081 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu + 2082 2C8E FirstRun + 2083 ; odnotowujemy stan Shift z Bootowania + 2084 2C8E AD 0F D2 LDA SKSTAT + 2085 2C91 29 08 and #$08 + 2086 2C93 D0 03 BNE NoSHIFTboot + 2087 2C95 8D 99 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 + 2088 2C98 NoSHIFTboot + 2089 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie + 2090 2C98 AD 01 D3 LDA PORTB + 2091 2C9B 29 02 AND #$02 + 2092 2C9D D0 0B BNE BrakBasica + 2093 ; jest Basic + 2094 2C9F A0 02 LDY #$2 + 2095 2CA1 BASstatprint + 2096 2CA1 B9 87 2C LDA ONtext,y + 2097 2CA4 99 64 23 STA BASstatus,y + 2098 2CA7 88 DEY + 2099 2CA8 10 F7 bpl BASstatprint + 2100 2CAA BrakBasica + 2101 ; Sprawdzamy istnienie QMEGa + 2102 2CAA A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy + 2103 2CAC testQMEGloop + 2104 2CAC B9 01 C0 LDA $C001,y + 2105 2CAF D9 DF 2C CMP QMEGstring,y + 2106 2CB2 D0 13 bne brakQMEGa + 2107 2CB4 88 dey + 2108 2CB5 10 F5 bpl testQMEGloop + 2109 ; jest QMEG + 2110 2CB7 A9 00 LDA #0 + 2111 2CB9 8D 97 21 STA QMEG + 2112 2CBC A0 02 LDY #$2 + 2113 2CBE Qstatprint + 2114 2CBE B9 87 2C LDA ONtext,y + 2115 2CC1 99 5C 23 STA QMEGstatus,y + 2116 2CC4 88 DEY + 2117 2CC5 10 F7 bpl Qstatprint + 2118 2CC7 brakQMEGa + 2119 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi + 2120 2CC7 AD 00 03 LDA DDEVIC + 2121 2CCA 18 clc + 2122 2CCB 6D 01 03 ADC DUNIT + 2123 2CCE 38 sec + 2124 2CCF E9 01 SBC #$01 + 2125 2CD1 29 0F AND #$0F ; zapamietanie numeru urzadzenia + 2126 2CD3 8D 98 21 STA BootDrive + 2127 2CD6 20 02 2C JSR SeTDriveNR + 2128 2CD9 20 AB 21 JSR EditorOpen + 2129 2CDC 4C D9 21 JMP mainprog + 2130 2CDF QMEGstring + 2131 2CDF 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 + 2132 2CE7 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" + 2133 ;.OPT List + 2134 + 2135 + 2136 = 0080 MAPCOUNTER + 2136 = 0082 COMPRESSEDMAPCOUNTER + 2136 = 0084 MAPCOUNTERMEM + 2136 = 0086 PREVFILESECTOR + 2136 = 0088 MAPPOSITIONMEM + 2136 = 008A SECTOROFFSET + 2136 = 008C SECTORSCOUNTER + 2136 org $02e0 + 2137 02E0-02E1> 0D 27 .WO LoaderGo + 2138 ; .WO START + 2139 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) + 2140 ; OPT h- + 2141 ; org $0000 + 2142 ; .WO $0000 + 2143 diff --git a/loaderFN.xex b/loaderFN.xex new file mode 100644 index 0000000000000000000000000000000000000000..dd6d49522ca12e9acd56de95f68de4a95fb64b5f GIT binary patch literal 3423 zcmai0e{fSp9^bsQeQBW3o`b~GJ2!3Gruk7q1?_cc544Pd2H_|;>Ud+2MiXr*7I5?r zB?Y$hxIV7Th(fuX&m0f?N?%O|)YGvFC#`vr!nRF?@R52Jp-enKUO>;r3+XAvkKbiO|G;0ep>YsROlp(wuD!$rr*$7> z14tXqzK$Oqb13e)nw1Nybb91R2u&fD{$fhQ(kyYzDQAO z8FuPCTk7896p@m3;wyIQZI)`M-eIW&KcM4LxZJ@iv$(HVdZB2uq3&&#dz)=d^0R>- zE{9=?zQf`+*4r-XxMx`IJR3wim+F)~@p8COg&VZ$oM5C$hI>pWqP-|HLcgDSOea02 z>x(n3SEM+@J+JE=XH=fQ`AC9(C+*e|vzXw1V5SzZU58ldFv~5~x$b0UA!K5C7T7 z73X?YGA9>@EC{`{c;(9FE3qA$91fJ!x9bOHQu!Vfm-ZMjV{;7~vBeU!^Pr(c!ge`F z(aBgzlZ|wL5J`929cdjRn&b}QoriJvHXHX~UT3DgOK%r7T$^#*K+~W&hxC(AML(e= z3M%e1k{B5hXXANA0wu?Ve$po*a*CW5qJ#>cl76ATr>|8N<%l8+^}uRG#McL3;G# zp0Wq(*KPEz+vLG`Fe3NHti{E}57lF*?`bctUhnbLsB4+oJ%b;YEvl`>Px)#+8!-N` zY}p#$I$Y^%D8~4Mvehf>l}lC@BT#wxroC1t?X_IBm$D?7E8;-N6wUrVWi{x7&8`c> z2Hzr1G6|=tEos<0u zT?|Y&BnMevgU_d~+4zC)maHk;5N*k}9Mv&V;pVfnVu{jQ0; zpUuKZjR7Vc?P$)4D))t>?XH(|rI`aoI+}qG8f*0^h?-7MHl1=g@`TUm4cDSPRh?PC zQeR;P5ZBWD_-E2SBV?mvTra~#7%|HAF!*U}(Pm{ru25c=7bt&`Usl@WJCy?v8Sly2 zp$t4r4IFuHYnJ?*P-f|6M=Fx!HLc8LTzYv?&v59VzN5R%Mq=IjY-C6^AQ*oZXd3Hi z4#!k27gVplUw!2Y9JVT2xQ5hbRM?d6T8MP;@)%cTBFcG9F$Vkg^y0;7?%h#ACh5d9uMX%_9CM)HRs;x%tH=QJx1 zm%hn#B@h1uyi7lgU9T3vKt#}m%QdS+ zlOix8O%Z6e8w9_PA%1X&Mxn9qFsA8(zwZ!+%g!s1{PwIyyRsN4+)!$?!}b1ijYctz z_+gdPAZ+pZxvK@jR^J@%T7j2KB;s2jXK!^2Eed;6FE?nyqn1iW)R4?B#Ew)`E%%*P zoJ*#Qg(ORQkl{F+YvY*2LHc40VpZKC%uO()T-4Pa#@r-BDg-D5y%oLX25Exf5`}6h zKxXkd5HLovz=d?(2nP_`jf?>V)$nV4v=Gm=1<{TG(gaXi0Hp^|#t2+>H=3kh1QTt+ z>{O~xgH)f)^WukUk}pgpdDk*s-Y<~^>HLXOvET}vxy2@$ufVBWA#j74rQPdnq@?== z8@VT3a%GEcS4jluR-h2(mx4ca7nlP`A00{1t9&Ae_896w#00aW4kS!6QlgMMz)Hx> zy~(E`s2=wfu{Ll9{$8^kdU@c zqxB_-gUcF_7%e_;mh{PXn%W8ubz+7ZVK>CvV1u{-gzyZ$VU{aHcQn&$+Z@o}Rf4}Z zM~=;<-@u^90cERo+x!Ffwe`-U+n`FY141@8W8jhf^WEIc0Zu<4mckH}(hZ31z;$=1 zM`Y6*>a4nQ2Pk9kI3R61+(A7!^u6i=tYr4yORq-hl=8Z|5<>$K1oD8zNm&DcJbt^d z!VF~@A-(IzB60?b(pjhn=hUc6_j)1jgaPnCVGtZJOR^|upceWen7}c~0Qe;t1Yf)a z2afK)bo>yetS}0$tVE&UjTs=0M#*@1EE%L@Hzm|Wwp{`j9hJtJ(s2slVZ2{iv7a93 z2dP3VeTd%9YyW52q6TnGC|&*Fl~5;RrB`4W6Naw9a46)5yyuCjY|jvI&-L`TPNTDh zvpuv`OJ}-;vj)!@a<(-dKL_^|&X$g!fwku@L!EPrY1~^DzB*`8p~OO~LnpmrlQl|) z`@~xoIswn|icR!$yKP{thZgR%>Ctqs7Zi92QVLuOR&$*eX}8VwvPFV`fj$J#LCel| zOUs*da60S)~odVOcxhn4S+g02L_V<#Am&jnr3%JDUgg^OQuQzz0DYyVXgXaurZ6g6tF`PIp|zuW}H*5pjcZoe+LnSAp5}=vd1t z>(13yfUSu{3bwi-ey0Oeb3HuvUy-aLwuB1by3~la-h^#;!8!!9Dwl@BkQ5iux>dsG!vU_249F;z8U-aI!dzss3jYO2d*WmO literal 0 HcmV?d00001 From d9e8f3269cb1437928adefb1e5daebc887cb5414 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 13 May 2024 15:36:29 +0200 Subject: [PATCH 4/9] Better (?) loader --- loaderFN.asm | 203 +-- loaderFN.lab | 485 +++--- loaderFN.lst | 4031 ++++++++++++++++++++++++-------------------------- loaderFN.xex | Bin 3423 -> 3318 bytes 4 files changed, 2255 insertions(+), 2464 deletions(-) diff --git a/loaderFN.asm b/loaderFN.asm index 8fbbe70..79803ca 100644 --- a/loaderFN.asm +++ b/loaderFN.asm @@ -82,8 +82,10 @@ IRQENS = $10 InBlockAddr = $24 ; word ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) ToBlockEnd = $26 ; word +BlockLen= $26 ; word ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH ToFileEndL = $28 +BlockATemp = $28 CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku CheckSUM = $30 @@ -214,23 +216,35 @@ FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku b STA ToFileEndL PLA TAX -FileNextBlock ; wczytanie kolejnego bloku binarnego - JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) - AND InBlockAddr +FileNextBlock + ; wczytanie kolejnego bloku binarnego + JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) + CPY #$88 ; czy EOF + jeq EndOfFile + LDA InBlockAddr + AND InBlockAddr+1 CMP #$FF ; jesli oba sa $FF to..... BNE FileNoFFFFHead JSR FileGetBlockStart ; pobranie jeszcze raz FileNoFFFFHead - JSR FileGetByte ; Pobranie adresu konca ladowanego bloku - SBC InBlockAddr ; i wyliczenie jego dlugosci - EOR #$FF ; UWAGA! Dlugosc jest zEORowana z $FFFF - STA ToBlockEnd ; czyli odjeta od $10000 - PHP ; odliczanie ilosci pobranych bajtow jest wiec potem robione - JSR FileGetByte ; przez dodawanie i sprawdzanie czy nie ZERO - PLP - SBC InBlockAddr+1 - EOR #$FF - STA ToBlockEnd+1 + mwa InBlockAddr BlockATemp ; zapamietanie adresu poczatkowego bloku (na chwile) + LDA #BlockLen + sta InBlockAddr+1 + JSR GetFile2Bytes ; pobranie dwoch bajtow - ; Pobranie adresu konca ladowanego bloku + CPY #$88 ; czy EOF + beq EndOfFile + ; wyliczenie długości bloku programu binarnego + sec + lda BlockLen + sbc BlockATemp + sta BlockLen + lda BlockLen+1 + sbc BlockATemp+1 + sta BlockLen+1 + inw BlockLen + mwa BlockATemp InBlockAddr ; odtworzenie adresu poczatkowego bloku SEC WhatIsIt BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y @@ -245,57 +259,23 @@ FileNoFirstBlock STA $02E2 ; bo po kazdym bloku odbywa sie tam skok LDA #>Jrts ; jesli nie jest to blok z adresem inicjacji STA $02E3 ; to dzieki temu nic sie nie stanie - LDY #$00 + BlockReadLoop ;; petla odczytujaca z pliku blok binarny - INC ToFileEndL ;; zwiekszenie licznika bajtow w calym pliku i jesli ZERO - BEQ GoCheckEOF ;; skok do procedury sprawdzajacej dwa starsze jego bajty - CPX SecLen ;; sprawdzenie czy juz caly sektor przepisany jesli tak - bne NoNextSector1 ; -- - lda InSectorCountH ; -- obsluga sektorow ponad 256b - cmp SecLen+1 ; -- - BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora -NoNextSector1 -FileSecBuffHaddr1 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! - LDA FileSecBuff,X - INX - bne InBlockReadLoop ; -- - jsr IncrementationXH ; -- obsluga sektorow ponad 256b (ten trik dziala bo tam juz byl RTS :) ) -InBlockReadLoop - STA (InBlockAddr),Y - INY - BNE label15 - INC InBlockAddr+1 -label15 - INC ToBlockEnd - BNE BlockReadLoop - INC ToBlockEnd+1 - BNE BlockReadLoop - BEQ FileInit ; koniec bloku - skok pod adres inicjalizacji -GoCheckEOF - JSR CheckEOF ; skok do procedury wspolnej dla pobierania bloku i bajtu - BCS InBlockReadLoop ;tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli -GoGetNextFileSect - JSR GetNextFileSect - BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli + JSR GetFileBytes + CPY #$88 ; czy EOF + beq EndOfFile + jne FileInit ; koniec bloku - skok pod adres inicjalizacji FileGetBlockStart - JSR FileGetByte - STA InBlockAddr - JSR FileGetByte - STA InBlockAddr+1 - RTS + LDA #InBlockAddr + sta InBlockAddr+1 + JMP GetFile2Bytes ; pobranie dwoch bajtow GoInitAddr JMP ($02E2) -GetDataSector -ReadErrorLoop - LDX #$0B -SetDCB - LDA blokDanychIO_Loader,X - STA DDEVIC,X - DEX - BPL SetDCB SioJMP JSR JSIOINT - BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie RTS blokDanychIO_Loader .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 @@ -303,11 +283,6 @@ blokDanychIO_Loader SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 SectorNumber .WO $0000 -CheckEOF - INC ToFileEndH - BNE NotEOF - INC ToFileEndH+1 - BNE NotEOF EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu PHA @@ -317,92 +292,24 @@ EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku ; LDA VCOUNT ; bne WaitLine0 JMP ($02E0) -; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! -FileGetByte - INC ToFileEndL - BEQ CheckEOF -NotEOF - CPX SecLen ;; nie EOF, ale moze koniec sektora - bne ByteToACCU ; -- - lda InSectorCountH ; -- obsluga sektorow ponad 256b - cmp SecLen+1 ; -- - BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny -ByteToACCU -FileSecBuffHaddr2 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! - LDA FileSecBuff,X ;; pobranie bajtu z pliku do A - INX - bne GoToSec ; -- -IncrementationXH ; taki trik - to przypadkiem jest podprogram, wiec mozna tu wskoczyc zamiast zwiekszac liczniki w innym miejscu po raz drugi - inc InSectorCountH ; -- - inc FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b - inc FileSecBuffHaddr2 ; -- -GoToSec - SEC Jrts RTS -; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! -GetNextFileSect - tya - pha -ReadNextInSequence -SectorSequenceCount = *+1 - lda #$00 ; to już ma być zainicjowane!!! - beq NextMapPosition - dec SectorSequenceCount - inc SectorNumber - bne noIncDAUX2 - inc SectorNumber+1 -noIncDAUX2 - bne ReadyToRead - ;jak jest tutaj to jest błąd... - ;powinien być skok do self-testu... -NextMapPosition - jsr incCompressedMapPos - ;UWAGA! adres w mapie jest zawsze zwiększany o 1 - ;więc przed uruchomieniem loadera trzeba zainicjować adresem-1 - ldy #0 - lda (CompressedMapPos),y - bmi HowManyToSkip - beq SetNewStartSector - ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji - sta SectorSequenceCount - bne ReadNextInSequence ;zawsze skoczy -HowManyToSkip - and #%01111111 - clc - adc SectorNumber - sta SectorNumber - bcc noIncDAUX2_v2 - inc SectorNumber+1 -noIncDAUX2_v2 - bne ReadyToRead - ;jak jest tutaj to jest błąd... - ;powinien być skok do self-testu... -SetNewStartSector - jsr incCompressedMapPos - lda (CompressedMapPos),y - sta SectorNumber - jsr incCompressedMapPos - lda (CompressedMapPos),y - sta SectorNumber+1 -ReadyToRead - JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora +GetFile2Bytes + mwa #2 BlockLen +GetFileBytes + LDX #16 ; kanal 1 + LDA #CGBINR ; rozkaz BGET + STA ICCOM,X ; COMMAND + LDA InBlockAddr + STA ICBUFA,x + LDA InBlockAddr+1 + STA ICBUFA+1,x + LDA BlockLen + STA ICBUFL,x + LDA BlockLen+1 + STA ICBUFL+1,x + JMP CIO - pla - tay - lda #>FileSecBuff ; -- - sta FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b - sta FileSecBuffHaddr2 ; -- - LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze - stx InSectorCountH ; -- - JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc - -incCompressedMapPos - inc CompressedMapPos - bne skipIncCompressedMapPos - inc CompressedMapPos+1 -skipIncCompressedMapPos - rts ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X ; potrzebny do obslugi sektorow wiekszych od 256b InSectorCountH @@ -1328,7 +1235,7 @@ NoZpage ; a tutaj otwieramy kanal 1 CIO do odczytu - LDX #1*16 ; kanal 1 + LDX #16 ; kanal 1 LDA #COPN ; rozkaz OPEN STA ICCOM,X ; COMMAND LDA #$04 ; READ @@ -1343,7 +1250,7 @@ NoZpage JMP loader.LoadStart ; po przepisaniu FileToOpen - .BYTE "C:",0 + .BYTE "H:SCORCH.XEX",155,0 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba ; na koniec odpowiednie zmodyfikowanie MEMLO ADDspeedProc diff --git a/loaderFN.lab b/loaderFN.lab index 9aa678c..588312d 100644 --- a/loaderFN.lab +++ b/loaderFN.lab @@ -72,7 +72,9 @@ Label table: 00 0010 IRQENS 00 0024 INBLOCKADDR 00 0026 TOBLOCKEND +00 0026 BLOCKLEN 00 0028 TOFILEENDL +00 0028 BLOCKATEMP 00 003D COMPRESSEDMAPPOS 00 0030 CHECKSUM 00 0031 SECLENUS @@ -128,271 +130,246 @@ Label table: 00 E471 JTESTROM 00 E474 JRESETWM 00 E477 JRESETCD -00 084B FILESECBUFF -00 084B TEMPMEMLO +00 07D7 FILESECBUFF +00 07D7 TEMPMEMLO 00 1FFD START 00 2000 MOVEDPROC 00 0700 LOADER 00 0700 LOADER.TOFILEENDH 00 0702 LOADER.FILEINIT 00 071B LOADER.FILENEXTBLOCK -00 0727 LOADER.FILENOFFFFHEAD -00 073C LOADER.WHATISIT -00 074B LOADER.FILENOFIRSTBLOCK -00 0757 LOADER.BLOCKREADLOOP -00 0768 LOADER.NONEXTSECTOR1 -00 076A LOADER.FILESECBUFFHADDR1 -00 0771 LOADER.INBLOCKREADLOOP -00 0778 LOADER.LABEL15 -00 0782 LOADER.GOCHECKEOF -00 0787 LOADER.GOGETNEXTFILESECT -00 078C LOADER.FILEGETBLOCKSTART -00 0797 LOADER.GOINITADDR -00 079A LOADER.GETDATASECTOR -00 079A LOADER.READERRORLOOP -00 079C LOADER.SETDCB -00 07A5 LOADER.SIOJMP -00 07AB LOADER.BLOKDANYCHIO_LOADER -00 07B3 LOADER.SECLEN -00 07B5 LOADER.SECTORNUMBER -00 07B7 LOADER.CHECKEOF -00 07C1 LOADER.ENDOFFILE -00 07CA LOADER.FILEGETBYTE -00 07CE LOADER.NOTEOF -00 07DB LOADER.BYTETOACCU -00 07DD LOADER.FILESECBUFFHADDR2 -00 07E1 LOADER.INCREMENTATIONXH -00 07EA LOADER.GOTOSEC -00 07EB LOADER.JRTS -00 07EC LOADER.GETNEXTFILESECT -00 07EE LOADER.READNEXTINSEQUENCE -00 07EF LOADER.SECTORSEQUENCECOUNT -00 07FD LOADER.NOINCDAUX2 -00 07FF LOADER.NEXTMAPPOSITION -00 080F LOADER.HOWMANYTOSKIP -00 081D LOADER.NOINCDAUX2_V2 -00 081F LOADER.SETNEWSTARTSECTOR -00 082F LOADER.READYTOREAD -00 0843 LOADER.INCCOMPRESSEDMAPPOS -00 0849 LOADER.SKIPINCCOMPRESSEDMAPPOS -00 084A LOADER.INSECTORCOUNTH -00 084B LOADER.ZZZZZZ -00 084B LOADER.FIRSTMAPSECTORNR -00 084D LOADER.LOADSTART -00 0856 LOADER.OUTMEMCLEARLOOP -00 0858 LOADER.INMEMCLEARLOOP -00 0874 LOADER.LASTMEMPAGECLEAR -00 0895 LOADER.TEMPTOFILEENDL -00 2196 JAKIETURBO -00 2196 USMODE -00 2197 QMEG -00 2198 BOOTDRIVE -00 2199 BOOTSHIFT -00 219A FOLDERTURBO -00 219B NEWCOLORS -00 219C BIN2ASCIIHEX -00 21A7 LABELKA -00 21A8 EDRIVER -00 21AB EDITOROPEN -00 21D9 MAINPROG -00 21F7 USSPEED -00 21F9 USSTATPRINT -00 2202 NOUSSPEED -00 2205 ERROR148 -00 2207 ERRORDISPLAY -00 222E ERRORNUMHEX -00 2236 WAITKLOOP -00 2248 READMAINDIR -00 2261 SPARTADISK -00 226C SEKTOR128B -00 227E READDIR -00 22B7 LABEL46 -00 22C5 LABEL40 -00 22D3 LABEL43 -00 22E0 PROGNAME -00 22EB LABEL42 -00 22F6 LABEL45 -00 22F9 DATFILEFOUND -00 2319 LABEL47 -00 2330 TOSTARTOFDIR -00 2341 STATUSBARPRINT -00 2347 DENSITYDISPLAY -00 2349 DRIVEDISP1 -00 235C QMEGSTATUS -00 2364 BASSTATUS -00 236B USSTATUS -00 23E7 LABEL68 -00 23F5 NOLASTFILEINDIR -00 23FF LABEL50 -00 2409 LABEL51 -00 2430 LABEL53 -00 2438 LABEL56 -00 2441 LABEL55 -00 2444 LASTFILESPAGEJUMP -00 2447 LABEL54 -00 244A LABEL52 -00 245C LABEL65 -00 246A LABEL60 -00 2478 COMPARENAMES -00 247A CHECKING62 -00 2486 REPLACINGNAME -00 2492 CHECKNEXTNAME -00 249D LABEL64 -00 24A0 GAMENAMEPRINT -00 24AC YPOSGAMENAME -00 24AD GAMEKEYSYMBOL -00 24B0 GAMENAME -00 24ED LABEL66 -00 24F8 LABEL59 -00 2503 LABEL69 -00 2506 MAINDIRKEY -00 2509 UPDIRKEY -00 2519 ESCKEY -00 2526 NOSHIFTESC -00 252D TOSTARTOFDIRJUMP -00 2530 SPACEKEY -00 2537 CONTARROWSPRINT -00 2548 LASTFILESPAGE -00 254A KEYBOARDPROC -00 255C COLORSALREADYSET -00 2581 NOCTRLLETTER -00 2592 NONUMBER -00 2598 BIGLETTERS -00 25BF SUBDIRTEXT -00 25C8 GOTOLOADER -00 25D0 DISKNOTCHANGED1 -00 25DC SETTURBOOFF -00 25DF NOSHIFT +00 0730 LOADER.FILENOFFFFHEAD +00 0763 LOADER.WHATISIT +00 0772 LOADER.FILENOFIRSTBLOCK +00 077C LOADER.BLOCKREADLOOP +00 0788 LOADER.FILEGETBLOCKSTART +00 0793 LOADER.GOINITADDR +00 0796 LOADER.SIOJMP +00 079A LOADER.BLOKDANYCHIO_LOADER +00 07A2 LOADER.SECLEN +00 07A4 LOADER.SECTORNUMBER +00 07A6 LOADER.ENDOFFILE +00 07AF LOADER.JRTS +00 07B0 LOADER.GETFILE2BYTES +00 07B8 LOADER.GETFILEBYTES +00 07D6 LOADER.INSECTORCOUNTH +00 07D7 LOADER.ZZZZZZ +00 07D7 LOADER.FIRSTMAPSECTORNR +00 07D9 LOADER.LOADSTART +00 07E2 LOADER.OUTMEMCLEARLOOP +00 07E4 LOADER.INMEMCLEARLOOP +00 0800 LOADER.LASTMEMPAGECLEAR +00 0821 LOADER.TEMPTOFILEENDL +00 2122 JAKIETURBO +00 2122 USMODE +00 2123 QMEG +00 2124 BOOTDRIVE +00 2125 BOOTSHIFT +00 2126 FOLDERTURBO +00 2127 NEWCOLORS +00 2128 BIN2ASCIIHEX +00 2133 LABELKA +00 2134 EDRIVER +00 2137 EDITOROPEN +00 2165 MAINPROG +00 2183 USSPEED +00 2185 USSTATPRINT +00 218E NOUSSPEED +00 2191 ERROR148 +00 2193 ERRORDISPLAY +00 21BA ERRORNUMHEX +00 21C2 WAITKLOOP +00 21D4 READMAINDIR +00 21ED SPARTADISK +00 21F8 SEKTOR128B +00 220A READDIR +00 2243 LABEL46 +00 2251 LABEL40 +00 225F LABEL43 +00 226C PROGNAME +00 2277 LABEL42 +00 2282 LABEL45 +00 2285 DATFILEFOUND +00 22A5 LABEL47 +00 22BC TOSTARTOFDIR +00 22CD STATUSBARPRINT +00 22D3 DENSITYDISPLAY +00 22D5 DRIVEDISP1 +00 22E8 QMEGSTATUS +00 22F0 BASSTATUS +00 22F7 USSTATUS +00 2373 LABEL68 +00 2381 NOLASTFILEINDIR +00 238B LABEL50 +00 2395 LABEL51 +00 23BC LABEL53 +00 23C4 LABEL56 +00 23CD LABEL55 +00 23D0 LASTFILESPAGEJUMP +00 23D3 LABEL54 +00 23D6 LABEL52 +00 23E8 LABEL65 +00 23F6 LABEL60 +00 2404 COMPARENAMES +00 2406 CHECKING62 +00 2412 REPLACINGNAME +00 241E CHECKNEXTNAME +00 2429 LABEL64 +00 242C GAMENAMEPRINT +00 2438 YPOSGAMENAME +00 2439 GAMEKEYSYMBOL +00 243C GAMENAME +00 2479 LABEL66 +00 2484 LABEL59 +00 248F LABEL69 +00 2492 MAINDIRKEY +00 2495 UPDIRKEY +00 24A5 ESCKEY +00 24B2 NOSHIFTESC +00 24B9 TOSTARTOFDIRJUMP +00 24BC SPACEKEY +00 24C3 CONTARROWSPRINT +00 24D4 LASTFILESPAGE +00 24D6 KEYBOARDPROC +00 24E8 COLORSALREADYSET +00 250D NOCTRLLETTER +00 251E NONUMBER +00 2524 BIGLETTERS +00 254B SUBDIRTEXT +00 2554 GOTOLOADER +00 255C DISKNOTCHANGED1 +00 2568 SETTURBOOFF +00 256B NOSHIFT 00 2F80 COMPRESSEDMAP -00 2634 GENERATECOMPRESSEDMAP -00 2673 JUMPFORWARD -00 2680 OFFSETTOBIG -00 2696 GETNEXTMAPWORD -00 26A1 SECTOR00 -00 26AC OPS01 -00 26B8 NOTEQAL01 -00 26E3 ADDTOCOMPRESSEDMAP -00 26F5 XXXXBLA -00 26FD NOINC013 -00 26FE FLUSHBUFFER -00 2709 NOFLUSH -00 270A ENDMAKINGMAP -00 270D LOADERGO -00 2720 NORUNFROMDOS -00 2731 AFTERWORMSTART -00 276D MOVELOOP1 -00 2785 CLEARLOOP1 -00 2797 NOZPAGE -00 27BE FILETOOPEN -00 27C1 ADDSPEEDPROC -00 27DB HAPPYRELOCATE -00 27FB LABEL72X -00 27FF TURBORELOCADDR -00 280A LABEL73 -00 2825 NOHAPPYLOADER -00 2826 HAPPYUSMOVEDPROC -00 283D COMMANDLOOP -00 283E HAPPYSPEED -00 2849 DELAYLOOPCMD -00 2853 XJSR1 -00 2867 XJSR2 -00 286D XJSR3 -00 2873 XJSR4 -00 2878 XJSR5 -00 287B WAITFORENDOFTRANSMISSION -00 2884 XJSR6 -00 288E DOUBLEACK -00 288E XJSR7 -00 289A READSECTORLOOP -00 289A XJSR8 -00 289F XJSR9 -00 28A7 XJSRA -00 28AE ERRORHERE -00 28B9 ENDOFTRANSMISSION -00 28C7 SECTRANSREG -00 28DD PUTSIOBYTE -00 28DE WAITFORSERIAL -00 28F1 ADDCHECKSUM -00 28F9 GETSIOBYTE -00 28FB EXTERNALLOOP -00 28FF INTERNALLOOP -00 290F ACKRECEIVE -00 2925 ENDHAPPYUSPROC -00 2925 BLOKDANYCHIO_GETUSSPEED -00 2931 DIRMAPEND -00 2934 LABEL39 -00 2948 DISCNOTCHANGED2 -00 2970 LABEL80 -00 297E NONEXTMAPSECTOR -00 29A0 NOINCH -00 29D0 LABEL79 -00 29FD LABEL75 -00 2A0E LABEL81 -00 2A1C LABEL82 -00 2A2A READPERCOM -00 2A2F READPERCOMRETRY -00 2A43 PERCOMERROR -00 2A48 SET1SECT128 -00 2A53 BLOKDANYCHIO_PERCOM -00 2A5F READFIRSTSECT -00 2A75 READSECTOR -00 2A7E READSECTOR1 -00 2A8C DISKREADRETRY -00 2A99 LABEL85 -00 2AA3 BLOKDANYCHIO -00 2AAF DISKRETRYCOUNT -00 2AB0 PRINTXY -00 2ADC LABEL92 -00 2AF9 LABEL90 -00 2B00 LABEL91 -00 2B08 LABEL89 -00 2B1A LABEL93 -00 2B2B LABEL88 -00 2B32 LABEL87 -00 2B38 LABEL94 -00 2B3D GOERRORDISP -00 2B40 GOSIO -00 2B48 STANDARDSPEED -00 2B4B TABLE2DCB -00 2B53 IOTABLEADDR -00 2B5D CLOSE1 -00 2B5F CLOSEX -00 2B67 GETKEY -00 2BAB GKEYERROR -00 2BAE KDRIVER -00 2BB1 DISCCHANGECHECK -00 2BBA LABEL98 -00 2BC7 CHANGEDD -00 2BC8 ASTERIKS -00 2BE6 GETHEXNUMBER -00 2BF6 GETHEX4BITS -00 2C01 ISNUMBER -00 2C02 SETDRIVENR -00 2C15 SETDRIVELETTER -00 2C24 SETBLOKDANYCHDRIVE -00 2C31 MEMLOPRINT -00 2C68 MEMLOVALUE -00 2C6E XJSRTABLEL -00 2C78 XJSRTABLEH -00 2C82 HAPPYOFFSET -00 2C84 DENSITYCODES -00 2C87 ONTEXT -00 2C8A OFFTEXT -00 2C8D PDVMASKTEMP -00 2C8E PERCOMDATA -00 2C9A FIRSTSECTORSTABLE +00 25C0 GENERATECOMPRESSEDMAP +00 25FF JUMPFORWARD +00 260C OFFSETTOBIG +00 2622 GETNEXTMAPWORD +00 262D SECTOR00 +00 2638 OPS01 +00 2644 NOTEQAL01 +00 266F ADDTOCOMPRESSEDMAP +00 2681 XXXXBLA +00 2689 NOINC013 +00 268A FLUSHBUFFER +00 2695 NOFLUSH +00 2696 ENDMAKINGMAP +00 2699 LOADERGO +00 26AC NORUNFROMDOS +00 26BD AFTERWORMSTART +00 26F9 MOVELOOP1 +00 2711 CLEARLOOP1 +00 2723 NOZPAGE +00 274A FILETOOPEN +00 2758 ADDSPEEDPROC +00 2772 HAPPYRELOCATE +00 2792 LABEL72X +00 2796 TURBORELOCADDR +00 27A1 LABEL73 +00 27BC NOHAPPYLOADER +00 27BD HAPPYUSMOVEDPROC +00 27D4 COMMANDLOOP +00 27D5 HAPPYSPEED +00 27E0 DELAYLOOPCMD +00 27EA XJSR1 +00 27FE XJSR2 +00 2804 XJSR3 +00 280A XJSR4 +00 280F XJSR5 +00 2812 WAITFORENDOFTRANSMISSION +00 281B XJSR6 +00 2825 DOUBLEACK +00 2825 XJSR7 +00 2831 READSECTORLOOP +00 2831 XJSR8 +00 2836 XJSR9 +00 283E XJSRA +00 2845 ERRORHERE +00 2850 ENDOFTRANSMISSION +00 285E SECTRANSREG +00 2874 PUTSIOBYTE +00 2875 WAITFORSERIAL +00 2888 ADDCHECKSUM +00 2890 GETSIOBYTE +00 2892 EXTERNALLOOP +00 2896 INTERNALLOOP +00 28A6 ACKRECEIVE +00 28BC ENDHAPPYUSPROC +00 28BC BLOKDANYCHIO_GETUSSPEED +00 28C8 DIRMAPEND +00 28CB LABEL39 +00 28DF DISCNOTCHANGED2 +00 2907 LABEL80 +00 2915 NONEXTMAPSECTOR +00 2937 NOINCH +00 2967 LABEL79 +00 2994 LABEL75 +00 29A5 LABEL81 +00 29B3 LABEL82 +00 29C1 READPERCOM +00 29C6 READPERCOMRETRY +00 29DA PERCOMERROR +00 29DF SET1SECT128 +00 29EA BLOKDANYCHIO_PERCOM +00 29F6 READFIRSTSECT +00 2A0C READSECTOR +00 2A15 READSECTOR1 +00 2A23 DISKREADRETRY +00 2A30 LABEL85 +00 2A3A BLOKDANYCHIO +00 2A46 DISKRETRYCOUNT +00 2A47 PRINTXY +00 2A73 LABEL92 +00 2A90 LABEL90 +00 2A97 LABEL91 +00 2A9F LABEL89 +00 2AB1 LABEL93 +00 2AC2 LABEL88 +00 2AC9 LABEL87 +00 2ACF LABEL94 +00 2AD4 GOERRORDISP +00 2AD7 GOSIO +00 2ADF STANDARDSPEED +00 2AE2 TABLE2DCB +00 2AEA IOTABLEADDR +00 2AF4 CLOSE1 +00 2AF6 CLOSEX +00 2AFE GETKEY +00 2B42 GKEYERROR +00 2B45 KDRIVER +00 2B48 DISCCHANGECHECK +00 2B51 LABEL98 +00 2B5E CHANGEDD +00 2B5F ASTERIKS +00 2B7D GETHEXNUMBER +00 2B8D GETHEX4BITS +00 2B98 ISNUMBER +00 2B99 SETDRIVENR +00 2BAC SETDRIVELETTER +00 2BBB SETBLOKDANYCHDRIVE +00 2BC8 MEMLOPRINT +00 2BFF MEMLOVALUE +00 2C05 XJSRTABLEL +00 2C0F XJSRTABLEH +00 2C19 HAPPYOFFSET +00 2C1B DENSITYCODES +00 2C1E ONTEXT +00 2C21 OFFTEXT +00 2C24 PDVMASKTEMP +00 2C25 PERCOMDATA +00 2C31 FIRSTSECTORSTABLE 00 2D00 FIRSTSECTORBUFF 00 2D00 PROGRAMEND 00 2D80 DIRMAPSECTORBUFF 00 2F80 DIRSECTORBUFF -00 2C8E FIRSTRUN -00 2C98 NOSHIFTBOOT -00 2CA1 BASSTATPRINT -00 2CAA BRAKBASICA -00 2CAC TESTQMEGLOOP -00 2CBE QSTATPRINT -00 2CC7 BRAKQMEGA -00 2CDF QMEGSTRING +00 2C25 FIRSTRUN +00 2C2F NOSHIFTBOOT +00 2C38 BASSTATPRINT +00 2C41 BRAKBASICA +00 2C43 TESTQMEGLOOP +00 2C55 QSTATPRINT +00 2C5E BRAKQMEGA +00 2C76 QMEGSTRING 00 0080 MAPCOUNTER 00 0082 COMPRESSEDMAPCOUNTER 00 0084 MAPCOUNTERMEM diff --git a/loaderFN.lst b/loaderFN.lst index 796342f..62be225 100644 --- a/loaderFN.lst +++ b/loaderFN.lst @@ -179,2070 +179,1977 @@ Source: SYSEQU.ASM 82 = 0024 InBlockAddr = $24 ; word 83 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) 84 = 0026 ToBlockEnd = $26 ; word - 85 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH - 86 = 0028 ToFileEndL = $28 - 87 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku - 88 - 89 = 0030 CheckSUM = $30 - 90 = 0031 SecLenUS = $31 - 91 = 0032 SecBuffer = $32 - 92 = 0034 CRETRYZ = $34 - 93 = 0035 TransmitError =$35 - 94 = 0036 Looperka = $36 - 95 = 0037 StackCopy = $37 - 96 - 97 - 98 = 0058 SAVMSC = $58 - 99 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego - 100 ; katalog - 101 = 00CA CurrentDirBuf = $CA - 102 ; adres konca tego bufora (2 bajty) - 103 = 00CC CurrentDirBufEnd = $CC - 104 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji - 105 ; o obrabianym pliku (skok co $17) - 106 = 00D0 CurrentFileInfoBuff = $D0 - 107 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) - 108 = 00D2 DirMapSect = $D2 - 109 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu - 110 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji - 111 ; ma byc wyswietlany katalog od poczatku - 112 = 00D6 LastFilesPageFlag = $D6 - 113 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony - 114 ; zawiera liczbe widocznych na ekranie plikow (1 bajt) - 115 = 00D9 NamesOnScreen = $D9 - 116 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna - 117 ; wczesniej byl 1 bajt w $D6 - 118 = 00E2 InMapPointer = $E2 - 119 ; zmienna tymczasowa na ZP (2 bajty) - 120 = 00E4 TempZP = $E4 - 121 - 122 = 020A VSERIN = $020a - 123 = 02C5 COLPF1S = $02c5 - 124 = 02C6 COLPF2S = $02c6 - 125 = 02C8 COLBAKS = $02c8 - 126 - 127 = 0244 COLDST = $0244 - 128 ;MEMTOP = $02e5 - 129 ;MEMLO = $02e7 - 130 - 131 = 02FC KBCODES = $02fc + 85 = 0026 BlockLen= $26 ; word + 86 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH + 87 = 0028 ToFileEndL = $28 + 88 = 0028 BlockATemp = $28 + 89 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku + 90 + 91 = 0030 CheckSUM = $30 + 92 = 0031 SecLenUS = $31 + 93 = 0032 SecBuffer = $32 + 94 = 0034 CRETRYZ = $34 + 95 = 0035 TransmitError =$35 + 96 = 0036 Looperka = $36 + 97 = 0037 StackCopy = $37 + 98 + 99 + 100 = 0058 SAVMSC = $58 + 101 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego + 102 ; katalog + 103 = 00CA CurrentDirBuf = $CA + 104 ; adres konca tego bufora (2 bajty) + 105 = 00CC CurrentDirBufEnd = $CC + 106 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji + 107 ; o obrabianym pliku (skok co $17) + 108 = 00D0 CurrentFileInfoBuff = $D0 + 109 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty) + 110 = 00D2 DirMapSect = $D2 + 111 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu + 112 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji + 113 ; ma byc wyswietlany katalog od poczatku + 114 = 00D6 LastFilesPageFlag = $D6 + 115 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony + 116 ; zawiera liczbe widocznych na ekranie plikow (1 bajt) + 117 = 00D9 NamesOnScreen = $D9 + 118 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna + 119 ; wczesniej byl 1 bajt w $D6 + 120 = 00E2 InMapPointer = $E2 + 121 ; zmienna tymczasowa na ZP (2 bajty) + 122 = 00E4 TempZP = $E4 + 123 + 124 = 020A VSERIN = $020a + 125 = 02C5 COLPF1S = $02c5 + 126 = 02C6 COLPF2S = $02c6 + 127 = 02C8 COLBAKS = $02c8 + 128 + 129 = 0244 COLDST = $0244 + 130 ;MEMTOP = $02e5 + 131 ;MEMLO = $02e7 132 - 133 = 0300 DDEVIC = $0300 - 134 = 0301 DUNIT = $0301 - 135 = 0302 DCOMND = $0302 - 136 = 0304 DBUFA = $0304 - 137 = 0308 DBYT = $0308 - 138 = 030A DAUX1 = $030a - 139 = 030B DAUX2 = $030b - 140 - 141 = 0342 ICCMD = $0342 - 142 = 0344 ICBUFA = $0344 - 143 ;ICBUFA+1 = $0345 - 144 = 0348 ICBUFL = $0348 - 145 ;ICBUFL+1 = $0349 - 146 = 034A ICAX1 = $034a - 147 = 034B ICAX2 = $034b - 148 - 149 = 03FA GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta + 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 = D204 AUDF3 = $d204 - 152 = D206 AUDF4 = $d206 - 153 = D207 AUDC4 = $d207 - 154 = D208 AUDCTL = $d208 - 155 = D20A SKSTRES = $d20a - 156 = D20D SEROUT = $D20d - 157 = D20D SERIN = $D20d - 158 = D20E IRQEN = $D20e - 159 = D20E IRQST = $D20e - 160 - 161 - 162 = D20F SKSTAT = $d20f - 163 = D20F SKCTL = $d20f - 164 - 165 - 166 = D303 PBCTL = $d303 - 167 = D301 PORTB = $d301 - 168 - 169 = D40B VCOUNT = $D40B + 151 = 03FA GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta + 152 + 153 = D204 AUDF3 = $d204 + 154 = D206 AUDF4 = $d206 + 155 = D207 AUDC4 = $d207 + 156 = D208 AUDCTL = $d208 + 157 = D20A SKSTRES = $d20a + 158 = D20D SEROUT = $D20d + 159 = D20D SERIN = $D20d + 160 = D20E IRQEN = $D20e + 161 = D20E IRQST = $D20e + 162 + 163 + 164 = D20F SKSTAT = $d20f + 165 = D20F SKCTL = $d20f + 166 + 167 + 168 = D303 PBCTL = $d303 + 169 = D301 PORTB = $d301 170 - 171 = E456 JCIOMAIN = $e456 - 172 = E459 JSIOINT = $e459 - 173 = E471 JTESTROM = $e471 - 174 = E474 JRESETWM = $e474 - 175 = E477 JRESETCD = $e477 - 176 - 177 org $1FFD + 171 = D40B VCOUNT = $D40B + 172 + 173 = E456 JCIOMAIN = $e456 + 174 = E459 JSIOINT = $e459 + 175 = E471 JTESTROM = $e471 + 176 = E474 JRESETWM = $e474 + 177 = E477 JRESETCD = $e477 178 - 179 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura - 180 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! - 181 = 084B FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu - 182 = 084B TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) - 183 - 184 START - 185 FFFF> 1FFD-2D4F> 4C 8E + JMP FirstRun ;1FFD 4C 70 21 - 186 - 187 - 188 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu - 189 ; do wczytania !!!!!! - 190 - 191 2000 movedproc - 192 0700 .local loader, $0700 - 193 - 194 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 - 195 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych - 196 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO - 197 0700 ToFileEndH - 198 0700 00 00 .WO $0000 - 199 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym - 200 0702 8A TXA - 201 0703 48 PHA - 202 0704 A5 28 LDA ToFileEndL - 203 0706 48 PHA - 204 0707 A5 3D LDA CompressedMapPos - 205 0709 48 PHA - 206 070A A5 3E LDA CompressedMapPos+1 - 207 070C 48 PHA - 208 070D 20 97 07 JSR GoInitAddr - 209 0710 68 PLA - 210 0711 85 3E STA CompressedMapPos+1 - 211 0713 68 PLA - 212 0714 85 3D STA CompressedMapPos - 213 0716 68 PLA - 214 0717 85 28 STA ToFileEndL - 215 0719 68 PLA - 216 071A AA TAX - 217 071B FileNextBlock ; wczytanie kolejnego bloku binarnego - 218 071B 20 8C 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) - 219 071E 25 24 AND InBlockAddr - 220 0720 C9 FF CMP #$FF ; jesli oba sa $FF to..... - 221 0722 D0 03 BNE FileNoFFFFHead - 222 0724 20 8C 07 JSR FileGetBlockStart ; pobranie jeszcze raz - 223 0727 FileNoFFFFHead - 224 0727 20 CA 07 JSR FileGetByte ; Pobranie adresu konca ladowanego bloku - 225 072A E5 24 SBC InBlockAddr ; i wyliczenie jego dlugosci - 226 072C 49 FF EOR #$FF ; UWAGA! Dlugosc jest zEORowana z $FFFF - 227 072E 85 26 STA ToBlockEnd ; czyli odjeta od $10000 - 228 0730 08 PHP ; odliczanie ilosci pobranych bajtow jest wiec potem robione - 229 0731 20 CA 07 JSR FileGetByte ; przez dodawanie i sprawdzanie czy nie ZERO - 230 0734 28 PLP - 231 0735 E5 25 SBC InBlockAddr+1 - 232 0737 49 FF EOR #$FF - 233 0739 85 27 STA ToBlockEnd+1 - 234 073B 38 SEC - 235 073C WhatIsIt - 236 073C B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y - 237 ; ktory tylko wylacza skok !!! - 238 073E CE 3C 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! - 239 0741 A5 24 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ - 240 0743 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu - 241 0746 A5 25 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem - 242 0748 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). - 243 074B FileNoFirstBlock - 244 074B A9 EB LDA #Jrts ; jesli nie jest to blok z adresem inicjacji - 247 0752 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie - 248 0755 A0 00 LDY #$00 - 249 0757 BlockReadLoop ;; petla odczytujaca z pliku blok binarny - 250 0757 E6 28 INC ToFileEndL ;; zwiekszenie licznika bajtow w calym pliku i jesli ZERO - 251 0759 F0 27 BEQ GoCheckEOF ;; skok do procedury sprawdzajacej dwa starsze jego bajty - 252 075B EC B3 07 CPX SecLen ;; sprawdzenie czy juz caly sektor przepisany jesli tak - 253 075E D0 08 bne NoNextSector1 ; -- - 254 0760 AD 4A 08 lda InSectorCountH ; -- obsluga sektorow ponad 256b - 255 0763 CD B4 07 cmp SecLen+1 ; -- - 256 0766 F0 1F BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora - 257 0768 NoNextSector1 - 258 = 076A FileSecBuffHaddr1 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! - 259 0768 BD 4B 08 LDA FileSecBuff,X - 260 076B E8 INX - 261 076C D0 03 bne InBlockReadLoop ; -- - 262 076E 20 E1 07 jsr IncrementationXH ; -- obsluga sektorow ponad 256b (ten trik dziala bo tam juz byl RTS :) ) - 263 0771 InBlockReadLoop - 264 0771 91 24 STA (InBlockAddr),Y - 265 0773 C8 INY - 266 0774 D0 02 BNE label15 - 267 0776 E6 25 INC InBlockAddr+1 - 268 0778 label15 - 269 0778 E6 26 INC ToBlockEnd - 270 077A D0 DB BNE BlockReadLoop - 271 077C E6 27 INC ToBlockEnd+1 - 272 077E D0 D7 BNE BlockReadLoop - 273 0780 F0 80 BEQ FileInit ; koniec bloku - skok pod adres inicjalizacji - 274 0782 GoCheckEOF - 275 0782 20 B7 07 JSR CheckEOF ; skok do procedury wspolnej dla pobierania bloku i bajtu - 276 0785 B0 EA BCS InBlockReadLoop ;tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli - 277 0787 GoGetNextFileSect - 278 0787 20 EC 07 JSR GetNextFileSect - 279 078A B0 E5 BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli - 280 078C FileGetBlockStart - 281 078C 20 CA 07 JSR FileGetByte - 282 078F 85 24 STA InBlockAddr - 283 0791 20 CA 07 JSR FileGetByte - 284 0794 85 25 STA InBlockAddr+1 - 285 0796 60 RTS - 286 0797 GoInitAddr - 287 0797 6C E2 02 JMP ($02E2) - 288 079A GetDataSector - 289 079A ReadErrorLoop - 290 079A A2 0B LDX #$0B - 291 079C SetDCB - 292 079C BD AB 07 LDA blokDanychIO_Loader,X - 293 079F 9D 00 03 STA DDEVIC,X - 294 07A2 CA DEX - 295 07A3 10 F7 BPL SetDCB - 296 07A5 SioJMP - 297 07A5 20 59 E4 JSR JSIOINT - 298 07A8 30 F0 BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie - 299 07AA 60 RTS - 300 07AB blokDanychIO_Loader - 301 07AB 31 01 52 40 4B 08 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 - 302 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) - 303 = 07B3 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 - 304 07B5 SectorNumber - 305 07B5 00 00 .WO $0000 - 306 07B7 CheckEOF - 307 07B7 EE 00 07 INC ToFileEndH - 308 07BA D0 12 BNE NotEOF - 309 07BC EE 01 07 INC ToFileEndH+1 - 310 07BF D0 0D BNE NotEOF - 311 07C1 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku - 312 07C1 A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu - 313 07C3 48 PHA - 314 07C4 A9 73 LDA #<(JRESETWM-1) - 315 07C6 48 PHA - 316 ;WaitLine0 - 317 ; LDA VCOUNT - 318 ; bne WaitLine0 - 319 07C7 6C E0 02 JMP ($02E0) - 320 ; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! - 321 07CA FileGetByte - 322 07CA E6 28 INC ToFileEndL - 323 07CC F0 E9 BEQ CheckEOF - 324 07CE NotEOF - 325 07CE EC B3 07 CPX SecLen ;; nie EOF, ale moze koniec sektora - 326 07D1 D0 08 bne ByteToACCU ; -- - 327 07D3 AD 4A 08 lda InSectorCountH ; -- obsluga sektorow ponad 256b - 328 07D6 CD B4 07 cmp SecLen+1 ; -- - 329 07D9 F0 11 BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny - 330 07DB ByteToACCU - 331 = 07DD FileSecBuffHaddr2 = *+2 ; samomodyfikacja kodu potrzebna do obslugi sektorow ponad 256b !!! - 332 07DB BD 4B 08 LDA FileSecBuff,X ;; pobranie bajtu z pliku do A - 333 07DE E8 INX - 334 07DF D0 09 bne GoToSec ; -- - 335 07E1 IncrementationXH ; taki trik - to przypadkiem jest podprogram, wiec mozna tu wskoczyc zamiast zwiekszac liczniki w innym miejscu po raz drugi - 336 07E1 EE 4A 08 inc InSectorCountH ; -- - 337 07E4 EE 6A 07 inc FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b - 338 07E7 EE DD 07 inc FileSecBuffHaddr2 ; -- - 339 07EA GoToSec - 340 07EA 38 SEC - 341 07EB Jrts - 342 07EB 60 RTS - 343 ; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! - 344 07EC GetNextFileSect - 345 07EC 98 tya - 346 07ED 48 pha - 347 07EE ReadNextInSequence - 348 = 07EF SectorSequenceCount = *+1 - 349 07EE A9 00 lda #$00 ; to już ma być zainicjowane!!! - 350 07F0 F0 0D beq NextMapPosition - 351 07F2 CE EF 07 dec SectorSequenceCount - 352 07F5 EE B5 07 inc SectorNumber - 353 07F8 D0 03 bne noIncDAUX2 - 354 07FA EE B6 07 inc SectorNumber+1 - 355 07FD noIncDAUX2 - 356 07FD D0 30 bne ReadyToRead - 357 ;jak jest tutaj to jest błąd... - 358 ;powinien być skok do self-testu... - 359 07FF NextMapPosition - 360 07FF 20 43 08 jsr incCompressedMapPos - 361 ;UWAGA! adres w mapie jest zawsze zwiększany o 1 - 362 ;więc przed uruchomieniem loadera trzeba zainicjować adresem-1 - 363 0802 A0 00 ldy #0 - 364 0804 B1 3D lda (CompressedMapPos),y - 365 0806 30 07 bmi HowManyToSkip - 366 0808 F0 15 beq SetNewStartSector - 367 ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji - 368 080A 8D EF 07 sta SectorSequenceCount - 369 080D D0 DF bne ReadNextInSequence ;zawsze skoczy - 370 080F HowManyToSkip - 371 080F 29 7F and #%01111111 - 372 0811 18 clc - 373 0812 6D B5 07 adc SectorNumber - 374 0815 8D B5 07 sta SectorNumber - 375 0818 90 03 bcc noIncDAUX2_v2 - 376 081A EE B6 07 inc SectorNumber+1 - 377 081D noIncDAUX2_v2 - 378 081D D0 10 bne ReadyToRead - 379 ;jak jest tutaj to jest błąd... - 380 ;powinien być skok do self-testu... - 381 081F SetNewStartSector - 382 081F 20 43 08 jsr incCompressedMapPos - 383 0822 B1 3D lda (CompressedMapPos),y - 384 0824 8D B5 07 sta SectorNumber - 385 0827 20 43 08 jsr incCompressedMapPos - 386 082A B1 3D lda (CompressedMapPos),y - 387 082C 8D B6 07 sta SectorNumber+1 - 388 082F ReadyToRead - 389 082F 20 9A 07 JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora - 390 - 391 0832 68 pla - 392 0833 A8 tay - 393 0834 A9 08 lda #>FileSecBuff ; -- - 394 0836 8D 6A 07 sta FileSecBuffHaddr1 ; -- obsluga sektorow ponad 256b - 395 0839 8D DD 07 sta FileSecBuffHaddr2 ; -- - 396 083C A2 00 LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze - 397 083E 8E 4A 08 stx InSectorCountH ; -- - 398 0841 F0 98 JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc - 399 - 400 0843 incCompressedMapPos - 401 0843 E6 3D inc CompressedMapPos - 402 0845 D0 02 bne skipIncCompressedMapPos - 403 0847 E6 3E inc CompressedMapPos+1 - 404 0849 skipIncCompressedMapPos - 405 0849 60 rts - 406 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X - 407 ; potrzebny do obslugi sektorow wiekszych od 256b - 408 084A InSectorCountH - 409 084A 00 .BY $00 - 410 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 - 411 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz - 412 ; w tym miejscu potem bedzie bufor - 413 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora - 414 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania - 415 084B zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie - 416 084B FirstMapSectorNr - 417 084B 00 00 .WO $0000 - 418 084D LoadStart - 419 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP - 420 084D AC E7 02 LDY MEMLO - 421 0850 AD E8 02 LDA MEMLO+1 - 422 0853 8D 5A 08 STA InMemClearLoop+2 - 423 0856 OutMemClearLoop - 424 0856 A9 00 LDA #$00 - 425 0858 InMemClearLoop - 426 0858 99 00 09 STA $0900,Y - 427 085B C8 INY - 428 085C D0 FA BNE InMemClearLoop - 429 085E EE 5A 08 INC InMemClearLoop+2 - 430 0861 AD 5A 08 LDA InMemClearLoop+2 - 431 0864 CD E6 02 CMP MEMTOP+1 - 432 0867 90 ED BCC OutMemClearLoop - 433 0869 AD E6 02 LDA MEMTOP+1 - 434 086C 8D 76 08 STA LastMemPageClear+2 - 435 086F AC E5 02 LDY MEMTOP - 436 0872 A9 00 LDA #$00 - 437 0874 LastMemPageClear - 438 0874 99 00 80 STA $8000,Y - 439 0877 88 DEY - 440 0878 C0 FF CPY #$FF - 441 087A D0 F8 BNE LastMemPageClear - 442 ; wyczyszczona, wiec .... - 443 087C AD 95 08 LDA tempToFileEndL - 444 087F 85 28 STA ToFileEndL - 445 0881 A9 FF LDA #$FF - 446 0883 8D FC 02 STA KBCODES - 447 0886 EE 3C 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) - 448 0889 AE B3 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora - 449 088C AD B4 07 LDA Seclen+1 ; -- - 450 088F 8D 4A 08 STA InSectorCountH ; -- obsluga sektorow ponad 256b - 451 ;jmp * - 452 0892 4C 1B 07 JMP FileNextBlock - 453 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku - 454 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera - 455 0895 tempToFileEndL - 456 0895 00 .BY $00 - 457 .endl - 458 2196 JAkieTurbo - 459 2196 USmode - 460 2196 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed - 461 2197 QMEG - 462 2197 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG - 463 2198 BootDrive - 464 2198 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi - 465 2199 BootShift - 466 2199 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety - 467 219A FolderTurbo - 468 219A 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT - 469 219B NewColors - 470 219B 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano - 471 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) - 472 219C bin2AsciiHex - 473 219C 29 0F AND #$0F - 474 219E 09 30 ORA #$30 - 475 21A0 C9 3A CMP #$3A - 476 21A2 90 03 BCC labelka - 477 21A4 18 CLC - 478 21A5 69 07 ADC #$07 - 479 21A7 labelka - 480 21A7 60 RTS - 481 21A8 Edriver - 482 21A8 45 3A 9B .BY "E:",$9b - 483 21AB EditorOpen - 484 ; otwarcie ekranu !!! - 485 21AB A2 00 LDX #$00 ; kanal nr 0 - 486 21AD 20 5F 2B JSR CloseX ; najpierw Zamkniecie Ekranu - 487 21B0 30 55 BMI ErrorDisplay - 488 21B2 A2 00 LDX #$00 ; kanal nr 0 - 489 21B4 A9 03 LDA #$03 - 490 21B6 9D 42 03 STA ICCMD,X - 491 21B9 A9 0C LDA #$0C - 492 21BB 9D 4A 03 STA ICAX1,X - 493 21BE 9D 48 03 STA ICBUFL,X - 494 21C1 A9 00 LDA #$00 - 495 21C3 9D 4B 03 STA ICAX2,X - 496 21C6 9D 49 03 STA ICBUFL+1,X - 497 21C9 A9 A8 LDA #Edriver - 500 21D0 9D 45 03 STA ICBUFA+1,X - 501 21D3 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 - 502 21D6 30 2F BMI ErrorDisplay - 503 21D8 60 RTS - 504 - 505 21D9 mainprog - 506 21D9 AD 97 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US - 507 21DC 2D 99 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza - 508 21DF 8D 96 21 STA USmode - 509 21E2 F0 1E BEQ NoUSSpeed - 510 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler - 511 21E4 A0 25 ldy #blokDanychIO_GetUSSpeed - 513 21E8 20 4B 2B jsr Table2DCB - 514 21EB 20 59 E4 jsr JSIOINT ; wysylamy "?" - 515 21EE 10 07 bpl USSpeed - 516 21F0 A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage - 517 21F2 8D 96 21 sta USmode - 518 21F5 F0 0B beq NoUSSpeed - 519 21F7 USSpeed - 520 21F7 A0 02 LDY #$2 - 521 21F9 USstatprint - 522 21F9 B9 87 2C LDA ONtext,y - 523 21FC 99 6B 23 STA USstatus,y - 524 21FF 88 DEY - 525 2200 10 F7 bpl USstatprint - 526 - 527 2202 NoUSSpeed - 528 2202 4C 48 22 JMP ReadMainDir - 529 2205 Error148 - 530 2205 A0 94 LDY #$94 ; kod bledu do Y - 531 ; wyswietlenie komunikatu o bledzie - kod bledu w Y - 532 2207 ErrorDisplay - 533 2207 98 TYA - 534 2208 48 PHA - 535 2209 20 5D 2B JSR Close1 - 536 220C 68 PLA - 537 220D 48 PHA - 538 220E 4A LSR - 539 220F 4A LSR - 540 2210 4A LSR - 541 2211 4A LSR - 542 2212 20 9C 21 JSR bin2AsciiHex ; 4 starsze bity na HEX - 543 2215 8D 2E 22 STA ErrorNumHex - 544 2218 68 PLA - 545 2219 20 9C 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX - 546 221C 8D 2F 22 STA ErrorNumHex+1 - 547 221F 20 B0 2A JSR PrintXY - 548 2222 00 00 .BY $00,$00 - 549 2224 7D .BY $7d ; kod czyszczenia ekranu - 550 2225 45 52 52 4F 52 20 + .BY "ERROR - $" - 551 222E ErrorNumHex - 552 222E 30 30 00 .BY "00",$00 - 553 ; czekamy na dowolny klawisz - 554 2231 A9 FF LDA #$FF - 555 2233 8D FC 02 STA KBCODES - 556 2236 WaitKloop - 557 2236 AE FC 02 LDX KBCODES - 558 2239 E8 INX - 559 223A F0 FA BEQ WaitKloop - 560 223C 8D FC 02 STA KBCODES ; w A jest $FF - 561 ; ------------------ - 562 ; na wypadek wybrania nieistniejacej stacji - 563 ; po bledzie przechodzimy na te z ktorej sie ladowalismy - 564 223F AD 98 21 LDA BootDrive - 565 ;LDA #1 - 566 2242 20 02 2C JSR SeTDriveNR - 567 ; ----------------- - 568 2245 4C D9 21 JMP mainprog ; i odpalamy program od nowa - 569 2248 ReadMainDir - 570 2248 20 2A 2A JSR ReadPERCOM - 571 224B A2 2D LDX #>FirstSectorBuff - 572 224D A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) - 581 225F D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki - 582 2261 SpartaDisk - 583 2261 A2 00 LDX #$00 - 584 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 - 585 2263 AD 1F 2D LDA FirstSectorBuff+$1F - 586 2266 30 04 BMI Sektor128b - 587 2268 AA TAX - 588 2269 A9 00 LDA #$00 - 589 226B E8 INX ; i wyliczenie starszego bajtu - 590 226C Sektor128b - 591 226C 8D B3 20 STA .adr loader.SecLen ; przed przepisaniem - 592 226F 8E B4 20 STX .adr loader.SecLen+1 ; przed przepisaniem - 593 ; pokazanie na ekranie - 594 2272 BD 84 2C LDA DensityCodes,X - 595 2275 8D 47 23 STA DensityDisplay - 596 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu - 597 2278 AC 09 2D LDY FirstSectorBuff+$09 - 598 227B AE 0A 2D LDX FirstSectorBuff+$0A - 599 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x - 600 227E ReadDIR - 601 ; ustawienie znacznika wlaczenia Turbo dla katalogu - 602 227E A9 01 LDA #$01 - 603 2280 8D 9A 21 STA FolderTurbo - 604 2283 84 D2 STY DirMapSect - 605 2285 86 D3 STX DirMapSect+1 - 606 2287 A9 2F LDA #>DirSectorBuff - 607 2289 85 D1 STA CurrentFileInfoBuff+1 - 608 228B 85 CB STA CurrentDirBuf+1 - 609 228D A9 80 LDA #" - 751 23CD 3A 4D 61 69 6E 20 + .BY ":Main Dir. " - 752 23D9 BC .BY +$80,"<" - 753 23DA 3A 55 50 2D 44 49 + .BY ":UP-DIR." - 754 23E2 00 .BY $00 - 755 23E3 A9 00 LDA #$00 - 756 23E5 85 D9 STA NamesOnScreen - 757 23E7 label68 - 758 23E7 A5 D1 LDA CurrentFileInfoBuff+1 - 759 23E9 C5 CD CMP CurrentDirBufEnd+1 - 760 23EB 90 08 BCC NoLastFileInDir - 761 23ED D0 55 BNE LastFilesPageJump - 762 23EF A5 D0 LDA CurrentFileInfoBuff - 763 23F1 C5 CC CMP CurrentDirBufEnd - 764 23F3 B0 4F BCS LastFilesPageJump - 765 23F5 NoLastFileInDir - 766 23F5 A0 00 LDY #$00 - 767 23F7 B1 D0 LDA (CurrentFileInfoBuff),Y - 768 23F9 F0 49 BEQ LastFilesPageJump - 769 23FB A2 22 LDX #$22 - 770 23FD A9 20 LDA #$20 ; spacja - 771 23FF label50 - 772 23FF 9D B0 24 STA GameName,X - 773 2402 CA DEX - 774 2403 10 FA BPL label50 - 775 2405 A0 10 LDY #$10 - 776 2407 A2 0A LDX #$0A - 777 2409 label51 - 778 2409 B1 D0 LDA (CurrentFileInfoBuff),Y - 779 240B 9D B0 24 STA GameName,X - 780 240E 88 DEY - 781 240F CA DEX - 782 2410 10 F7 BPL label51 - 783 2412 A5 D9 LDA NamesOnScreen - 784 2414 18 CLC - 785 2415 69 41 ADC #$41 ; literka "A" - 786 2417 8D AD 24 STA GameKeySymbol - 787 241A A5 D8 LDA $D8 - 788 241C D0 2C BNE label52 - 789 241E A0 00 LDY #$00 - 790 ; status sprawdzanego pliku - 791 2420 B1 D0 LDA (CurrentFileInfoBuff),Y - 792 2422 29 19 AND #$19 - 793 2424 C9 09 CMP #$09 - 794 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" - 795 2426 F0 08 BEQ label53 - 796 2428 A6 D7 LDX $D7 - 797 242A F0 1B BEQ label54 - 798 242C C9 08 CMP #$08 - 799 242E D0 17 BNE label54 - 800 2430 label53 - 801 ; jeszcze raz status sprawdzanego pliku - 802 2430 B1 D0 LDA (CurrentFileInfoBuff),Y - 803 2432 29 20 AND #$20 - 804 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) - 805 2434 F0 0B BEQ label55 - 806 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") - 807 2436 A2 08 LDX #$08 - 808 2438 label56 - 809 2438 BD BF 25 LDA SubDirText,X - 810 243B 8D BC 24 STA GameName+12 - 811 243E CA DEX - 812 243F 10 F7 BPL label56 - 813 2441 label55 - 814 2441 4C A0 24 JMP GameNamePrint - 815 2444 LastFilesPageJump - 816 2444 4C 48 25 JMP LastFilesPage - 817 2447 label54 - 818 2447 4C F8 24 JMP label59 - 819 244A label52 - 820 244A A0 00 LDY #$00 - 821 244C B1 D0 LDA (CurrentFileInfoBuff),Y - 822 244E 29 18 AND #$18 - 823 2450 C9 08 CMP #$08 - 824 2452 D0 F3 BNE label54 - 825 2454 A5 CC LDA CurrentDirBufEnd - 826 2456 85 D4 STA $D4 - 827 2458 A5 CD LDA CurrentDirBufEnd+1 - 828 245A 85 D5 STA $D5 - 829 245C label65 - 830 245C A5 D5 LDA $D5 - 831 245E C5 CF CMP $CF - 832 2460 90 08 BCC label60 - 833 2462 D0 E3 BNE label54 - 834 2464 A5 D4 LDA $D4 - 835 2466 C5 CE CMP $CE - 836 2468 B0 DD BCS label54 - 837 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy - 838 246A label60 - 839 246A A0 00 LDY #$00 - 840 246C B1 D4 LDA ($D4),Y - 841 246E C9 2A CMP #'*' - 842 2470 D0 06 BNE CompareNames - 843 2472 8D 9B 21 STA NewColors - 844 2475 20 C8 2B JSR Asteriks - 845 2478 CompareNames - 846 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT - 847 2478 A0 0A LDY #$0A ; 8+3 znaki - 848 247A Checking62 - 849 247A B1 D4 LDA ($D4),Y - 850 247C D9 B0 24 CMP GameName,Y - 851 247F D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw - 852 2481 88 DEY - 853 2482 10 F6 BPL Checking62 - 854 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku - 855 2484 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku - 856 2486 ReplacingName - 857 2486 B1 D4 LDA ($D4),Y - 858 2488 99 A5 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania - 859 248B C8 INY - 860 248C C0 2E CPY #$2E - 861 248E 90 F6 BCC ReplacingName - 862 2490 B0 0E BCS GameNamePrint - 863 2492 CheckNextName - 864 2492 A5 D4 LDA $D4 - 865 2494 18 CLC - 866 2495 69 2E ADC #$2E - 867 2497 85 D4 STA $D4 - 868 2499 90 02 BCC label64 - 869 249B E6 D5 INC $D5 - 870 249D label64 - 871 249D 4C 5C 24 JMP label65 - 872 24A0 GameNamePrint - 873 24A0 A5 D9 LDA NamesOnScreen - 874 24A2 18 CLC - 875 24A3 69 02 ADC #$02 - 876 24A5 8D AC 24 STA YposGameName - 877 24A8 20 B0 2A JSR PrintXY - 878 24AB 01 .BY $01 - 879 24AC YposGameName - 880 24AC 02 .BY $02 - 881 24AD GameKeySymbol - 882 24AD 41 29 20 .BY "A) " - 883 24B0 GameName - 884 24B0 20 20 20 20 20 20 + .BY " " - 885 24D3 00 .BY $00 - 886 24D4 A5 D9 LDA NamesOnScreen - 887 24D6 0A ASL - 888 24D7 AA TAX - 889 24D8 A5 D0 LDA CurrentFileInfoBuff - 890 24DA 9D 9A 2C STA FirstSectorsTable,X - 891 24DD A5 D1 LDA CurrentFileInfoBuff+1 - 892 24DF 9D 9B 2C STA FirstSectorsTable+1,X - 893 24E2 A5 D0 LDA CurrentFileInfoBuff - 894 24E4 18 CLC - 895 24E5 69 17 ADC #$17 - 896 24E7 85 D0 STA CurrentFileInfoBuff - 897 24E9 90 02 BCC label66 - 898 24EB E6 D1 INC CurrentFileInfoBuff+1 - 899 24ED label66 - 900 24ED E6 D9 INC NamesOnScreen - 901 24EF A5 D9 LDA NamesOnScreen - 902 24F1 C9 13 CMP #$13 - 903 24F3 B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie - 904 24F5 4C E7 23 JMP label68 - 905 24F8 label59 - 906 24F8 A5 D0 LDA CurrentFileInfoBuff - 907 24FA 18 CLC - 908 24FB 69 17 ADC #$17 - 909 24FD 85 D0 STA CurrentFileInfoBuff - 910 24FF 90 02 BCC label69 - 911 2501 E6 D1 INC CurrentFileInfoBuff+1 - 912 2503 label69 - 913 2503 4C E7 23 JMP label68 - 914 2506 MainDirKEY - 915 2506 4C 48 22 JMP ReadMainDir - 916 2509 UpDirKEY - 917 2509 A0 02 LDY #$02 - 918 250B B1 CA LDA (CurrentDirBuf),Y - 919 250D AA TAX - 920 250E 88 DEY - 921 250F 11 CA ORA (CurrentDirBuf),Y - 922 2511 F0 37 BEQ KeyboardProc - 923 2513 B1 CA LDA (CurrentDirBuf),Y - 924 2515 A8 TAY - 925 2516 4C 7E 22 JMP ReadDIR - 926 2519 EscKEY - 927 ; sprawdzmy czy z Shift - 928 2519 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! - 929 251C 29 08 and #$08 - 930 251E D0 06 BNE NoSHIFTEsc - 931 2520 20 AB 21 JSR EditorOpen - 932 2523 6C 0A 00 JMP (DOSVEC) - 933 2526 NoSHIFTEsc - 934 2526 A2 00 LDX #$00 - 935 2528 86 D8 STX $D8 - 936 252A E8 INX - 937 252B 86 D7 STX $D7 - 938 252D ToStartOfDirJump - 939 252D 4C 30 23 JMP ToStartOfDir - 940 2530 SpaceKEY - 941 2530 A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy - 942 2532 D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku - 943 2534 4C 41 23 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej - 944 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie - 945 2537 ContArrowsPrint - 946 2537 20 B0 2A JSR PrintXY - 947 253A 01 15 .BY $01,$15 - 948 253C 1D .BY $1D ; strzalka w dol - 949 253D 00 .BY $00 - 950 253E 20 B0 2A JSR PrintXY - 951 2541 0E 15 .BY $0E,$15 - 952 2543 1D .BY $1D ; strzalka w dol - 953 2544 00 .BY $00 - 954 2545 4C 4A 25 JMP KeyboardProc - 955 2548 LastFilesPage - 956 2548 E6 D6 INC LastFilesPageFlag - 957 254A KeyboardProc - 958 254A AD 9B 21 LDA NewColors - 959 254D D0 0D BNE ColorsAlreadySet - 960 254F A9 C4 LDA #$C4 ; ustawienie koloru tła i liter - 961 2551 8D C6 02 STA COLPF2S - 962 2554 8D C8 02 STA COLBAKS - 963 2557 A9 CA LDA #$CA - 964 2559 8D C5 02 STA COLPF1S - 965 255C ColorsAlreadySet - 966 255C 20 67 2B JSR GetKey - 967 255F 29 7F AND #%01111111 ; eliminujemy invers - 968 2561 F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu - 969 2563 C9 3E CMP #$3E ; ">" - 970 2565 F0 9F BEQ MainDirKEY - 971 2567 C9 3C CMP #$3C ; "<" - 972 2569 F0 9E BEQ UpDirKEY - 973 256B C9 7E CMP #$7E ; BackSpace - 974 256D F0 9A BEQ UpDirKEY - 975 256F C9 1B CMP #$1B ; Esc - 976 2571 F0 A6 BEQ EscKEY - 977 2573 C9 20 CMP #$20 ; Spacja - 978 2575 F0 B9 BEQ SpaceKEY - 979 ; ---------------- - 980 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) - 981 2577 C9 10 CMP #$10 - 982 2579 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) - 983 257B 20 15 2C JSR SeTDriveLetter - 984 257E 4C D9 21 JMP mainprog - 985 2581 noCtrlLetter - 986 ; sprawdzenie klawiszy 1-8 - 987 2581 C9 31 CMP #'1' - 988 2583 90 0D BCC NoNumber - 989 2585 C9 39 CMP #'9' - 990 2587 B0 09 BCS NoNumber - 991 2589 38 SEC - 992 258A E9 30 SBC #'0' - 993 258C 20 02 2C JSR SeTDriveNR - 994 258F 4C D9 21 JMP mainprog - 995 ; ----------------- - 996 2592 NoNumber - 997 2592 C9 61 CMP #'a' ; czy nie ma capsa - 998 2594 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany - 999 2596 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) - 1000 2598 BigLetters - 1001 2598 38 SEC - 1002 2599 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy - 1003 259B C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie - 1004 259D B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz - 1005 259F 0A ASL - 1006 25A0 AA TAX - 1007 25A1 BD 9A 2C LDA FirstSectorsTable,X - 1008 25A4 85 D4 STA $D4 - 1009 25A6 BD 9B 2C LDA FirstSectorsTable+1,X - 1010 25A9 85 D5 STA $D5 - 1011 25AB A0 00 LDY #$00 - 1012 25AD B1 D4 LDA ($D4),Y - 1013 25AF 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik - 1014 25B1 F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader - 1015 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran - 1016 25B3 A0 02 LDY #$02 - 1017 25B5 B1 D4 LDA ($D4),Y - 1018 25B7 AA TAX - 1019 25B8 88 DEY - 1020 25B9 B1 D4 LDA ($D4),Y - 1021 25BB A8 TAY - 1022 25BC 4C 7E 22 JMP ReadDIR - 1023 25BF SubDirText - 1024 25BF 3C 53 55 42 2D 44 + .BY "" - 1025 25C8 GOtoLoader - 1026 25C8 20 B1 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka - 1027 25CB F0 03 BEQ DiskNotChanged1 - 1028 25CD 4C 48 22 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego - 1029 25D0 DiskNotChanged1 - 1030 25D0 AD 9A 21 LDA FolderTurbo - 1031 25D3 F0 07 BEQ SetTurboOFF - 1032 25D5 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! - 1033 25D8 29 08 and #$08 - 1034 25DA D0 03 BNE NoSHIFT - 1035 25DC SetTurboOFF - 1036 25DC 8D 96 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 - 1037 25DF NoSHIFT - 1038 25DF A0 01 LDY #$01 - 1039 25E1 B1 D4 LDA ($D4),Y - 1040 25E3 8D 4B 21 STA .adr loader.FirstMapSectorNr ; przed przepisaniem - 1041 25E6 8D AD 2A sta blokDanychIO+$A ; od razu do bloku IOCB - 1042 25E9 C8 INY - 1043 25EA B1 D4 LDA ($D4),Y - 1044 25EC 8D 4C 21 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem - 1045 25EF 8D AE 2A sta blokDanychIO+$B ; od razu do bloku IOCB - 1046 25F2 C8 INY - 1047 25F3 B1 D4 LDA ($D4),Y - 1048 25F5 49 FF EOR #$FF - 1049 25F7 8D 95 21 STA .adr loader.tempToFileEndL - 1050 25FA C8 INY - 1051 25FB B1 D4 LDA ($D4),Y - 1052 25FD 49 FF EOR #$FF - 1053 25FF 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem - 1054 2602 C8 INY - 1055 2603 B1 D4 LDA ($D4),Y - 1056 2605 49 FF EOR #$FF - 1057 2607 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem - 1058 ; wszystko zapamietane mozna robic mape sektorow.... - 1059 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu - 1060 ; czyli DirSectorBuff - 1061 ; sektor mapy przed kompresja leci do DirMapSectorBuff - 1062 ; UWAGA - 1063 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi - 1064 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! - 1065 = 2F80 CompressedMap = DirSectorBuff - 1066 ; czytamy pierwszy sektor mapy - 1067 260A A0 80 LDY #DirMapSectorBuff - 1069 260E 20 75 2A Jsr ReadSector - 1070 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! - 1071 2611 A9 00 LDA #00 - 1072 2613 85 82 STA CompressedMapCounter - 1073 2615 85 83 STA CompressedMapCounter+1 - 1074 2617 20 E3 26 JSR AddToCompressedMAP - 1075 261A AD 84 2D LDA DirMapSectorBuff+4 - 1076 261D 85 86 STA PrevFileSector - 1077 261F 20 E3 26 JSR AddToCompressedMAP - 1078 2622 AD 85 2D LDA DirMapSectorBuff+5 - 1079 2625 85 87 sta PrevFileSector+1 - 1080 2627 20 E3 26 JSR AddToCompressedMAP - 1081 ; Inicjujemy liczniki - 1082 262A .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 - 1083 262A .zpvar PrevFileSector, MapPositionMem .word - 1084 262A .zpvar SectorOffset .word - 1085 262A .zpvar SectorsCounter .byte - 1086 262A A9 00 LDA #$00 - 1087 262C 85 81 STA MapCounter+1 - 1088 262E 85 8C STA SectorsCounter - 1089 2630 A9 06 lda #$06 - 1090 2632 85 80 STA MapCounter - 1091 2634 GenerateCompressedMap - 1092 2634 18 CLC - 1093 2635 A9 80 LDA #DirMapSectorBuff - 1097 263D 65 81 ADC MapCounter+1 - 1098 263F 85 89 STA MAPPositionMem+1 - 1099 2641 A2 00 LDX #0 - 1100 2643 A0 01 LDY #1 - 1101 2645 A1 88 LDA (MAPPositionMem,x) - 1102 2647 11 88 ORA (MAPPositionMem),y - 1103 2649 F0 56 BEQ Sector00 - 1104 264B 38 SEC - 1105 264C A1 88 LDA (MAPPositionMem,x) - 1106 264E E5 86 SBC PrevFileSector - 1107 2650 85 8A STA SectorOffset - 1108 2652 B1 88 LDA (MAPPositionMem),y - 1109 2654 E5 87 SBC PrevFileSector+1 - 1110 2656 85 8B STA SectorOffset+1 - 1111 ; mamy odstep miedzy poprzednim a nastepnym sektorem - 1112 2658 D0 26 BNE OffsetToBig - 1113 265A A5 8A LDA SectorOffset - 1114 265C 30 22 BMI OffsetToBig ; max przeskok 127 sektorow - 1115 265E C9 01 CMP #$01 - 1116 2660 D0 11 BNE JumpForward - 1117 ; kolejny sektor - 1118 ; zwiekszamy wiec licznik - 1119 2662 E6 8C inc SectorsCounter - 1120 2664 A5 8C LDA SectorsCounter - 1121 2666 C9 7F CMP #%01111111 - 1122 2668 D0 2C BNE GetNextMapWord - 1123 ; tu licznik dotarl do konca zerujemy go - 1124 ; dodajemy wpis do skompresowanej mapy i gotowe - 1125 266A 20 E3 26 JSR AddToCompressedMAP - 1126 266D A9 00 LDA #0 - 1127 266F 85 8C STA SectorsCounter - 1128 2671 F0 23 BEQ GetNextMapWord - 1129 ; ominiecie wyznaczonej ilości sektorów (w A) - 1130 2673 JumpForward - 1131 2673 20 FE 26 JSR FlushBuffer - 1132 2676 A5 8A LDA SectorOffset - 1133 2678 09 80 ORA #%10000000 - 1134 267A 20 E3 26 JSR AddToCompressedMAP - 1135 267D 4C 96 26 JMP GetNextMapWord - 1136 ; wyznaczenie skoku do nowego sektora pliku - 1137 2680 OffsetToBig - 1138 2680 20 FE 26 JSR FlushBuffer - 1139 2683 A9 00 LDA #0 - 1140 2685 20 E3 26 JSR AddToCompressedMAP - 1141 2688 A0 00 LDY #00 - 1142 268A B1 88 LDA (MAPPositionMem),y - 1143 268C 20 E3 26 JSR AddToCompressedMAP - 1144 268F A0 01 LDY #01 - 1145 2691 B1 88 LDA (MAPPositionMem),y - 1146 2693 20 E3 26 JSR AddToCompressedMAP - 1147 2696 GetNextMapWord - 1148 ; zapamietanie numeru obecnego sektora do porownania potem - 1149 2696 A0 00 LDY #00 - 1150 2698 B1 88 LDA (MAPPositionMem),y - 1151 269A 85 86 STA PrevFileSector - 1152 269C C8 INY - 1153 269D B1 88 LDA (MAPPositionMem),y - 1154 269F 85 87 STA PrevFileSector+1 - 1155 26A1 Sector00 - 1156 26A1 18 A5 80 69 02 85 + ADW MapCounter #2 - 1157 26AC ops01 - 1158 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala - 1159 26AC A5 81 LDA MapCounter+1 - 1160 26AE CD B4 20 CMP .adr loader.SecLen+1 - 1161 26B1 D0 05 bne noteqal01 - 1162 26B3 A5 80 LDA MapCounter - 1163 26B5 CD B3 20 CMP .adr loader.SecLen - 1164 26B8 noteqal01 - 1165 26B8 F0 03 4C 34 26 JNE GenerateCompressedMap - 1166 ; czytamy nastepny sektor mapy - 1167 ; sprawdzmy czy nie koniec - 1168 26BD AD 80 2D LDA DirMapSectorBuff - 1169 26C0 0D 81 2D ORA DirMapSectorBuff+1 - 1170 26C3 F0 45 BEQ EndMakingMap - 1171 26C5 AD 80 2D LDA DirMapSectorBuff - 1172 26C8 8D AD 2A sta blokDanychIO+$A - 1173 26CB AD 81 2D LDA DirMapSectorBuff+1 - 1174 26CE 8D AE 2A sta blokDanychIO+$B - 1175 26D1 A0 80 LDY #DirMapSectorBuff - 1177 26D5 20 75 2A Jsr ReadSector - 1178 ; zerujemy licznik mapy - 1179 26D8 A9 00 LDA #$00 - 1180 26DA 85 81 STA MapCounter+1 - 1181 26DC A9 04 lda #$04 - 1182 26DE 85 80 STA MapCounter - 1183 26E0 4C 34 26 JMP GenerateCompressedMap - 1184 ; dpisanie bajtu z A do mapy sektorow skompresowanej - 1185 26E3 AddToCompressedMAP - 1186 26E3 48 PHA - 1187 ; wyliczamy adresa - 1188 26E4 18 CLC - 1189 26E5 A5 82 LDA CompressedMapCounter - 1190 26E7 69 80 ADC #CompressedMap - 1194 26F0 8D F6 26 STA xxxxbla+1 - 1195 26F3 68 PLA - 1196 = 26F5 xxxxbla=*+1 - 1197 26F4 8D FF FF STA $FFFF - 1198 26F7 E6 82 INC CompressedMapCounter - 1199 26F9 D0 02 BNE noinc013 - 1200 26FB E6 83 INC CompressedMapCounter+1 - 1201 26FD noinc013 - 1202 26FD 60 RTS - 1203 26FE FlushBuffer - 1204 26FE A5 8C LDA SectorsCounter - 1205 2700 F0 07 BEQ NoFlush - 1206 2702 20 E3 26 JSR AddToCompressedMAP - 1207 2705 A9 00 LDA #0 - 1208 2707 85 8C STA SectorsCounter - 1209 2709 NoFlush - 1210 2709 60 RTS - 1211 270A EndMakingMap - 1212 270A 20 FE 26 JSR FlushBuffer - 1213 270D LoaderGo - 1214 270D A0 00 LDY #$00 - 1215 270F 8C 44 02 STY COLDST - 1216 2712 A9 01 LDA #$01 - 1217 2714 85 09 STA BOOT - 1218 2716 AE 00 07 LDX $700 - 1219 2719 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta - 1220 271B D0 03 BNE NoRunFromDOS - 1221 271D 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! - 1222 ; STA $D5EC ; to wylacza SpartaDOS X - 1223 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) - 1224 2720 NoRunFromDOS - 1225 2720 A9 31 LDA #AfterWormStart - 1228 2726 85 0D STA DOSINI+1 - 1229 ; LDA #>JRESETCD - 1230 ; STA DOSVEC+1 - 1231 ; LDA #TempMEMLO - 1252 2744 6D B4 20 ADC .adr loader.SecLen+1 - 1253 2747 8D E8 02 STA MEMLO+1 - 1254 274A 85 3E STA CompressedMapPos+1 - 1255 ; STA pointerMov2b - 1256 ; STA APPMHI+1 - 1257 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora - 1258 ; jest to jednoczesnie adres umieszczenia skompresowanej - 1259 ; mapy sektorow pliku dla loadera ale MINUS 1 - 1260 274C A5 3D D0 02 C6 3E + DEW CompressedMapPos - 1261 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej - 1262 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) - 1263 2754 18 CLC - 1264 2755 AD E7 02 LDA MEMLO - 1265 ; ADC CompressedMapCounter - 1266 ; STA MEMLO - 1267 2758 8D FF 27 STA TurboRelocADDR - 1268 275B AD E8 02 LDA MEMLO+1 - 1269 ; ADC CompressedMapCounter+1 - 1270 ; STA MEMLO+1 - 1271 275E 8D 00 28 STA TurboRelocADDR+1 - 1272 2761 A9 71 LDA #JTESTROM - 1275 2767 85 0D STA DOSINI+1 - 1276 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) - 1277 ; INC $033D ; bajty kontrolne zimnego startu - 1278 ; INC $033E ; zmiana ich wartosci wymusza - 1279 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) - 1280 2769 A2 00 LDX #$00 - 1281 276B 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) - 1282 ; STX BOOT - 1283 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci - 1284 276D moveloop1 - 1285 276D BD 00 20 LDA movedproc,X - 1286 2770 9D 00 07 STA $0700,X - 1287 2773 BD 00 21 LDA movedproc+$0100,X - 1288 2776 9D 00 08 STA $0800,X - 1289 2779 E8 INX - 1290 277A D0 F1 BNE moveloop1 - 1291 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora - 1292 /* moveloop2 - 1293 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy - 1294 pointerMov2a=*+2 - 1295 LDA CompressedMap,x ; kod samomodyfikujacy sie - 1296 pointerMov2b=*+2 - 1297 STA $FFFF,x ; kod samomodyfikujacy sie - 1298 LDA CompressedMapCounter - 1299 AND CompressedMapCounter+1 - 1300 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! - 1301 BEQ SectorMapReady - 1302 INX - 1303 BNE moveloop2 - 1304 inc pointerMov2a - 1305 inc pointerMov2b - 1306 bne moveloop2 - 1307 SectorMapReady - 1308 */ - 1308 - 1309 277C 20 C1 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO - 1310 277F 20 31 2C JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) - 1311 - 1312 2782 A2 00 LDX #$00 - 1313 2784 8A TXA - 1314 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) - 1315 2785 ClearLoop1 - 1316 2785 9D 00 01 STA $0100,X ; STOS !!! - 1317 2788 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) - 1318 278B 9D 00 05 STA $0500,X - 1319 278E 9D 00 06 STA $0600,X - 1320 2791 E0 80 CPX #$80 ;tylko ponad $80 - 1321 2793 90 02 BCC NoZpage - 1322 2795 95 00 STA $00,X ; czyli polowa strony zerowej - 1323 2797 NoZpage - 1324 2797 E8 INX - 1325 2798 D0 EB BNE ClearLoop1 - 1326 279A A2 FF LDX #$FF - 1327 279C 9A TXS ; "wyzerowanie wskaznika STOSU - 1328 - 1329 ; a tutaj otwieramy kanal 1 CIO do odczytu - 1330 - 1331 279D A2 10 LDX #1*16 ; kanal 1 - 1332 279F A9 03 LDA #COPN ; rozkaz OPEN - 1333 27A1 9D 42 03 STA ICCOM,X ; COMMAND - 1334 27A4 A9 04 LDA #$04 ; READ - 1335 27A6 9D 4A 03 STA ICAUX1,X - 1336 27A9 A9 00 LDA #$00 - 1337 27AB 9D 4B 03 STA ICAUX2,X - 1338 27AE A9 BE LDA # FileToOpen - 1341 27B5 9D 45 03 STA ICBADR+1,X - 1342 27B8 20 56 E4 JSR CIO - 1343 - 1344 27BB 4C 4D 08 JMP loader.LoadStart ; po przepisaniu - 1345 27BE FileToOpen - 1346 27BE 23 1A 00 .BYTE "C:",0 - 1347 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba - 1348 ; na koniec odpowiednie zmodyfikowanie MEMLO - 1349 27C1 ADDspeedProc - 1350 27C1 AD 96 21 LDA USmode - 1351 27C4 F0 5F beq NoHappyLoader - 1352 ; wyznaczamy offset procedury - 1353 27C6 38 SEC - 1354 27C7 A9 26 LDA #HappyUSMovedProc - 1358 27D1 ED E8 02 SBC MEMLO+1 - 1359 27D4 8D 83 2C STA HappyOffset+1 - 1360 - 1361 27D7 A0 00 LDY #0 - 1362 27D9 A2 09 LDX #[$A-1] ;xjsrA - the last - 1363 ; relokujemy skoki pod offset z MEMLO - 1364 27DB HappyRelocate - 1365 27DB 38 SEC - 1366 27DC BD 6E 2C LDA xjsrTableL,x - 1367 27DF 85 32 STA SecBuffer - 1368 27E1 BD 78 2C LDA xjsrTableH,x - 1369 27E4 85 33 STA SecBuffer+1 - 1370 27E6 B1 32 LDA (SecBuffer),y - 1371 27E8 ED 82 2C SBC HappyOffset - 1372 27EB 91 32 STA (SecBuffer),y - 1373 27ED C8 INY - 1374 27EE B1 32 LDA (SecBuffer),y - 1375 27F0 ED 83 2C SBC HappyOffset+1 - 1376 27F3 91 32 STA (SecBuffer),y - 1377 27F5 88 DEY - 1378 27F6 CA DEX - 1379 27F7 10 E2 BPL HappyRelocate - 1380 - 1381 27F9 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] - 1382 27FB label72x - 1383 27FB BD 26 28 LDA HappyUSMovedProc,X - 1384 = 27FF TurboRelocADDR=*+1 - 1385 27FE 9D 00 0A STA $0A00,X - 1386 2801 CA DEX - 1387 2802 E0 FF CPX #$FF - 1388 2804 D0 F5 BNE label72x - 1389 2806 A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] - 1390 2808 A2 00 LDX #$00 - 1391 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. - 1392 280A label73 - 1393 280A 98 TYA - 1394 280B 18 CLC - 1395 280C 6D E7 02 ADC MEMLO - 1396 280F 8D E7 02 STA MEMLO - 1397 2812 8A TXA - 1398 2813 6D E8 02 ADC MEMLO+1 - 1399 2816 8D E8 02 STA MEMLO+1 - 1400 2819 AD FF 27 LDA TurboRelocADDR - 1401 281C 8D A6 07 STA loader.SioJMP+1 ; po przepisaniu - 1402 281F AD 00 28 LDA TurboRelocADDR+1 - 1403 2822 8D A7 07 STA loader.SioJMP+2 ; po przepisaniu - 1404 2825 NoHappyLoader - 1405 2825 60 RTS - 1406 - 1407 + 179 org $1FFD + 180 + 181 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura + 182 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! + 183 = 07D7 FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu + 184 = 07D7 TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) + 185 + 186 START + 187 FFFF> 1FFD-2CE6> 4C 25 + JMP FirstRun ;1FFD 4C 70 21 + 188 + 189 + 190 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu + 191 ; do wczytania !!!!!! + 192 + 193 2000 movedproc + 194 0700 .local loader, $0700 + 195 + 196 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000 + 197 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych + 198 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO + 199 0700 ToFileEndH + 200 0700 00 00 .WO $0000 + 201 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + 202 0702 8A TXA + 203 0703 48 PHA + 204 0704 A5 28 LDA ToFileEndL + 205 0706 48 PHA + 206 0707 A5 3D LDA CompressedMapPos + 207 0709 48 PHA + 208 070A A5 3E LDA CompressedMapPos+1 + 209 070C 48 PHA + 210 070D 20 93 07 JSR GoInitAddr + 211 0710 68 PLA + 212 0711 85 3E STA CompressedMapPos+1 + 213 0713 68 PLA + 214 0714 85 3D STA CompressedMapPos + 215 0716 68 PLA + 216 0717 85 28 STA ToFileEndL + 217 0719 68 PLA + 218 071A AA TAX + 219 071B FileNextBlock + 220 ; wczytanie kolejnego bloku binarnego + 221 071B 20 88 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) + 222 071E C0 88 CPY #$88 ; czy EOF + 223 0720 D0 03 4C A6 07 jeq EndOfFile + 224 0725 A5 24 LDA InBlockAddr + 225 0727 25 25 AND InBlockAddr+1 + 226 0729 C9 FF CMP #$FF ; jesli oba sa $FF to..... + 227 072B D0 03 BNE FileNoFFFFHead + 228 072D 20 88 07 JSR FileGetBlockStart ; pobranie jeszcze raz + 229 0730 FileNoFFFFHead + 230 0730 A5 24 85 28 A5 25 + mwa InBlockAddr BlockATemp ; zapamietanie adresu poczatkowego bloku (na chwile) + 231 0738 A9 26 LDA #BlockLen + 234 073E 85 25 sta InBlockAddr+1 + 235 0740 20 B0 07 JSR GetFile2Bytes ; pobranie dwoch bajtow - ; Pobranie adresu konca ladowanego bloku + 236 0743 C0 88 CPY #$88 ; czy EOF + 237 0745 F0 5F beq EndOfFile + 238 ; wyliczenie długości bloku programu binarnego + 239 0747 38 sec + 240 0748 A5 26 lda BlockLen + 241 074A E5 28 sbc BlockATemp + 242 074C 85 26 sta BlockLen + 243 074E A5 27 lda BlockLen+1 + 244 0750 E5 29 sbc BlockATemp+1 + 245 0752 85 27 sta BlockLen+1 + 246 0754 E6 26 D0 02 E6 27 inw BlockLen + 247 075A A5 28 85 24 A5 29 + mwa BlockATemp InBlockAddr ; odtworzenie adresu poczatkowego bloku + 248 0762 38 SEC + 249 0763 WhatIsIt + 250 0763 B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y + 251 ; ktory tylko wylacza skok !!! + 252 0765 CE 63 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! + 253 0768 A5 24 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ + 254 076A 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu + 255 076D A5 25 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem + 256 076F 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). + 257 0772 FileNoFirstBlock + 258 0772 A9 AF LDA #Jrts ; jesli nie jest to blok z adresem inicjacji + 261 0779 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie + 262 + 263 077C BlockReadLoop ;; petla odczytujaca z pliku blok binarny + 264 077C 20 B8 07 JSR GetFileBytes + 265 077F C0 88 CPY #$88 ; czy EOF + 266 0781 F0 23 beq EndOfFile + 267 0783 F0 03 4C 02 07 jne FileInit ; koniec bloku - skok pod adres inicjalizacji + 268 0788 FileGetBlockStart + 269 0788 A9 24 LDA #InBlockAddr + 272 078E 85 25 sta InBlockAddr+1 + 273 0790 4C B0 07 JMP GetFile2Bytes ; pobranie dwoch bajtow + 274 0793 GoInitAddr + 275 0793 6C E2 02 JMP ($02E2) + 276 0796 SioJMP + 277 0796 20 59 E4 JSR JSIOINT + 278 ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + 279 0799 60 RTS + 280 079A blokDanychIO_Loader + 281 079A 31 01 52 40 D7 07 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 + 282 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) + 283 = 07A2 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 + 284 07A4 SectorNumber + 285 07A4 00 00 .WO $0000 + 286 07A6 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + 287 07A6 A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu + 288 07A8 48 PHA + 289 07A9 A9 73 LDA #<(JRESETWM-1) + 290 07AB 48 PHA + 291 ;WaitLine0 + 292 ; LDA VCOUNT + 293 ; bne WaitLine0 + 294 07AC 6C E0 02 JMP ($02E0) + 295 07AF Jrts + 296 07AF 60 RTS + 297 07B0 GetFile2Bytes + 298 07B0 A9 02 85 26 A9 00 + mwa #2 BlockLen + 299 07B8 GetFileBytes + 300 07B8 A2 10 LDX #16 ; kanal 1 + 301 07BA A9 07 LDA #CGBINR ; rozkaz BGET + 302 07BC 9D 42 03 STA ICCOM,X ; COMMAND + 303 07BF A5 24 LDA InBlockAddr + 304 07C1 9D 44 03 STA ICBUFA,x + 305 07C4 A5 25 LDA InBlockAddr+1 + 306 07C6 9D 45 03 STA ICBUFA+1,x + 307 07C9 A5 26 LDA BlockLen + 308 07CB 9D 48 03 STA ICBUFL,x + 309 07CE A5 27 LDA BlockLen+1 + 310 07D0 9D 49 03 STA ICBUFL+1,x + 311 07D3 4C 56 E4 JMP CIO + 312 + 313 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X + 314 ; potrzebny do obslugi sektorow wiekszych od 256b + 315 07D6 InSectorCountH + 316 07D6 00 .BY $00 + 317 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 + 318 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz + 319 ; w tym miejscu potem bedzie bufor + 320 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora + 321 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania + 322 07D7 zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie + 323 07D7 FirstMapSectorNr + 324 07D7 00 00 .WO $0000 + 325 07D9 LoadStart + 326 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + 327 07D9 AC E7 02 LDY MEMLO + 328 07DC AD E8 02 LDA MEMLO+1 + 329 07DF 8D E6 07 STA InMemClearLoop+2 + 330 07E2 OutMemClearLoop + 331 07E2 A9 00 LDA #$00 + 332 07E4 InMemClearLoop + 333 07E4 99 00 09 STA $0900,Y + 334 07E7 C8 INY + 335 07E8 D0 FA BNE InMemClearLoop + 336 07EA EE E6 07 INC InMemClearLoop+2 + 337 07ED AD E6 07 LDA InMemClearLoop+2 + 338 07F0 CD E6 02 CMP MEMTOP+1 + 339 07F3 90 ED BCC OutMemClearLoop + 340 07F5 AD E6 02 LDA MEMTOP+1 + 341 07F8 8D 02 08 STA LastMemPageClear+2 + 342 07FB AC E5 02 LDY MEMTOP + 343 07FE A9 00 LDA #$00 + 344 0800 LastMemPageClear + 345 0800 99 00 80 STA $8000,Y + 346 0803 88 DEY + 347 0804 C0 FF CPY #$FF + 348 0806 D0 F8 BNE LastMemPageClear + 349 ; wyczyszczona, wiec .... + 350 0808 AD 21 08 LDA tempToFileEndL + 351 080B 85 28 STA ToFileEndL + 352 080D A9 FF LDA #$FF + 353 080F 8D FC 02 STA KBCODES + 354 0812 EE 63 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) + 355 0815 AE A2 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora + 356 0818 AD A3 07 LDA Seclen+1 ; -- + 357 081B 8D D6 07 STA InSectorCountH ; -- obsluga sektorow ponad 256b + 358 ;jmp * + 359 081E 4C 1B 07 JMP FileNextBlock + 360 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku + 361 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera + 362 0821 tempToFileEndL + 363 0821 00 .BY $00 + 364 .endl + 365 2122 JAkieTurbo + 366 2122 USmode + 367 2122 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed + 368 2123 QMEG + 369 2123 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG + 370 2124 BootDrive + 371 2124 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi + 372 2125 BootShift + 373 2125 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety + 374 2126 FolderTurbo + 375 2126 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT + 376 2127 NewColors + 377 2127 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano + 378 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) + 379 2128 bin2AsciiHex + 380 2128 29 0F AND #$0F + 381 212A 09 30 ORA #$30 + 382 212C C9 3A CMP #$3A + 383 212E 90 03 BCC labelka + 384 2130 18 CLC + 385 2131 69 07 ADC #$07 + 386 2133 labelka + 387 2133 60 RTS + 388 2134 Edriver + 389 2134 45 3A 9B .BY "E:",$9b + 390 2137 EditorOpen + 391 ; otwarcie ekranu !!! + 392 2137 A2 00 LDX #$00 ; kanal nr 0 + 393 2139 20 F6 2A JSR CloseX ; najpierw Zamkniecie Ekranu + 394 213C 30 55 BMI ErrorDisplay + 395 213E A2 00 LDX #$00 ; kanal nr 0 + 396 2140 A9 03 LDA #$03 + 397 2142 9D 42 03 STA ICCMD,X + 398 2145 A9 0C LDA #$0C + 399 2147 9D 4A 03 STA ICAX1,X + 400 214A 9D 48 03 STA ICBUFL,X + 401 214D A9 00 LDA #$00 + 402 214F 9D 4B 03 STA ICAX2,X + 403 2152 9D 49 03 STA ICBUFL+1,X + 404 2155 A9 34 LDA #Edriver + 407 215C 9D 45 03 STA ICBUFA+1,X + 408 215F 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 + 409 2162 30 2F BMI ErrorDisplay + 410 2164 60 RTS + 411 + 412 2165 mainprog + 413 2165 AD 23 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US + 414 2168 2D 25 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza + 415 216B 8D 22 21 STA USmode + 416 216E F0 1E BEQ NoUSSpeed + 417 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler + 418 2170 A0 BC ldy #blokDanychIO_GetUSSpeed + 420 2174 20 E2 2A jsr Table2DCB + 421 2177 20 59 E4 jsr JSIOINT ; wysylamy "?" + 422 217A 10 07 bpl USSpeed + 423 217C A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage + 424 217E 8D 22 21 sta USmode + 425 2181 F0 0B beq NoUSSpeed + 426 2183 USSpeed + 427 2183 A0 02 LDY #$2 + 428 2185 USstatprint + 429 2185 B9 1E 2C LDA ONtext,y + 430 2188 99 F7 22 STA USstatus,y + 431 218B 88 DEY + 432 218C 10 F7 bpl USstatprint + 433 + 434 218E NoUSSpeed + 435 218E 4C D4 21 JMP ReadMainDir + 436 2191 Error148 + 437 2191 A0 94 LDY #$94 ; kod bledu do Y + 438 ; wyswietlenie komunikatu o bledzie - kod bledu w Y + 439 2193 ErrorDisplay + 440 2193 98 TYA + 441 2194 48 PHA + 442 2195 20 F4 2A JSR Close1 + 443 2198 68 PLA + 444 2199 48 PHA + 445 219A 4A LSR + 446 219B 4A LSR + 447 219C 4A LSR + 448 219D 4A LSR + 449 219E 20 28 21 JSR bin2AsciiHex ; 4 starsze bity na HEX + 450 21A1 8D BA 21 STA ErrorNumHex + 451 21A4 68 PLA + 452 21A5 20 28 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX + 453 21A8 8D BB 21 STA ErrorNumHex+1 + 454 21AB 20 47 2A JSR PrintXY + 455 21AE 00 00 .BY $00,$00 + 456 21B0 7D .BY $7d ; kod czyszczenia ekranu + 457 21B1 45 52 52 4F 52 20 + .BY "ERROR - $" + 458 21BA ErrorNumHex + 459 21BA 30 30 00 .BY "00",$00 + 460 ; czekamy na dowolny klawisz + 461 21BD A9 FF LDA #$FF + 462 21BF 8D FC 02 STA KBCODES + 463 21C2 WaitKloop + 464 21C2 AE FC 02 LDX KBCODES + 465 21C5 E8 INX + 466 21C6 F0 FA BEQ WaitKloop + 467 21C8 8D FC 02 STA KBCODES ; w A jest $FF + 468 ; ------------------ + 469 ; na wypadek wybrania nieistniejacej stacji + 470 ; po bledzie przechodzimy na te z ktorej sie ladowalismy + 471 21CB AD 24 21 LDA BootDrive + 472 ;LDA #1 + 473 21CE 20 99 2B JSR SeTDriveNR + 474 ; ----------------- + 475 21D1 4C 65 21 JMP mainprog ; i odpalamy program od nowa + 476 21D4 ReadMainDir + 477 21D4 20 C1 29 JSR ReadPERCOM + 478 21D7 A2 2D LDX #>FirstSectorBuff + 479 21D9 A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) + 488 21EB D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki + 489 21ED SpartaDisk + 490 21ED A2 00 LDX #$00 + 491 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 + 492 21EF AD 1F 2D LDA FirstSectorBuff+$1F + 493 21F2 30 04 BMI Sektor128b + 494 21F4 AA TAX + 495 21F5 A9 00 LDA #$00 + 496 21F7 E8 INX ; i wyliczenie starszego bajtu + 497 21F8 Sektor128b + 498 21F8 8D A2 20 STA .adr loader.SecLen ; przed przepisaniem + 499 21FB 8E A3 20 STX .adr loader.SecLen+1 ; przed przepisaniem + 500 ; pokazanie na ekranie + 501 21FE BD 1B 2C LDA DensityCodes,X + 502 2201 8D D3 22 STA DensityDisplay + 503 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + 504 2204 AC 09 2D LDY FirstSectorBuff+$09 + 505 2207 AE 0A 2D LDX FirstSectorBuff+$0A + 506 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x + 507 220A ReadDIR + 508 ; ustawienie znacznika wlaczenia Turbo dla katalogu + 509 220A A9 01 LDA #$01 + 510 220C 8D 26 21 STA FolderTurbo + 511 220F 84 D2 STY DirMapSect + 512 2211 86 D3 STX DirMapSect+1 + 513 2213 A9 2F LDA #>DirSectorBuff + 514 2215 85 D1 STA CurrentFileInfoBuff+1 + 515 2217 85 CB STA CurrentDirBuf+1 + 516 2219 A9 80 LDA #" + 658 2359 3A 4D 61 69 6E 20 + .BY ":Main Dir. " + 659 2365 BC .BY +$80,"<" + 660 2366 3A 55 50 2D 44 49 + .BY ":UP-DIR." + 661 236E 00 .BY $00 + 662 236F A9 00 LDA #$00 + 663 2371 85 D9 STA NamesOnScreen + 664 2373 label68 + 665 2373 A5 D1 LDA CurrentFileInfoBuff+1 + 666 2375 C5 CD CMP CurrentDirBufEnd+1 + 667 2377 90 08 BCC NoLastFileInDir + 668 2379 D0 55 BNE LastFilesPageJump + 669 237B A5 D0 LDA CurrentFileInfoBuff + 670 237D C5 CC CMP CurrentDirBufEnd + 671 237F B0 4F BCS LastFilesPageJump + 672 2381 NoLastFileInDir + 673 2381 A0 00 LDY #$00 + 674 2383 B1 D0 LDA (CurrentFileInfoBuff),Y + 675 2385 F0 49 BEQ LastFilesPageJump + 676 2387 A2 22 LDX #$22 + 677 2389 A9 20 LDA #$20 ; spacja + 678 238B label50 + 679 238B 9D 3C 24 STA GameName,X + 680 238E CA DEX + 681 238F 10 FA BPL label50 + 682 2391 A0 10 LDY #$10 + 683 2393 A2 0A LDX #$0A + 684 2395 label51 + 685 2395 B1 D0 LDA (CurrentFileInfoBuff),Y + 686 2397 9D 3C 24 STA GameName,X + 687 239A 88 DEY + 688 239B CA DEX + 689 239C 10 F7 BPL label51 + 690 239E A5 D9 LDA NamesOnScreen + 691 23A0 18 CLC + 692 23A1 69 41 ADC #$41 ; literka "A" + 693 23A3 8D 39 24 STA GameKeySymbol + 694 23A6 A5 D8 LDA $D8 + 695 23A8 D0 2C BNE label52 + 696 23AA A0 00 LDY #$00 + 697 ; status sprawdzanego pliku + 698 23AC B1 D0 LDA (CurrentFileInfoBuff),Y + 699 23AE 29 19 AND #$19 + 700 23B0 C9 09 CMP #$09 + 701 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + 702 23B2 F0 08 BEQ label53 + 703 23B4 A6 D7 LDX $D7 + 704 23B6 F0 1B BEQ label54 + 705 23B8 C9 08 CMP #$08 + 706 23BA D0 17 BNE label54 + 707 23BC label53 + 708 ; jeszcze raz status sprawdzanego pliku + 709 23BC B1 D0 LDA (CurrentFileInfoBuff),Y + 710 23BE 29 20 AND #$20 + 711 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + 712 23C0 F0 0B BEQ label55 + 713 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + 714 23C2 A2 08 LDX #$08 + 715 23C4 label56 + 716 23C4 BD 4B 25 LDA SubDirText,X + 717 23C7 8D 48 24 STA GameName+12 + 718 23CA CA DEX + 719 23CB 10 F7 BPL label56 + 720 23CD label55 + 721 23CD 4C 2C 24 JMP GameNamePrint + 722 23D0 LastFilesPageJump + 723 23D0 4C D4 24 JMP LastFilesPage + 724 23D3 label54 + 725 23D3 4C 84 24 JMP label59 + 726 23D6 label52 + 727 23D6 A0 00 LDY #$00 + 728 23D8 B1 D0 LDA (CurrentFileInfoBuff),Y + 729 23DA 29 18 AND #$18 + 730 23DC C9 08 CMP #$08 + 731 23DE D0 F3 BNE label54 + 732 23E0 A5 CC LDA CurrentDirBufEnd + 733 23E2 85 D4 STA $D4 + 734 23E4 A5 CD LDA CurrentDirBufEnd+1 + 735 23E6 85 D5 STA $D5 + 736 23E8 label65 + 737 23E8 A5 D5 LDA $D5 + 738 23EA C5 CF CMP $CF + 739 23EC 90 08 BCC label60 + 740 23EE D0 E3 BNE label54 + 741 23F0 A5 D4 LDA $D4 + 742 23F2 C5 CE CMP $CE + 743 23F4 B0 DD BCS label54 + 744 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy + 745 23F6 label60 + 746 23F6 A0 00 LDY #$00 + 747 23F8 B1 D4 LDA ($D4),Y + 748 23FA C9 2A CMP #'*' + 749 23FC D0 06 BNE CompareNames + 750 23FE 8D 27 21 STA NewColors + 751 2401 20 5F 2B JSR Asteriks + 752 2404 CompareNames + 753 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT + 754 2404 A0 0A LDY #$0A ; 8+3 znaki + 755 2406 Checking62 + 756 2406 B1 D4 LDA ($D4),Y + 757 2408 D9 3C 24 CMP GameName,Y + 758 240B D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw + 759 240D 88 DEY + 760 240E 10 F6 BPL Checking62 + 761 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + 762 2410 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku + 763 2412 ReplacingName + 764 2412 B1 D4 LDA ($D4),Y + 765 2414 99 31 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania + 766 2417 C8 INY + 767 2418 C0 2E CPY #$2E + 768 241A 90 F6 BCC ReplacingName + 769 241C B0 0E BCS GameNamePrint + 770 241E CheckNextName + 771 241E A5 D4 LDA $D4 + 772 2420 18 CLC + 773 2421 69 2E ADC #$2E + 774 2423 85 D4 STA $D4 + 775 2425 90 02 BCC label64 + 776 2427 E6 D5 INC $D5 + 777 2429 label64 + 778 2429 4C E8 23 JMP label65 + 779 242C GameNamePrint + 780 242C A5 D9 LDA NamesOnScreen + 781 242E 18 CLC + 782 242F 69 02 ADC #$02 + 783 2431 8D 38 24 STA YposGameName + 784 2434 20 47 2A JSR PrintXY + 785 2437 01 .BY $01 + 786 2438 YposGameName + 787 2438 02 .BY $02 + 788 2439 GameKeySymbol + 789 2439 41 29 20 .BY "A) " + 790 243C GameName + 791 243C 20 20 20 20 20 20 + .BY " " + 792 245F 00 .BY $00 + 793 2460 A5 D9 LDA NamesOnScreen + 794 2462 0A ASL + 795 2463 AA TAX + 796 2464 A5 D0 LDA CurrentFileInfoBuff + 797 2466 9D 31 2C STA FirstSectorsTable,X + 798 2469 A5 D1 LDA CurrentFileInfoBuff+1 + 799 246B 9D 32 2C STA FirstSectorsTable+1,X + 800 246E A5 D0 LDA CurrentFileInfoBuff + 801 2470 18 CLC + 802 2471 69 17 ADC #$17 + 803 2473 85 D0 STA CurrentFileInfoBuff + 804 2475 90 02 BCC label66 + 805 2477 E6 D1 INC CurrentFileInfoBuff+1 + 806 2479 label66 + 807 2479 E6 D9 INC NamesOnScreen + 808 247B A5 D9 LDA NamesOnScreen + 809 247D C9 13 CMP #$13 + 810 247F B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + 811 2481 4C 73 23 JMP label68 + 812 2484 label59 + 813 2484 A5 D0 LDA CurrentFileInfoBuff + 814 2486 18 CLC + 815 2487 69 17 ADC #$17 + 816 2489 85 D0 STA CurrentFileInfoBuff + 817 248B 90 02 BCC label69 + 818 248D E6 D1 INC CurrentFileInfoBuff+1 + 819 248F label69 + 820 248F 4C 73 23 JMP label68 + 821 2492 MainDirKEY + 822 2492 4C D4 21 JMP ReadMainDir + 823 2495 UpDirKEY + 824 2495 A0 02 LDY #$02 + 825 2497 B1 CA LDA (CurrentDirBuf),Y + 826 2499 AA TAX + 827 249A 88 DEY + 828 249B 11 CA ORA (CurrentDirBuf),Y + 829 249D F0 37 BEQ KeyboardProc + 830 249F B1 CA LDA (CurrentDirBuf),Y + 831 24A1 A8 TAY + 832 24A2 4C 0A 22 JMP ReadDIR + 833 24A5 EscKEY + 834 ; sprawdzmy czy z Shift + 835 24A5 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! + 836 24A8 29 08 and #$08 + 837 24AA D0 06 BNE NoSHIFTEsc + 838 24AC 20 37 21 JSR EditorOpen + 839 24AF 6C 0A 00 JMP (DOSVEC) + 840 24B2 NoSHIFTEsc + 841 24B2 A2 00 LDX #$00 + 842 24B4 86 D8 STX $D8 + 843 24B6 E8 INX + 844 24B7 86 D7 STX $D7 + 845 24B9 ToStartOfDirJump + 846 24B9 4C BC 22 JMP ToStartOfDir + 847 24BC SpaceKEY + 848 24BC A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy + 849 24BE D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku + 850 24C0 4C CD 22 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej + 851 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie + 852 24C3 ContArrowsPrint + 853 24C3 20 47 2A JSR PrintXY + 854 24C6 01 15 .BY $01,$15 + 855 24C8 1D .BY $1D ; strzalka w dol + 856 24C9 00 .BY $00 + 857 24CA 20 47 2A JSR PrintXY + 858 24CD 0E 15 .BY $0E,$15 + 859 24CF 1D .BY $1D ; strzalka w dol + 860 24D0 00 .BY $00 + 861 24D1 4C D6 24 JMP KeyboardProc + 862 24D4 LastFilesPage + 863 24D4 E6 D6 INC LastFilesPageFlag + 864 24D6 KeyboardProc + 865 24D6 AD 27 21 LDA NewColors + 866 24D9 D0 0D BNE ColorsAlreadySet + 867 24DB A9 C4 LDA #$C4 ; ustawienie koloru tła i liter + 868 24DD 8D C6 02 STA COLPF2S + 869 24E0 8D C8 02 STA COLBAKS + 870 24E3 A9 CA LDA #$CA + 871 24E5 8D C5 02 STA COLPF1S + 872 24E8 ColorsAlreadySet + 873 24E8 20 FE 2A JSR GetKey + 874 24EB 29 7F AND #%01111111 ; eliminujemy invers + 875 24ED F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + 876 24EF C9 3E CMP #$3E ; ">" + 877 24F1 F0 9F BEQ MainDirKEY + 878 24F3 C9 3C CMP #$3C ; "<" + 879 24F5 F0 9E BEQ UpDirKEY + 880 24F7 C9 7E CMP #$7E ; BackSpace + 881 24F9 F0 9A BEQ UpDirKEY + 882 24FB C9 1B CMP #$1B ; Esc + 883 24FD F0 A6 BEQ EscKEY + 884 24FF C9 20 CMP #$20 ; Spacja + 885 2501 F0 B9 BEQ SpaceKEY + 886 ; ---------------- + 887 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + 888 2503 C9 10 CMP #$10 + 889 2505 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + 890 2507 20 AC 2B JSR SeTDriveLetter + 891 250A 4C 65 21 JMP mainprog + 892 250D noCtrlLetter + 893 ; sprawdzenie klawiszy 1-8 + 894 250D C9 31 CMP #'1' + 895 250F 90 0D BCC NoNumber + 896 2511 C9 39 CMP #'9' + 897 2513 B0 09 BCS NoNumber + 898 2515 38 SEC + 899 2516 E9 30 SBC #'0' + 900 2518 20 99 2B JSR SeTDriveNR + 901 251B 4C 65 21 JMP mainprog + 902 ; ----------------- + 903 251E NoNumber + 904 251E C9 61 CMP #'a' ; czy nie ma capsa + 905 2520 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany + 906 2522 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) + 907 2524 BigLetters + 908 2524 38 SEC + 909 2525 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy + 910 2527 C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie + 911 2529 B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz + 912 252B 0A ASL + 913 252C AA TAX + 914 252D BD 31 2C LDA FirstSectorsTable,X + 915 2530 85 D4 STA $D4 + 916 2532 BD 32 2C LDA FirstSectorsTable+1,X + 917 2535 85 D5 STA $D5 + 918 2537 A0 00 LDY #$00 + 919 2539 B1 D4 LDA ($D4),Y + 920 253B 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik + 921 253D F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader + 922 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran + 923 253F A0 02 LDY #$02 + 924 2541 B1 D4 LDA ($D4),Y + 925 2543 AA TAX + 926 2544 88 DEY + 927 2545 B1 D4 LDA ($D4),Y + 928 2547 A8 TAY + 929 2548 4C 0A 22 JMP ReadDIR + 930 254B SubDirText + 931 254B 3C 53 55 42 2D 44 + .BY "" + 932 2554 GOtoLoader + 933 2554 20 48 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 934 2557 F0 03 BEQ DiskNotChanged1 + 935 2559 4C D4 21 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego + 936 255C DiskNotChanged1 + 937 255C AD 26 21 LDA FolderTurbo + 938 255F F0 07 BEQ SetTurboOFF + 939 2561 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + 940 2564 29 08 and #$08 + 941 2566 D0 03 BNE NoSHIFT + 942 2568 SetTurboOFF + 943 2568 8D 22 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 + 944 256B NoSHIFT + 945 256B A0 01 LDY #$01 + 946 256D B1 D4 LDA ($D4),Y + 947 256F 8D D7 20 STA .adr loader.FirstMapSectorNr ; przed przepisaniem + 948 2572 8D 44 2A sta blokDanychIO+$A ; od razu do bloku IOCB + 949 2575 C8 INY + 950 2576 B1 D4 LDA ($D4),Y + 951 2578 8D D8 20 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + 952 257B 8D 45 2A sta blokDanychIO+$B ; od razu do bloku IOCB + 953 257E C8 INY + 954 257F B1 D4 LDA ($D4),Y + 955 2581 49 FF EOR #$FF + 956 2583 8D 21 21 STA .adr loader.tempToFileEndL + 957 2586 C8 INY + 958 2587 B1 D4 LDA ($D4),Y + 959 2589 49 FF EOR #$FF + 960 258B 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem + 961 258E C8 INY + 962 258F B1 D4 LDA ($D4),Y + 963 2591 49 FF EOR #$FF + 964 2593 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem + 965 ; wszystko zapamietane mozna robic mape sektorow.... + 966 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu + 967 ; czyli DirSectorBuff + 968 ; sektor mapy przed kompresja leci do DirMapSectorBuff + 969 ; UWAGA + 970 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi + 971 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! + 972 = 2F80 CompressedMap = DirSectorBuff + 973 ; czytamy pierwszy sektor mapy + 974 2596 A0 80 LDY #DirMapSectorBuff + 976 259A 20 0C 2A Jsr ReadSector + 977 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! + 978 259D A9 00 LDA #00 + 979 259F 85 82 STA CompressedMapCounter + 980 25A1 85 83 STA CompressedMapCounter+1 + 981 25A3 20 6F 26 JSR AddToCompressedMAP + 982 25A6 AD 84 2D LDA DirMapSectorBuff+4 + 983 25A9 85 86 STA PrevFileSector + 984 25AB 20 6F 26 JSR AddToCompressedMAP + 985 25AE AD 85 2D LDA DirMapSectorBuff+5 + 986 25B1 85 87 sta PrevFileSector+1 + 987 25B3 20 6F 26 JSR AddToCompressedMAP + 988 ; Inicjujemy liczniki + 989 25B6 .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 + 990 25B6 .zpvar PrevFileSector, MapPositionMem .word + 991 25B6 .zpvar SectorOffset .word + 992 25B6 .zpvar SectorsCounter .byte + 993 25B6 A9 00 LDA #$00 + 994 25B8 85 81 STA MapCounter+1 + 995 25BA 85 8C STA SectorsCounter + 996 25BC A9 06 lda #$06 + 997 25BE 85 80 STA MapCounter + 998 25C0 GenerateCompressedMap + 999 25C0 18 CLC + 1000 25C1 A9 80 LDA #DirMapSectorBuff + 1004 25C9 65 81 ADC MapCounter+1 + 1005 25CB 85 89 STA MAPPositionMem+1 + 1006 25CD A2 00 LDX #0 + 1007 25CF A0 01 LDY #1 + 1008 25D1 A1 88 LDA (MAPPositionMem,x) + 1009 25D3 11 88 ORA (MAPPositionMem),y + 1010 25D5 F0 56 BEQ Sector00 + 1011 25D7 38 SEC + 1012 25D8 A1 88 LDA (MAPPositionMem,x) + 1013 25DA E5 86 SBC PrevFileSector + 1014 25DC 85 8A STA SectorOffset + 1015 25DE B1 88 LDA (MAPPositionMem),y + 1016 25E0 E5 87 SBC PrevFileSector+1 + 1017 25E2 85 8B STA SectorOffset+1 + 1018 ; mamy odstep miedzy poprzednim a nastepnym sektorem + 1019 25E4 D0 26 BNE OffsetToBig + 1020 25E6 A5 8A LDA SectorOffset + 1021 25E8 30 22 BMI OffsetToBig ; max przeskok 127 sektorow + 1022 25EA C9 01 CMP #$01 + 1023 25EC D0 11 BNE JumpForward + 1024 ; kolejny sektor + 1025 ; zwiekszamy wiec licznik + 1026 25EE E6 8C inc SectorsCounter + 1027 25F0 A5 8C LDA SectorsCounter + 1028 25F2 C9 7F CMP #%01111111 + 1029 25F4 D0 2C BNE GetNextMapWord + 1030 ; tu licznik dotarl do konca zerujemy go + 1031 ; dodajemy wpis do skompresowanej mapy i gotowe + 1032 25F6 20 6F 26 JSR AddToCompressedMAP + 1033 25F9 A9 00 LDA #0 + 1034 25FB 85 8C STA SectorsCounter + 1035 25FD F0 23 BEQ GetNextMapWord + 1036 ; ominiecie wyznaczonej ilości sektorów (w A) + 1037 25FF JumpForward + 1038 25FF 20 8A 26 JSR FlushBuffer + 1039 2602 A5 8A LDA SectorOffset + 1040 2604 09 80 ORA #%10000000 + 1041 2606 20 6F 26 JSR AddToCompressedMAP + 1042 2609 4C 22 26 JMP GetNextMapWord + 1043 ; wyznaczenie skoku do nowego sektora pliku + 1044 260C OffsetToBig + 1045 260C 20 8A 26 JSR FlushBuffer + 1046 260F A9 00 LDA #0 + 1047 2611 20 6F 26 JSR AddToCompressedMAP + 1048 2614 A0 00 LDY #00 + 1049 2616 B1 88 LDA (MAPPositionMem),y + 1050 2618 20 6F 26 JSR AddToCompressedMAP + 1051 261B A0 01 LDY #01 + 1052 261D B1 88 LDA (MAPPositionMem),y + 1053 261F 20 6F 26 JSR AddToCompressedMAP + 1054 2622 GetNextMapWord + 1055 ; zapamietanie numeru obecnego sektora do porownania potem + 1056 2622 A0 00 LDY #00 + 1057 2624 B1 88 LDA (MAPPositionMem),y + 1058 2626 85 86 STA PrevFileSector + 1059 2628 C8 INY + 1060 2629 B1 88 LDA (MAPPositionMem),y + 1061 262B 85 87 STA PrevFileSector+1 + 1062 262D Sector00 + 1063 262D 18 A5 80 69 02 85 + ADW MapCounter #2 + 1064 2638 ops01 + 1065 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala + 1066 2638 A5 81 LDA MapCounter+1 + 1067 263A CD A3 20 CMP .adr loader.SecLen+1 + 1068 263D D0 05 bne noteqal01 + 1069 263F A5 80 LDA MapCounter + 1070 2641 CD A2 20 CMP .adr loader.SecLen + 1071 2644 noteqal01 + 1072 2644 F0 03 4C C0 25 JNE GenerateCompressedMap + 1073 ; czytamy nastepny sektor mapy + 1074 ; sprawdzmy czy nie koniec + 1075 2649 AD 80 2D LDA DirMapSectorBuff + 1076 264C 0D 81 2D ORA DirMapSectorBuff+1 + 1077 264F F0 45 BEQ EndMakingMap + 1078 2651 AD 80 2D LDA DirMapSectorBuff + 1079 2654 8D 44 2A sta blokDanychIO+$A + 1080 2657 AD 81 2D LDA DirMapSectorBuff+1 + 1081 265A 8D 45 2A sta blokDanychIO+$B + 1082 265D A0 80 LDY #DirMapSectorBuff + 1084 2661 20 0C 2A Jsr ReadSector + 1085 ; zerujemy licznik mapy + 1086 2664 A9 00 LDA #$00 + 1087 2666 85 81 STA MapCounter+1 + 1088 2668 A9 04 lda #$04 + 1089 266A 85 80 STA MapCounter + 1090 266C 4C C0 25 JMP GenerateCompressedMap + 1091 ; dpisanie bajtu z A do mapy sektorow skompresowanej + 1092 266F AddToCompressedMAP + 1093 266F 48 PHA + 1094 ; wyliczamy adresa + 1095 2670 18 CLC + 1096 2671 A5 82 LDA CompressedMapCounter + 1097 2673 69 80 ADC #CompressedMap + 1101 267C 8D 82 26 STA xxxxbla+1 + 1102 267F 68 PLA + 1103 = 2681 xxxxbla=*+1 + 1104 2680 8D FF FF STA $FFFF + 1105 2683 E6 82 INC CompressedMapCounter + 1106 2685 D0 02 BNE noinc013 + 1107 2687 E6 83 INC CompressedMapCounter+1 + 1108 2689 noinc013 + 1109 2689 60 RTS + 1110 268A FlushBuffer + 1111 268A A5 8C LDA SectorsCounter + 1112 268C F0 07 BEQ NoFlush + 1113 268E 20 6F 26 JSR AddToCompressedMAP + 1114 2691 A9 00 LDA #0 + 1115 2693 85 8C STA SectorsCounter + 1116 2695 NoFlush + 1117 2695 60 RTS + 1118 2696 EndMakingMap + 1119 2696 20 8A 26 JSR FlushBuffer + 1120 2699 LoaderGo + 1121 2699 A0 00 LDY #$00 + 1122 269B 8C 44 02 STY COLDST + 1123 269E A9 01 LDA #$01 + 1124 26A0 85 09 STA BOOT + 1125 26A2 AE 00 07 LDX $700 + 1126 26A5 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta + 1127 26A7 D0 03 BNE NoRunFromDOS + 1128 26A9 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! + 1129 ; STA $D5EC ; to wylacza SpartaDOS X + 1130 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) + 1131 26AC NoRunFromDOS + 1132 26AC A9 BD LDA #AfterWormStart + 1135 26B2 85 0D STA DOSINI+1 + 1136 ; LDA #>JRESETCD + 1137 ; STA DOSVEC+1 + 1138 ; LDA #TempMEMLO + 1159 26D0 6D A3 20 ADC .adr loader.SecLen+1 + 1160 26D3 8D E8 02 STA MEMLO+1 + 1161 26D6 85 3E STA CompressedMapPos+1 + 1162 ; STA pointerMov2b + 1163 ; STA APPMHI+1 + 1164 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora + 1165 ; jest to jednoczesnie adres umieszczenia skompresowanej + 1166 ; mapy sektorow pliku dla loadera ale MINUS 1 + 1167 26D8 A5 3D D0 02 C6 3E + DEW CompressedMapPos + 1168 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej + 1169 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) + 1170 26E0 18 CLC + 1171 26E1 AD E7 02 LDA MEMLO + 1172 ; ADC CompressedMapCounter + 1173 ; STA MEMLO + 1174 26E4 8D 96 27 STA TurboRelocADDR + 1175 26E7 AD E8 02 LDA MEMLO+1 + 1176 ; ADC CompressedMapCounter+1 + 1177 ; STA MEMLO+1 + 1178 26EA 8D 97 27 STA TurboRelocADDR+1 + 1179 26ED A9 71 LDA #JTESTROM + 1182 26F3 85 0D STA DOSINI+1 + 1183 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) + 1184 ; INC $033D ; bajty kontrolne zimnego startu + 1185 ; INC $033E ; zmiana ich wartosci wymusza + 1186 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) + 1187 26F5 A2 00 LDX #$00 + 1188 26F7 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) + 1189 ; STX BOOT + 1190 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci + 1191 26F9 moveloop1 + 1192 26F9 BD 00 20 LDA movedproc,X + 1193 26FC 9D 00 07 STA $0700,X + 1194 26FF BD 00 21 LDA movedproc+$0100,X + 1195 2702 9D 00 08 STA $0800,X + 1196 2705 E8 INX + 1197 2706 D0 F1 BNE moveloop1 + 1198 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora + 1199 /* moveloop2 + 1200 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy + 1201 pointerMov2a=*+2 + 1202 LDA CompressedMap,x ; kod samomodyfikujacy sie + 1203 pointerMov2b=*+2 + 1204 STA $FFFF,x ; kod samomodyfikujacy sie + 1205 LDA CompressedMapCounter + 1206 AND CompressedMapCounter+1 + 1207 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! + 1208 BEQ SectorMapReady + 1209 INX + 1210 BNE moveloop2 + 1211 inc pointerMov2a + 1212 inc pointerMov2b + 1213 bne moveloop2 + 1214 SectorMapReady + 1215 */ + 1215 + 1216 2708 20 58 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + 1217 270B 20 C8 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 1218 + 1219 270E A2 00 LDX #$00 + 1220 2710 8A TXA + 1221 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) + 1222 2711 ClearLoop1 + 1223 2711 9D 00 01 STA $0100,X ; STOS !!! + 1224 2714 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) + 1225 2717 9D 00 05 STA $0500,X + 1226 271A 9D 00 06 STA $0600,X + 1227 271D E0 80 CPX #$80 ;tylko ponad $80 + 1228 271F 90 02 BCC NoZpage + 1229 2721 95 00 STA $00,X ; czyli polowa strony zerowej + 1230 2723 NoZpage + 1231 2723 E8 INX + 1232 2724 D0 EB BNE ClearLoop1 + 1233 2726 A2 FF LDX #$FF + 1234 2728 9A TXS ; "wyzerowanie wskaznika STOSU + 1235 + 1236 ; a tutaj otwieramy kanal 1 CIO do odczytu + 1237 + 1238 2729 A2 10 LDX #16 ; kanal 1 + 1239 272B A9 03 LDA #COPN ; rozkaz OPEN + 1240 272D 9D 42 03 STA ICCOM,X ; COMMAND + 1241 2730 A9 04 LDA #$04 ; READ + 1242 2732 9D 4A 03 STA ICAUX1,X + 1243 2735 A9 00 LDA #$00 + 1244 2737 9D 4B 03 STA ICAUX2,X + 1245 273A A9 4A LDA # FileToOpen + 1248 2741 9D 45 03 STA ICBADR+1,X + 1249 2744 20 56 E4 JSR CIO + 1250 + 1251 2747 4C D9 07 JMP loader.LoadStart ; po przepisaniu + 1252 274A FileToOpen + 1253 274A 28 1A 33 23 2F 32 + .BYTE "H:SCORCH.XEX",155,0 + 1254 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba + 1255 ; na koniec odpowiednie zmodyfikowanie MEMLO + 1256 2758 ADDspeedProc + 1257 2758 AD 22 21 LDA USmode + 1258 275B F0 5F beq NoHappyLoader + 1259 ; wyznaczamy offset procedury + 1260 275D 38 SEC + 1261 275E A9 BD LDA #HappyUSMovedProc + 1265 2768 ED E8 02 SBC MEMLO+1 + 1266 276B 8D 1A 2C STA HappyOffset+1 + 1267 + 1268 276E A0 00 LDY #0 + 1269 2770 A2 09 LDX #[$A-1] ;xjsrA - the last + 1270 ; relokujemy skoki pod offset z MEMLO + 1271 2772 HappyRelocate + 1272 2772 38 SEC + 1273 2773 BD 05 2C LDA xjsrTableL,x + 1274 2776 85 32 STA SecBuffer + 1275 2778 BD 0F 2C LDA xjsrTableH,x + 1276 277B 85 33 STA SecBuffer+1 + 1277 277D B1 32 LDA (SecBuffer),y + 1278 277F ED 19 2C SBC HappyOffset + 1279 2782 91 32 STA (SecBuffer),y + 1280 2784 C8 INY + 1281 2785 B1 32 LDA (SecBuffer),y + 1282 2787 ED 1A 2C SBC HappyOffset+1 + 1283 278A 91 32 STA (SecBuffer),y + 1284 278C 88 DEY + 1285 278D CA DEX + 1286 278E 10 E2 BPL HappyRelocate + 1287 + 1288 2790 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] + 1289 2792 label72x + 1290 2792 BD BD 27 LDA HappyUSMovedProc,X + 1291 = 2796 TurboRelocADDR=*+1 + 1292 2795 9D 00 0A STA $0A00,X + 1293 2798 CA DEX + 1294 2799 E0 FF CPX #$FF + 1295 279B D0 F5 BNE label72x + 1296 279D A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] + 1297 279F A2 00 LDX #$00 + 1298 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. + 1299 27A1 label73 + 1300 27A1 98 TYA + 1301 27A2 18 CLC + 1302 27A3 6D E7 02 ADC MEMLO + 1303 27A6 8D E7 02 STA MEMLO + 1304 27A9 8A TXA + 1305 27AA 6D E8 02 ADC MEMLO+1 + 1306 27AD 8D E8 02 STA MEMLO+1 + 1307 27B0 AD 96 27 LDA TurboRelocADDR + 1308 27B3 8D 97 07 STA loader.SioJMP+1 ; po przepisaniu + 1309 27B6 AD 97 27 LDA TurboRelocADDR+1 + 1310 27B9 8D 98 07 STA loader.SioJMP+2 ; po przepisaniu + 1311 27BC NoHappyLoader + 1312 27BC 60 RTS + 1313 + 1314 + 1315 + 1316 ; UWAGA !!!!!!!!!!!!!! + 1317 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! + 1318 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone + 1319 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! + 1320 27BD HappyUSMovedProc ; + 1321 + 1322 27BD AD 04 03 LDA DBUFA + 1323 27C0 85 32 STA SecBuffer + 1324 27C2 AD 05 03 LDA DBUFA+1 + 1325 27C5 85 33 STA SecBuffer+1 + 1326 + 1327 27C7 AD 08 03 LDA DBYT + 1328 27CA 85 31 STA SecLenUS + 1329 + 1330 27CC 78 SEI + 1331 27CD BA TSX + 1332 27CE 86 37 STX StackCopy + 1333 27D0 A9 0D LDA #$0D + 1334 27D2 85 34 STA CRETRYZ + 1335 ;command retry on zero page + 1336 27D4 CommandLoop + 1337 = 27D5 HappySpeed = *+1 + 1338 27D4 A9 28 LDA #$28 ;here goes speed from "?" + 1339 27D6 8D 04 D2 STA AUDF3 + 1340 27D9 A9 34 LDA #$34 + 1341 27DB 8D 03 D3 STA PBCTL ;ustawienie linii command + 1342 27DE A2 80 LDX #$80 + 1343 27E0 DelayLoopCmd + 1344 27E0 CA DEX + 1345 27E1 D0 FD BNE DelayLoopCmd + 1346 27E3 8E 06 D2 STX AUDF4 ; zero + 1347 27E6 86 35 STX TransmitError + 1348 ; pokey init + 1349 27E8 A9 23 LDA #$23 + 1350 27EA 20 5E 28 xjsr1 JSR SecTransReg + 1351 ; + 1352 + 1353 27ED 18 CLC + 1354 27EE AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + 1355 27F1 6D 01 03 ADC DUNIT ; dodajemy numer stacji + 1356 27F4 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + 1357 27F6 85 30 STA CheckSum + 1358 27F8 8D 0D D2 STA SEROUT + 1359 27FB AD 02 03 LDA DCOMND + 1360 27FE 20 74 28 xjsr2 JSR PutSIOByte + 1361 2801 AD 0A 03 LDA DAUX1 + 1362 2804 20 74 28 xjsr3 JSR PutSIOByte + 1363 2807 AD 0B 03 LDA DAUX2 + 1364 280A 20 74 28 xjsr4 JSR PutSIOByte + 1365 280D A5 30 LDA CheckSum + 1366 280F 20 74 28 xjsr5 JSR PutSIOByte + 1367 + 1368 2812 waitforEndOftransmission + 1369 2812 AD 0E D2 LDA IRQST + 1370 2815 29 08 AND #$08 + 1371 2817 D0 F9 BNE waitforEndOftransmission + 1372 + 1373 2819 A9 13 LDA #$13 + 1374 281B 20 5E 28 xjsr6 JSR SecTransReg + 1375 + 1376 281E A9 3C LDA #$3c + 1377 2820 8D 03 D3 STA PBCTL ;command line off + 1378 ; two ACK's + 1379 2823 A0 02 LDY #2 + 1380 2825 DoubleACK + 1381 2825 20 90 28 xjsr7 JSR GetSIOByte + 1382 2828 C9 44 CMP #$44 + 1383 282A B0 19 BCS ErrorHere + 1384 282C 88 DEY + 1385 282D D0 F6 BNE DoubleACK + 1386 + 1387 ;ldy #0 + 1388 282F 84 30 STY CheckSum + 1389 2831 ReadSectorLoop + 1390 2831 20 90 28 xjsr8 JSR GetSIOByte + 1391 2834 91 32 STA (SecBuffer),y + 1392 2836 20 88 28 xjsr9 JSR AddCheckSum + 1393 2839 C8 INY + 1394 283A C4 31 CPY SecLenUS + 1395 283C D0 F3 BNE ReadSectorLoop + 1396 + 1397 283E 20 90 28 xjsrA JSR GetSIOByte + 1398 2841 C5 30 CMP CheckSum + 1399 2843 F0 0B BEQ EndOfTransmission + 1400 ;error!!! + 1401 2845 ErrorHere + 1402 2845 A0 90 LDY #$90 + 1403 2847 84 35 STY TransmitError + 1404 2849 A6 37 LDX StackCopy + 1405 284B 9A TXS + 1406 284C C6 34 DEC CRETRYZ + 1407 284E D0 84 BNE CommandLoop 1408 - 1409 ; UWAGA !!!!!!!!!!!!!! - 1410 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! - 1411 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone - 1412 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! - 1413 2826 HappyUSMovedProc ; - 1414 - 1415 2826 AD 04 03 LDA DBUFA - 1416 2829 85 32 STA SecBuffer - 1417 282B AD 05 03 LDA DBUFA+1 - 1418 282E 85 33 STA SecBuffer+1 - 1419 - 1420 2830 AD 08 03 LDA DBYT - 1421 2833 85 31 STA SecLenUS - 1422 - 1423 2835 78 SEI - 1424 2836 BA TSX - 1425 2837 86 37 STX StackCopy - 1426 2839 A9 0D LDA #$0D - 1427 283B 85 34 STA CRETRYZ - 1428 ;command retry on zero page - 1429 283D CommandLoop - 1430 = 283E HappySpeed = *+1 - 1431 283D A9 28 LDA #$28 ;here goes speed from "?" - 1432 283F 8D 04 D2 STA AUDF3 - 1433 2842 A9 34 LDA #$34 - 1434 2844 8D 03 D3 STA PBCTL ;ustawienie linii command - 1435 2847 A2 80 LDX #$80 - 1436 2849 DelayLoopCmd - 1437 2849 CA DEX - 1438 284A D0 FD BNE DelayLoopCmd - 1439 284C 8E 06 D2 STX AUDF4 ; zero - 1440 284F 86 35 STX TransmitError - 1441 ; pokey init - 1442 2851 A9 23 LDA #$23 - 1443 2853 20 C7 28 xjsr1 JSR SecTransReg - 1444 ; - 1445 - 1446 2856 18 CLC - 1447 2857 AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) - 1448 285A 6D 01 03 ADC DUNIT ; dodajemy numer stacji - 1449 285D 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) - 1450 285F 85 30 STA CheckSum - 1451 2861 8D 0D D2 STA SEROUT - 1452 2864 AD 02 03 LDA DCOMND - 1453 2867 20 DD 28 xjsr2 JSR PutSIOByte - 1454 286A AD 0A 03 LDA DAUX1 - 1455 286D 20 DD 28 xjsr3 JSR PutSIOByte - 1456 2870 AD 0B 03 LDA DAUX2 - 1457 2873 20 DD 28 xjsr4 JSR PutSIOByte - 1458 2876 A5 30 LDA CheckSum - 1459 2878 20 DD 28 xjsr5 JSR PutSIOByte - 1460 - 1461 287B waitforEndOftransmission - 1462 287B AD 0E D2 LDA IRQST - 1463 287E 29 08 AND #$08 - 1464 2880 D0 F9 BNE waitforEndOftransmission - 1465 - 1466 2882 A9 13 LDA #$13 - 1467 2884 20 C7 28 xjsr6 JSR SecTransReg - 1468 - 1469 2887 A9 3C LDA #$3c - 1470 2889 8D 03 D3 STA PBCTL ;command line off - 1471 ; two ACK's - 1472 288C A0 02 LDY #2 - 1473 288E DoubleACK - 1474 288E 20 F9 28 xjsr7 JSR GetSIOByte - 1475 2891 C9 44 CMP #$44 - 1476 2893 B0 19 BCS ErrorHere - 1477 2895 88 DEY - 1478 2896 D0 F6 BNE DoubleACK - 1479 - 1480 ;ldy #0 - 1481 2898 84 30 STY CheckSum - 1482 289A ReadSectorLoop - 1483 289A 20 F9 28 xjsr8 JSR GetSIOByte - 1484 289D 91 32 STA (SecBuffer),y - 1485 289F 20 F1 28 xjsr9 JSR AddCheckSum - 1486 28A2 C8 INY - 1487 28A3 C4 31 CPY SecLenUS - 1488 28A5 D0 F3 BNE ReadSectorLoop - 1489 - 1490 28A7 20 F9 28 xjsrA JSR GetSIOByte - 1491 28AA C5 30 CMP CheckSum - 1492 28AC F0 0B BEQ EndOfTransmission - 1493 ;error!!! - 1494 28AE ErrorHere - 1495 28AE A0 90 LDY #$90 - 1496 28B0 84 35 STY TransmitError - 1497 28B2 A6 37 LDX StackCopy - 1498 28B4 9A TXS - 1499 28B5 C6 34 DEC CRETRYZ - 1500 28B7 D0 84 BNE CommandLoop - 1501 - 1502 28B9 EndOfTransmission - 1503 28B9 A9 00 LDA #0 - 1504 28BB 8D 07 D2 STA AUDC4 - 1505 28BE A5 10 LDA IRQENS - 1506 28C0 8D 0E D2 STA IRQEN - 1507 28C3 58 CLI - 1508 28C4 A4 35 LDY TransmitError - 1509 28C6 60 RTS - 1510 - 1511 28C7 SecTransReg - 1512 28C7 8D 0F D2 STA SKCTL - 1513 28CA 8D 0A D2 STA SKSTRES - 1514 28CD A9 38 LDA #$38 - 1515 28CF 8D 0E D2 STA IRQEN - 1516 28D2 A9 28 LDA #$28 - 1517 28D4 8D 08 D2 STA AUDCTL - 1518 28D7 A9 A8 LDA #$A8 - 1519 28D9 8D 07 D2 STA AUDC4 - 1520 28DC 60 RTS - 1521 - 1522 28DD PutSIOByte - 1523 28DD AA TAX - 1524 28DE waitforSerial - 1525 28DE AD 0E D2 LDA IRQST - 1526 28E1 29 10 AND #$10 - 1527 28E3 D0 F9 BNE waitforSerial - 1528 - 1529 28E5 8D 0E D2 STA IRQEN - 1530 28E8 A9 10 LDA #$10 - 1531 28EA 8D 0E D2 STA IRQEN - 1532 - 1533 28ED 8A TXA - 1534 28EE 8D 0D D2 STA SEROUT - 1535 - 1536 28F1 AddCheckSum - 1537 28F1 18 CLC - 1538 28F2 65 30 ADC CheckSum - 1539 28F4 69 00 ADC #0 - 1540 28F6 85 30 STA CheckSum - 1541 28F8 60 RTS - 1542 - 1543 28F9 GetSIOByte - 1544 28F9 A2 0A LDX #10 ;acktimeout - 1545 28FB ExternalLoop - 1546 28FB A9 00 LDA #0 - 1547 28FD 85 36 STA looperka - 1548 28FF InternalLoop - 1549 28FF AD 0E D2 LDA IRQST - 1550 2902 29 20 AND #$20 - 1551 2904 F0 09 BEQ ACKReceive - 1552 2906 C6 36 DEC looperka - 1553 2908 D0 F5 BNE InternalLoop - 1554 290A CA DEX - 1555 290B D0 EE BNE ExternalLoop - 1556 290D F0 9F BEQ ErrorHere - 1557 290F ACKReceive - 1558 ; zero we have now - 1559 290F 8D 0E D2 STA IRQST - 1560 2912 A9 20 LDA #$20 - 1561 2914 8D 0E D2 STA IRQST - 1562 2917 AD 0F D2 LDA SKSTAT - 1563 291A 8D 0A D2 STA SKSTRES - 1564 291D 29 20 AND #$20 - 1565 291F F0 8D BEQ ErrorHere - 1566 ; - 1567 2921 AD 0D D2 LDA SERIN - 1568 2924 60 RTS - 1569 2925 EndHappyUSProc - 1570 - 1571 - 1572 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler - 1573 2925 blokDanychIO_GetUSSpeed - 1574 2925 31 01 3F 40 .BY $31,$01,"?",$40 - 1575 2929 3E 28 .WO HappySpeed - 1576 292B 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A - 1577 2931 DirMapEnd - 1578 2931 4C FD 29 JMP label75 - 1579 2934 label39 - 1580 2934 85 DA STA $DA - 1581 2936 A5 D0 LDA CurrentFileInfoBuff - 1582 2938 85 DB STA $DB - 1583 293A A5 D1 LDA CurrentFileInfoBuff+1 - 1584 293C 85 DC STA $DC - 1585 293E 20 B1 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka - 1586 2941 F0 05 BEQ DiscNotChanged2 - 1587 2943 68 PLA - 1588 2944 68 PLA - 1589 2945 4C 48 22 JMP ReadMainDir - 1590 2948 DiscNotChanged2 - 1591 ; odczyt sektora mapy wskazywanego przez DirMapSec - 1592 2948 A5 D2 LDA DirMapSect - 1593 294A 8D AD 2A STA blokDanychIO+10 - 1594 294D A5 D3 LDA DirMapSect+1 - 1595 294F 8D AE 2A STA blokDanychIO+11 - 1596 2952 0D AD 2A ORA blokDanychIO+10 - 1597 2955 F0 DA BEQ DirMapEnd - 1598 2957 A2 2D LDX #>DirMapSectorBuff - 1599 2959 A0 80 LDY #DirMapSectorBuff ; -- - 1625 2985 65 E3 ADC InMapPointer+1 ; -- - 1626 2987 85 E5 STA TempZP+1 ; -- - 1627 2989 B1 E4 LDA (TempZP),Y - 1628 298B 8D AD 2A STA blokDanychIO+10 - 1629 298E C8 INY - 1630 298F B1 E4 LDA (TempZP),Y - 1631 2991 8D AE 2A STA blokDanychIO+11 - 1632 2994 0D AD 2A ORA blokDanychIO+10 - 1633 2997 F0 64 BEQ label75 - 1634 ; i zwiekszenie wskaznika mapy o 2 - 1635 2999 C8 INY - 1636 299A 84 E2 STY InMapPointer - 1637 299C D0 02 BNE NoIncH ; -- - 1638 299E E6 E3 INC InMapPointer+1 ; -- - 1639 29A0 NoIncH - 1640 29A0 AD E5 02 LDA MEMTOP - 1641 29A3 38 SEC - 1642 29A4 E5 D0 SBC CurrentFileInfoBuff - 1643 29A6 AD E6 02 LDA MEMTOP+1 - 1644 29A9 E5 D1 SBC CurrentFileInfoBuff+1 - 1645 29AB F0 50 BEQ label75 - 1646 29AD A4 D0 LDY CurrentFileInfoBuff - 1647 29AF A6 D1 LDX CurrentFileInfoBuff+1 - 1648 29B1 20 75 2A JSR ReadSector - 1649 29B4 A5 D4 LDA $D4 - 1650 29B6 05 D5 ORA $D5 - 1651 29B8 D0 16 BNE label79 - 1652 29BA A0 03 LDY #$03 - 1653 29BC B1 D0 LDA (CurrentFileInfoBuff),Y - 1654 29BE 85 D4 STA $D4 - 1655 29C0 C8 INY - 1656 29C1 B1 D0 LDA (CurrentFileInfoBuff),Y - 1657 29C3 85 D5 STA $D5 - 1658 29C5 C8 INY - 1659 29C6 B1 D0 LDA (CurrentFileInfoBuff),Y - 1660 29C8 F0 06 BEQ label79 - 1661 29CA A9 FF LDA #$FF - 1662 29CC 85 D4 STA $D4 - 1663 29CE 85 D5 STA $D5 - 1664 29D0 label79 - 1665 29D0 A5 D0 LDA CurrentFileInfoBuff - 1666 29D2 18 CLC - 1667 29D3 6D B3 20 ADC .adr loader.SecLen ; przed przepisaniem - 1668 29D6 85 D0 STA CurrentFileInfoBuff - 1669 29D8 A5 D1 LDA CurrentFileInfoBuff+1 - 1670 29DA 6D B4 20 ADC .adr loader.SecLen+1 ; przed przepisaniem - 1671 29DD 85 D1 STA CurrentFileInfoBuff+1 - 1672 29DF A5 D4 LDA $D4 - 1673 29E1 38 SEC - 1674 29E2 ED B3 20 SBC .adr loader.SecLen ; przed przepisaniem - 1675 29E5 85 D4 STA $D4 - 1676 29E7 A5 D5 LDA $D5 - 1677 29E9 ED B4 20 SBC .adr loader.SecLen+1 ; przed przepisaniem - 1678 29EC 85 D5 STA $D5 - 1679 29EE B0 80 BCS label80 - 1680 29F0 A5 D0 LDA CurrentFileInfoBuff - 1681 29F2 18 CLC - 1682 29F3 65 D4 ADC $D4 - 1683 29F5 85 D0 STA CurrentFileInfoBuff - 1684 29F7 A5 D1 LDA CurrentFileInfoBuff+1 - 1685 29F9 65 D5 ADC $D5 - 1686 29FB 85 D1 STA CurrentFileInfoBuff+1 - 1687 29FD label75 - 1688 29FD A5 DC LDA $DC - 1689 29FF C5 D1 CMP CurrentFileInfoBuff+1 - 1690 2A01 90 0B BCC label81 - 1691 2A03 D0 17 BNE label82 - 1692 2A05 A5 DB LDA $DB - 1693 2A07 C5 D0 CMP CurrentFileInfoBuff - 1694 2A09 90 03 BCC label81 - 1695 2A0B D0 0F BNE label82 - 1696 2A0D 60 RTS - 1697 2A0E label81 - 1698 2A0E A5 DB LDA $DB - 1699 2A10 18 CLC - 1700 2A11 65 DA ADC $DA - 1701 2A13 85 DB STA $DB - 1702 2A15 90 E6 BCC label75 - 1703 2A17 E6 DC INC $DC - 1704 2A19 4C FD 29 JMP label75 - 1705 2A1C label82 - 1706 2A1C A5 DB LDA $DB - 1707 2A1E 38 SEC - 1708 2A1F E5 DA SBC $DA - 1709 2A21 85 D0 STA CurrentFileInfoBuff - 1710 2A23 A5 DC LDA $DC - 1711 2A25 E9 00 SBC #$00 - 1712 2A27 85 D1 STA CurrentFileInfoBuff+1 - 1713 2A29 60 RTS - 1714 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora - 1715 2A2A ReadPERCOM - 1716 2A2A A9 04 LDA #$04 - 1717 2A2C 8D AF 2A STA DiskRetryCount - 1718 2A2F ReadPERCOMretry - 1719 2A2F A0 53 LDY #blokDanychIO_PERCOM - 1721 2A33 20 4B 2B JSR Table2DCB - 1722 2A36 20 40 2B JSR GoSIO - 1723 2A39 30 08 BMI PercomError - 1724 ; blok odczytany - ustawmy dlugosc 1 sektora - 1725 2A3B AD 94 2C LDA PERCOMdata+6 - 1726 2A3E C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 - 1727 2A40 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest - 1728 2A42 60 RTS - 1729 2A43 PercomError - 1730 2A43 CE AF 2A DEC DiskRetryCount - 1731 2A46 D0 E7 BNE ReadPERCOMretry - 1732 ; blok nieodczytany - dlugosc 1 sektora na $80 - 1733 2A48 Set1Sect128 - 1734 2A48 A9 00 LDA #$00 - 1735 2A4A 8D 94 2C STA PERCOMdata+6 - 1736 2A4D A9 80 LDA #$80 - 1737 2A4F 8D 95 2C STA PERCOMdata+7 - 1738 2A52 60 RTS - 1739 2A53 blokDanychIO_PERCOM - 1740 2A53 31 01 4E 40 .BY $31,$01,$4E,$40 - 1741 2A57 8E 2C .WO PERCOMdata - 1742 2A59 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 - 1743 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) - 1744 2A5F ReadFirstSect - 1745 2A5F A9 01 LDA #$01 - 1746 2A61 8D AD 2A STA blokDanychIO+10 - 1747 2A64 A9 00 LDA #$00 - 1748 2A66 8D AE 2A STA blokDanychIO+11 - 1749 2A69 AD 94 2C LDA PERCOMdata+6 - 1750 2A6C 8D AC 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b - 1751 2A6F AD 95 2C LDA PERCOMdata+7 - 1752 2A72 4C 7E 2A JMP ReadSector1 - 1753 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) - 1754 ; reszta danych jak nizej (A nie wazne) - 1755 2A75 ReadSector - 1756 2A75 AD B4 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b - 1757 2A78 8D AC 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b - 1758 2A7B AD B3 20 LDA .adr loader.SecLen ; przed przepisaniem - 1759 2A7E ReadSector1 - 1760 2A7E 8D AB 2A STA blokDanychIO+8 - 1761 2A81 8E A8 2A STX blokDanychIO+5 - 1762 2A84 8C A7 2A STY blokDanychIO+4 - 1763 2A87 A9 04 LDA #$04 - 1764 2A89 8D AF 2A STA DiskRetryCount - 1765 2A8C DiskReadRetry - 1766 2A8C A0 A3 LDY #blokDanychIO - 1768 2A90 20 4B 2B JSR Table2DCB - 1769 2A93 20 40 2B JSR GoSIO - 1770 2A96 30 01 BMI label85 - 1771 2A98 60 RTS - 1772 2A99 label85 - 1773 2A99 CE AF 2A DEC DiskRetryCount - 1774 2A9C D0 EE BNE DiskReadRetry - 1775 2A9E 68 PLA - 1776 2A9F 68 PLA - 1777 2AA0 4C 07 22 JMP ErrorDisplay - 1778 2AA3 blokDanychIO - 1779 2AA3 31 01 52 40 .BY $31,$01,$52,$40 - 1780 2AA7 80 2D .WO DirMapSectorBuff - 1781 2AA9 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 - 1782 2AAF DiskRetryCount - 1783 2AAF 00 .BY $00 - 1784 2AB0 PrintXY - 1785 2AB0 68 PLA - 1786 2AB1 85 C8 STA $C8 - 1787 2AB3 68 PLA - 1788 2AB4 85 C9 STA $C9 - 1789 2AB6 A9 00 LDA #$00 - 1790 2AB8 85 DF STA $DF - 1791 2ABA 20 32 2B JSR label87 - 1792 2ABD 48 PHA - 1793 2ABE 20 32 2B JSR label87 - 1794 2AC1 85 DE STA $DE - 1795 2AC3 0A ASL - 1796 2AC4 0A ASL - 1797 2AC5 18 CLC - 1798 2AC6 65 DE ADC $DE - 1799 2AC8 0A ASL - 1800 2AC9 0A ASL - 1801 2ACA 26 DF ROL $DF - 1802 2ACC 0A ASL - 1803 2ACD 26 DF ROL $DF - 1804 2ACF 18 CLC - 1805 2AD0 65 58 ADC SAVMSC - 1806 2AD2 85 DE STA $DE - 1807 2AD4 A5 DF LDA $DF - 1808 2AD6 65 59 ADC SAVMSC+1 - 1809 2AD8 85 DF STA $DF - 1810 2ADA 68 PLA - 1811 2ADB A8 TAY - 1812 2ADC label92 - 1813 2ADC 20 32 2B JSR label87 - 1814 2ADF C9 00 CMP #$00 - 1815 2AE1 F0 48 BEQ label88 - 1816 2AE3 C9 7D CMP #$7D - 1817 2AE5 F0 21 BEQ label89 - 1818 2AE7 A2 00 LDX #$00 - 1819 2AE9 86 E0 STX $E0 - 1820 2AEB C9 80 CMP #$80 - 1821 2AED 66 E0 ROR $E0 - 1822 2AEF 29 7F AND #$7F - 1823 2AF1 C9 20 CMP #$20 - 1824 2AF3 B0 04 BCS label90 - 1825 2AF5 09 40 ORA #$40 - 1826 2AF7 D0 07 BNE label91 - 1827 2AF9 label90 - 1828 2AF9 C9 60 CMP #$60 - 1829 2AFB B0 03 BCS label91 - 1830 2AFD 38 SEC - 1831 2AFE E9 20 SBC #$20 - 1832 2B00 label91 - 1833 2B00 05 E0 ORA $E0 - 1834 2B02 91 DE STA ($DE),Y - 1835 2B04 C8 INY - 1836 2B05 4C DC 2A JMP label92 - 1837 2B08 label89 - 1838 2B08 98 TYA - 1839 2B09 48 PHA - 1840 2B0A A5 58 LDA SAVMSC - 1841 2B0C 85 E0 STA $E0 - 1842 2B0E A9 03 LDA #$03 - 1843 2B10 AA TAX - 1844 2B11 18 CLC - 1845 2B12 65 59 ADC SAVMSC+1 - 1846 2B14 85 E1 STA $E1 - 1847 2B16 A0 BF LDY #$BF - 1848 2B18 A9 00 LDA #$00 - 1849 2B1A label93 - 1850 2B1A 91 E0 STA ($E0),Y - 1851 2B1C 88 DEY - 1852 2B1D C0 FF CPY #$FF - 1853 2B1F D0 F9 BNE label93 - 1854 2B21 C6 E1 DEC $E1 - 1855 2B23 CA DEX - 1856 2B24 10 F4 BPL label93 - 1857 2B26 68 PLA - 1858 2B27 A8 TAY - 1859 2B28 4C DC 2A JMP label92 - 1860 2B2B label88 - 1861 2B2B A5 C9 LDA $C9 - 1862 2B2D 48 PHA - 1863 2B2E A5 C8 LDA $C8 - 1864 2B30 48 PHA - 1865 2B31 60 RTS - 1866 2B32 label87 - 1867 2B32 E6 C8 INC $C8 - 1868 2B34 D0 02 BNE label94 - 1869 2B36 E6 C9 INC $C9 - 1870 2B38 label94 - 1871 2B38 A2 00 LDX #$00 - 1872 2B3A A1 C8 LDA ($C8,X) - 1873 2B3C 60 RTS - 1874 2B3D GoErrorDisp - 1875 2B3D 4C 07 22 JMP ErrorDisplay - 1876 ; Skok do Sio lub procedury Turbo - 1877 2B40 GoSIO - 1878 2B40 AC 96 21 LDY USmode - 1879 2B43 F0 03 BEQ StandardSpeed - 1880 2B45 4C 26 28 JMP HappyUSMovedProc ; mozna skakac do tej procki - 1881 2B48 StandardSpeed - 1882 2B48 4C 59 E4 JMP JSIOINT - 1883 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) - 1884 ; do bloku kontroli transmisji szeregowej DCB - 1885 2B4B Table2DCB - 1886 2B4B 8C 54 2B STY IOtableAddr+1 - 1887 2B4E 8E 55 2B STX IOtableAddr+2 - 1888 2B51 A2 0B LDX #$0B - 1889 2B53 IOtableAddr - 1890 2B53 BD FF FF LDA $FFFF,X - 1891 2B56 9D 00 03 STA DDEVIC,X - 1892 2B59 CA DEX - 1893 2B5A 10 F7 BPL IOtableAddr - 1894 2B5C 60 RTS - 1895 2B5D Close1 - 1896 2B5D A2 10 LDX #$10 - 1897 2B5F CloseX - 1898 2B5F A9 0C LDA #$0C - 1899 2B61 9D 42 03 STA ICCMD,X - 1900 2B64 4C 56 E4 JMP JCIOMAIN - 1901 2B67 GetKey - 1902 2B67 A2 10 LDX #$10 - 1903 2B69 A9 03 LDA #$03 - 1904 2B6B 9D 42 03 STA ICCMD,X - 1905 2B6E A9 04 LDA #$04 - 1906 2B70 9D 4A 03 STA ICAX1,X - 1907 2B73 A9 00 LDA #$00 - 1908 2B75 9D 4B 03 STA ICAX2,X - 1909 2B78 9D 49 03 STA ICBUFL+1,X - 1910 2B7B A9 FF LDA #$FF - 1911 2B7D 9D 48 03 STA ICBUFL,X - 1912 2B80 A9 AE LDA #Kdriver - 1915 2B87 9D 45 03 STA ICBUFA+1,X - 1916 2B8A 20 56 E4 JSR JCIOMAIN - 1917 2B8D 30 1C BMI GKeyError - 1918 2B8F A2 10 LDX #$10 - 1919 2B91 A9 00 LDA #$00 - 1920 2B93 9D 48 03 STA ICBUFL,X - 1921 2B96 9D 49 03 STA ICBUFL+1,X - 1922 2B99 A9 07 LDA #$07 - 1923 2B9B 9D 42 03 STA ICCMD,X - 1924 2B9E 20 56 E4 JSR JCIOMAIN - 1925 2BA1 30 08 BMI GKeyError - 1926 2BA3 48 PHA - 1927 2BA4 20 5D 2B JSR Close1 - 1928 2BA7 30 02 BMI GKeyError - 1929 2BA9 68 PLA - 1930 2BAA 60 RTS - 1931 2BAB GKeyError - 1932 2BAB 4C 3D 2B JMP GoErrorDisp - 1933 2BAE Kdriver - 1934 2BAE 4B 3A 9B .BY "K:",$9B - 1935 2BB1 DiscChangeCheck - 1936 2BB1 A0 80 LDY #DirMapSectorBuff - 1938 2BB5 20 5F 2A JSR ReadFirstSect - 1939 2BB8 A2 7F LDX #$7F - 1940 2BBA label98 - 1941 2BBA BD 00 2D LDA FirstSectorBuff,X - 1942 2BBD DD 80 2D CMP DirMapSectorBuff,X - 1943 2BC0 D0 05 BNE ChangedD - 1944 2BC2 CA DEX - 1945 2BC3 10 F5 BPL label98 - 1946 2BC5 A9 00 LDA #$00 - 1947 2BC7 ChangedD - 1948 2BC7 60 RTS - 1949 ; obsluga gwiazdki - 1950 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * - 1951 ; w Y jest ) - X moze lepiej nie ruszac :) - 1952 2BC8 Asteriks - 1953 2BC8 A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) - 1954 2BCA 20 E6 2B JSR GetHexNumber - 1955 2BCD 8D C5 02 STA COLPF1S ; literki - 1956 2BD0 C8 INY - 1957 2BD1 20 E6 2B JSR GetHexNumber - 1958 2BD4 8D C6 02 STA COLPF2S ; tlo - 1959 2BD7 C8 INY - 1960 2BD8 20 E6 2B JSR GetHexNumber - 1961 2BDB 8D C8 02 STA COLBAKS ; ramka - 1962 2BDE C8 INY - 1963 2BDF 20 E6 2B JSR GetHexNumber - 1964 2BE2 8D 9A 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) - 1965 2BE5 60 RTS - 1966 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX - 1967 ; i zamienia na bajt w A - 1968 2BE6 GetHexNumber - 1969 2BE6 20 F6 2B JSR GetHEX4bits - 1970 2BE9 0A ASL - 1971 2BEA 0A ASL - 1972 2BEB 0A ASL - 1973 2BEC 0A ASL - 1974 2BED 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. - 1975 2BEF C8 INY - 1976 2BF0 20 F6 2B JSR GetHEX4bits - 1977 2BF3 05 E4 ORA TempZP - 1978 2BF5 60 RTS - 1979 2BF6 GetHEX4bits - 1980 2BF6 B1 D4 LDA ($D4),Y - 1981 2BF8 38 SEC - 1982 2BF9 E9 30 SBC #'0' - 1983 2BFB C9 0A CMP #$0A ; sprawdzmy czy cyfra - 1984 2BFD 90 02 BCC IsNumber - 1985 2BFF E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow - 1986 2C01 IsNumber - 1987 2C01 60 RTS - 1988 ; Ustawia numer satcji wg A - 1989 2C02 SeTDriveNR - 1990 2C02 C9 09 CMP #$09 - 1991 2C04 B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry - 1992 2C06 20 24 2C JSR SeTblokDanychDrive - 1993 2C09 18 CLC - 1994 2C0A 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 - 1995 2C0C 8D 49 23 STA DriveDisp1 - 1996 2C0F A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu - 1997 2C11 8D 48 23 STA DriveDisp1-1 - 1998 2C14 60 RTS - 1999 2C15 SeTDriveLetter - 2000 2C15 20 24 2C JSR SeTblokDanychDrive - 2001 2C18 18 CLC - 2002 2C19 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu - 2003 2C1B 8D 49 23 STA DriveDisp1 - 2004 2C1E A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja - 2005 2C20 8D 48 23 STA DriveDisp1-1 - 2006 2C23 60 RTS - 2007 2C24 SeTblokDanychDrive - 2008 2C24 8D AC 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem - 2009 2C27 8D A4 2A STA blokDanychIO+1 - 2010 2C2A 8D 26 29 STA blokDanychIO_GetUSSpeed+1 - 2011 2C2D 8D 54 2A STA blokDanychIO_PERCOM+1 - 2012 2C30 60 RTS - 2013 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku - 2014 2C31 MEMLOprint - 2015 2C31 AD E7 02 LDA MEMLO - 2016 2C34 48 PHA - 2017 2C35 4A LSR - 2018 2C36 4A LSR - 2019 2C37 4A LSR - 2020 2C38 4A LSR - 2021 2C39 20 9C 21 JSR bin2AsciiHex - 2022 2C3C 8D 6A 2C STA MEMLOvalue+2 - 2023 2C3F 68 PLA - 2024 2C40 20 9C 21 JSR bin2AsciiHex - 2025 2C43 8D 6B 2C STA MEMLOvalue+3 - 2026 2C46 AD E8 02 LDA MEMLO+1 - 2027 2C49 48 PHA - 2028 2C4A 4A LSR - 2029 2C4B 4A LSR - 2030 2C4C 4A LSR - 2031 2C4D 4A LSR - 2032 2C4E 20 9C 21 JSR bin2AsciiHex - 2033 2C51 8D 68 2C STA MEMLOvalue - 2034 2C54 68 PLA - 2035 2C55 20 9C 21 JSR bin2AsciiHex - 2036 2C58 8D 69 2C STA MEMLOvalue+1 - 2037 2C5B 20 B0 2A JSR PrintXY - 2038 2C5E 1C 17 .BY 28,23 - 2039 2C60 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" - 2040 2C68 MEMLOvalue - 2041 2C68 30 30 30 30 .BY "0000" - 2042 2C6C 00 .BY $00 - 2043 2C6D 60 RTS - 2044 - 2045 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo - 2046 - 2047 2C6E xjsrTableL - 2048 2C6E 54 68 6E .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] - 2049 2C71 74 79 .BY <[xjsr4+1],<[xjsr5+1] - 2050 2C73 85 8F 9B .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] - 2051 2C76 A0 A8 .BY <[xjsr9+1],<[xjsrA+1] - 2052 2C78 xjsrTableH - 2053 2C78 28 28 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] - 2054 2C7B 28 28 .BY >[xjsr4+1],>[xjsr5+1] - 2055 2C7D 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] - 2056 2C80 28 28 .BY >[xjsr9+1],>[xjsrA+1] - 2057 ; miejsce na wyliczony offset o jaki przesuwamy procedure - 2058 2C82 HappyOffset - 2059 2C82 00 00 .WO $0000 - 2060 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) - 2061 2C84 DensityCodes - 2062 2C84 F3 E4 F1 .by +$80,"sdq" - 2063 ;.by "SDQ" - 2064 ;.by $0e,$15,$a0 - 2065 2C87 ONtext - 2066 2C87 CF CE A0 .BY +$80,"ON " - 2067 2C8A OFFtext - 2068 2C8A CF C6 C6 .BY +$80,"OFF" - 2069 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) - 2070 2C8D PDVMASKtemp - 2071 2C8D 00 .BY $00 - 2072 ; miejsce na blok PERCOM - 2073 2C8E PERCOMdata - 2074 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie - 2075 = 2C9A FirstSectorsTable=*+12 ; omijamy 12b na percom - 2076 ; zostawiamy $30 bajtow wolnego - 2077 - 2078 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow - 2079 = 2D00 ProgramEnd=FirstSectorBuff - 2080 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu - 2081 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu - 2082 2C8E FirstRun - 2083 ; odnotowujemy stan Shift z Bootowania - 2084 2C8E AD 0F D2 LDA SKSTAT - 2085 2C91 29 08 and #$08 - 2086 2C93 D0 03 BNE NoSHIFTboot - 2087 2C95 8D 99 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 - 2088 2C98 NoSHIFTboot - 2089 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie - 2090 2C98 AD 01 D3 LDA PORTB - 2091 2C9B 29 02 AND #$02 - 2092 2C9D D0 0B BNE BrakBasica - 2093 ; jest Basic - 2094 2C9F A0 02 LDY #$2 - 2095 2CA1 BASstatprint - 2096 2CA1 B9 87 2C LDA ONtext,y - 2097 2CA4 99 64 23 STA BASstatus,y - 2098 2CA7 88 DEY - 2099 2CA8 10 F7 bpl BASstatprint - 2100 2CAA BrakBasica - 2101 ; Sprawdzamy istnienie QMEGa - 2102 2CAA A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy - 2103 2CAC testQMEGloop - 2104 2CAC B9 01 C0 LDA $C001,y - 2105 2CAF D9 DF 2C CMP QMEGstring,y - 2106 2CB2 D0 13 bne brakQMEGa - 2107 2CB4 88 dey - 2108 2CB5 10 F5 bpl testQMEGloop - 2109 ; jest QMEG - 2110 2CB7 A9 00 LDA #0 - 2111 2CB9 8D 97 21 STA QMEG - 2112 2CBC A0 02 LDY #$2 - 2113 2CBE Qstatprint - 2114 2CBE B9 87 2C LDA ONtext,y - 2115 2CC1 99 5C 23 STA QMEGstatus,y - 2116 2CC4 88 DEY - 2117 2CC5 10 F7 bpl Qstatprint - 2118 2CC7 brakQMEGa - 2119 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi - 2120 2CC7 AD 00 03 LDA DDEVIC - 2121 2CCA 18 clc - 2122 2CCB 6D 01 03 ADC DUNIT - 2123 2CCE 38 sec - 2124 2CCF E9 01 SBC #$01 - 2125 2CD1 29 0F AND #$0F ; zapamietanie numeru urzadzenia - 2126 2CD3 8D 98 21 STA BootDrive - 2127 2CD6 20 02 2C JSR SeTDriveNR - 2128 2CD9 20 AB 21 JSR EditorOpen - 2129 2CDC 4C D9 21 JMP mainprog - 2130 2CDF QMEGstring - 2131 2CDF 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 - 2132 2CE7 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" - 2133 ;.OPT List - 2134 - 2135 - 2136 = 0080 MAPCOUNTER - 2136 = 0082 COMPRESSEDMAPCOUNTER - 2136 = 0084 MAPCOUNTERMEM - 2136 = 0086 PREVFILESECTOR - 2136 = 0088 MAPPOSITIONMEM - 2136 = 008A SECTOROFFSET - 2136 = 008C SECTORSCOUNTER - 2136 org $02e0 - 2137 02E0-02E1> 0D 27 .WO LoaderGo - 2138 ; .WO START - 2139 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) - 2140 ; OPT h- - 2141 ; org $0000 - 2142 ; .WO $0000 - 2143 + 1409 2850 EndOfTransmission + 1410 2850 A9 00 LDA #0 + 1411 2852 8D 07 D2 STA AUDC4 + 1412 2855 A5 10 LDA IRQENS + 1413 2857 8D 0E D2 STA IRQEN + 1414 285A 58 CLI + 1415 285B A4 35 LDY TransmitError + 1416 285D 60 RTS + 1417 + 1418 285E SecTransReg + 1419 285E 8D 0F D2 STA SKCTL + 1420 2861 8D 0A D2 STA SKSTRES + 1421 2864 A9 38 LDA #$38 + 1422 2866 8D 0E D2 STA IRQEN + 1423 2869 A9 28 LDA #$28 + 1424 286B 8D 08 D2 STA AUDCTL + 1425 286E A9 A8 LDA #$A8 + 1426 2870 8D 07 D2 STA AUDC4 + 1427 2873 60 RTS + 1428 + 1429 2874 PutSIOByte + 1430 2874 AA TAX + 1431 2875 waitforSerial + 1432 2875 AD 0E D2 LDA IRQST + 1433 2878 29 10 AND #$10 + 1434 287A D0 F9 BNE waitforSerial + 1435 + 1436 287C 8D 0E D2 STA IRQEN + 1437 287F A9 10 LDA #$10 + 1438 2881 8D 0E D2 STA IRQEN + 1439 + 1440 2884 8A TXA + 1441 2885 8D 0D D2 STA SEROUT + 1442 + 1443 2888 AddCheckSum + 1444 2888 18 CLC + 1445 2889 65 30 ADC CheckSum + 1446 288B 69 00 ADC #0 + 1447 288D 85 30 STA CheckSum + 1448 288F 60 RTS + 1449 + 1450 2890 GetSIOByte + 1451 2890 A2 0A LDX #10 ;acktimeout + 1452 2892 ExternalLoop + 1453 2892 A9 00 LDA #0 + 1454 2894 85 36 STA looperka + 1455 2896 InternalLoop + 1456 2896 AD 0E D2 LDA IRQST + 1457 2899 29 20 AND #$20 + 1458 289B F0 09 BEQ ACKReceive + 1459 289D C6 36 DEC looperka + 1460 289F D0 F5 BNE InternalLoop + 1461 28A1 CA DEX + 1462 28A2 D0 EE BNE ExternalLoop + 1463 28A4 F0 9F BEQ ErrorHere + 1464 28A6 ACKReceive + 1465 ; zero we have now + 1466 28A6 8D 0E D2 STA IRQST + 1467 28A9 A9 20 LDA #$20 + 1468 28AB 8D 0E D2 STA IRQST + 1469 28AE AD 0F D2 LDA SKSTAT + 1470 28B1 8D 0A D2 STA SKSTRES + 1471 28B4 29 20 AND #$20 + 1472 28B6 F0 8D BEQ ErrorHere + 1473 ; + 1474 28B8 AD 0D D2 LDA SERIN + 1475 28BB 60 RTS + 1476 28BC EndHappyUSProc + 1477 + 1478 + 1479 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler + 1480 28BC blokDanychIO_GetUSSpeed + 1481 28BC 31 01 3F 40 .BY $31,$01,"?",$40 + 1482 28C0 D5 27 .WO HappySpeed + 1483 28C2 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A + 1484 28C8 DirMapEnd + 1485 28C8 4C 94 29 JMP label75 + 1486 28CB label39 + 1487 28CB 85 DA STA $DA + 1488 28CD A5 D0 LDA CurrentFileInfoBuff + 1489 28CF 85 DB STA $DB + 1490 28D1 A5 D1 LDA CurrentFileInfoBuff+1 + 1491 28D3 85 DC STA $DC + 1492 28D5 20 48 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 1493 28D8 F0 05 BEQ DiscNotChanged2 + 1494 28DA 68 PLA + 1495 28DB 68 PLA + 1496 28DC 4C D4 21 JMP ReadMainDir + 1497 28DF DiscNotChanged2 + 1498 ; odczyt sektora mapy wskazywanego przez DirMapSec + 1499 28DF A5 D2 LDA DirMapSect + 1500 28E1 8D 44 2A STA blokDanychIO+10 + 1501 28E4 A5 D3 LDA DirMapSect+1 + 1502 28E6 8D 45 2A STA blokDanychIO+11 + 1503 28E9 0D 44 2A ORA blokDanychIO+10 + 1504 28EC F0 DA BEQ DirMapEnd + 1505 28EE A2 2D LDX #>DirMapSectorBuff + 1506 28F0 A0 80 LDY #DirMapSectorBuff ; -- + 1532 291C 65 E3 ADC InMapPointer+1 ; -- + 1533 291E 85 E5 STA TempZP+1 ; -- + 1534 2920 B1 E4 LDA (TempZP),Y + 1535 2922 8D 44 2A STA blokDanychIO+10 + 1536 2925 C8 INY + 1537 2926 B1 E4 LDA (TempZP),Y + 1538 2928 8D 45 2A STA blokDanychIO+11 + 1539 292B 0D 44 2A ORA blokDanychIO+10 + 1540 292E F0 64 BEQ label75 + 1541 ; i zwiekszenie wskaznika mapy o 2 + 1542 2930 C8 INY + 1543 2931 84 E2 STY InMapPointer + 1544 2933 D0 02 BNE NoIncH ; -- + 1545 2935 E6 E3 INC InMapPointer+1 ; -- + 1546 2937 NoIncH + 1547 2937 AD E5 02 LDA MEMTOP + 1548 293A 38 SEC + 1549 293B E5 D0 SBC CurrentFileInfoBuff + 1550 293D AD E6 02 LDA MEMTOP+1 + 1551 2940 E5 D1 SBC CurrentFileInfoBuff+1 + 1552 2942 F0 50 BEQ label75 + 1553 2944 A4 D0 LDY CurrentFileInfoBuff + 1554 2946 A6 D1 LDX CurrentFileInfoBuff+1 + 1555 2948 20 0C 2A JSR ReadSector + 1556 294B A5 D4 LDA $D4 + 1557 294D 05 D5 ORA $D5 + 1558 294F D0 16 BNE label79 + 1559 2951 A0 03 LDY #$03 + 1560 2953 B1 D0 LDA (CurrentFileInfoBuff),Y + 1561 2955 85 D4 STA $D4 + 1562 2957 C8 INY + 1563 2958 B1 D0 LDA (CurrentFileInfoBuff),Y + 1564 295A 85 D5 STA $D5 + 1565 295C C8 INY + 1566 295D B1 D0 LDA (CurrentFileInfoBuff),Y + 1567 295F F0 06 BEQ label79 + 1568 2961 A9 FF LDA #$FF + 1569 2963 85 D4 STA $D4 + 1570 2965 85 D5 STA $D5 + 1571 2967 label79 + 1572 2967 A5 D0 LDA CurrentFileInfoBuff + 1573 2969 18 CLC + 1574 296A 6D A2 20 ADC .adr loader.SecLen ; przed przepisaniem + 1575 296D 85 D0 STA CurrentFileInfoBuff + 1576 296F A5 D1 LDA CurrentFileInfoBuff+1 + 1577 2971 6D A3 20 ADC .adr loader.SecLen+1 ; przed przepisaniem + 1578 2974 85 D1 STA CurrentFileInfoBuff+1 + 1579 2976 A5 D4 LDA $D4 + 1580 2978 38 SEC + 1581 2979 ED A2 20 SBC .adr loader.SecLen ; przed przepisaniem + 1582 297C 85 D4 STA $D4 + 1583 297E A5 D5 LDA $D5 + 1584 2980 ED A3 20 SBC .adr loader.SecLen+1 ; przed przepisaniem + 1585 2983 85 D5 STA $D5 + 1586 2985 B0 80 BCS label80 + 1587 2987 A5 D0 LDA CurrentFileInfoBuff + 1588 2989 18 CLC + 1589 298A 65 D4 ADC $D4 + 1590 298C 85 D0 STA CurrentFileInfoBuff + 1591 298E A5 D1 LDA CurrentFileInfoBuff+1 + 1592 2990 65 D5 ADC $D5 + 1593 2992 85 D1 STA CurrentFileInfoBuff+1 + 1594 2994 label75 + 1595 2994 A5 DC LDA $DC + 1596 2996 C5 D1 CMP CurrentFileInfoBuff+1 + 1597 2998 90 0B BCC label81 + 1598 299A D0 17 BNE label82 + 1599 299C A5 DB LDA $DB + 1600 299E C5 D0 CMP CurrentFileInfoBuff + 1601 29A0 90 03 BCC label81 + 1602 29A2 D0 0F BNE label82 + 1603 29A4 60 RTS + 1604 29A5 label81 + 1605 29A5 A5 DB LDA $DB + 1606 29A7 18 CLC + 1607 29A8 65 DA ADC $DA + 1608 29AA 85 DB STA $DB + 1609 29AC 90 E6 BCC label75 + 1610 29AE E6 DC INC $DC + 1611 29B0 4C 94 29 JMP label75 + 1612 29B3 label82 + 1613 29B3 A5 DB LDA $DB + 1614 29B5 38 SEC + 1615 29B6 E5 DA SBC $DA + 1616 29B8 85 D0 STA CurrentFileInfoBuff + 1617 29BA A5 DC LDA $DC + 1618 29BC E9 00 SBC #$00 + 1619 29BE 85 D1 STA CurrentFileInfoBuff+1 + 1620 29C0 60 RTS + 1621 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora + 1622 29C1 ReadPERCOM + 1623 29C1 A9 04 LDA #$04 + 1624 29C3 8D 46 2A STA DiskRetryCount + 1625 29C6 ReadPERCOMretry + 1626 29C6 A0 EA LDY #blokDanychIO_PERCOM + 1628 29CA 20 E2 2A JSR Table2DCB + 1629 29CD 20 D7 2A JSR GoSIO + 1630 29D0 30 08 BMI PercomError + 1631 ; blok odczytany - ustawmy dlugosc 1 sektora + 1632 29D2 AD 2B 2C LDA PERCOMdata+6 + 1633 29D5 C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + 1634 29D7 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + 1635 29D9 60 RTS + 1636 29DA PercomError + 1637 29DA CE 46 2A DEC DiskRetryCount + 1638 29DD D0 E7 BNE ReadPERCOMretry + 1639 ; blok nieodczytany - dlugosc 1 sektora na $80 + 1640 29DF Set1Sect128 + 1641 29DF A9 00 LDA #$00 + 1642 29E1 8D 2B 2C STA PERCOMdata+6 + 1643 29E4 A9 80 LDA #$80 + 1644 29E6 8D 2C 2C STA PERCOMdata+7 + 1645 29E9 60 RTS + 1646 29EA blokDanychIO_PERCOM + 1647 29EA 31 01 4E 40 .BY $31,$01,$4E,$40 + 1648 29EE 25 2C .WO PERCOMdata + 1649 29F0 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 + 1650 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) + 1651 29F6 ReadFirstSect + 1652 29F6 A9 01 LDA #$01 + 1653 29F8 8D 44 2A STA blokDanychIO+10 + 1654 29FB A9 00 LDA #$00 + 1655 29FD 8D 45 2A STA blokDanychIO+11 + 1656 2A00 AD 2B 2C LDA PERCOMdata+6 + 1657 2A03 8D 43 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1658 2A06 AD 2C 2C LDA PERCOMdata+7 + 1659 2A09 4C 15 2A JMP ReadSector1 + 1660 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) + 1661 ; reszta danych jak nizej (A nie wazne) + 1662 2A0C ReadSector + 1663 2A0C AD A3 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + 1664 2A0F 8D 43 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1665 2A12 AD A2 20 LDA .adr loader.SecLen ; przed przepisaniem + 1666 2A15 ReadSector1 + 1667 2A15 8D 42 2A STA blokDanychIO+8 + 1668 2A18 8E 3F 2A STX blokDanychIO+5 + 1669 2A1B 8C 3E 2A STY blokDanychIO+4 + 1670 2A1E A9 04 LDA #$04 + 1671 2A20 8D 46 2A STA DiskRetryCount + 1672 2A23 DiskReadRetry + 1673 2A23 A0 3A LDY #blokDanychIO + 1675 2A27 20 E2 2A JSR Table2DCB + 1676 2A2A 20 D7 2A JSR GoSIO + 1677 2A2D 30 01 BMI label85 + 1678 2A2F 60 RTS + 1679 2A30 label85 + 1680 2A30 CE 46 2A DEC DiskRetryCount + 1681 2A33 D0 EE BNE DiskReadRetry + 1682 2A35 68 PLA + 1683 2A36 68 PLA + 1684 2A37 4C 93 21 JMP ErrorDisplay + 1685 2A3A blokDanychIO + 1686 2A3A 31 01 52 40 .BY $31,$01,$52,$40 + 1687 2A3E 80 2D .WO DirMapSectorBuff + 1688 2A40 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 + 1689 2A46 DiskRetryCount + 1690 2A46 00 .BY $00 + 1691 2A47 PrintXY + 1692 2A47 68 PLA + 1693 2A48 85 C8 STA $C8 + 1694 2A4A 68 PLA + 1695 2A4B 85 C9 STA $C9 + 1696 2A4D A9 00 LDA #$00 + 1697 2A4F 85 DF STA $DF + 1698 2A51 20 C9 2A JSR label87 + 1699 2A54 48 PHA + 1700 2A55 20 C9 2A JSR label87 + 1701 2A58 85 DE STA $DE + 1702 2A5A 0A ASL + 1703 2A5B 0A ASL + 1704 2A5C 18 CLC + 1705 2A5D 65 DE ADC $DE + 1706 2A5F 0A ASL + 1707 2A60 0A ASL + 1708 2A61 26 DF ROL $DF + 1709 2A63 0A ASL + 1710 2A64 26 DF ROL $DF + 1711 2A66 18 CLC + 1712 2A67 65 58 ADC SAVMSC + 1713 2A69 85 DE STA $DE + 1714 2A6B A5 DF LDA $DF + 1715 2A6D 65 59 ADC SAVMSC+1 + 1716 2A6F 85 DF STA $DF + 1717 2A71 68 PLA + 1718 2A72 A8 TAY + 1719 2A73 label92 + 1720 2A73 20 C9 2A JSR label87 + 1721 2A76 C9 00 CMP #$00 + 1722 2A78 F0 48 BEQ label88 + 1723 2A7A C9 7D CMP #$7D + 1724 2A7C F0 21 BEQ label89 + 1725 2A7E A2 00 LDX #$00 + 1726 2A80 86 E0 STX $E0 + 1727 2A82 C9 80 CMP #$80 + 1728 2A84 66 E0 ROR $E0 + 1729 2A86 29 7F AND #$7F + 1730 2A88 C9 20 CMP #$20 + 1731 2A8A B0 04 BCS label90 + 1732 2A8C 09 40 ORA #$40 + 1733 2A8E D0 07 BNE label91 + 1734 2A90 label90 + 1735 2A90 C9 60 CMP #$60 + 1736 2A92 B0 03 BCS label91 + 1737 2A94 38 SEC + 1738 2A95 E9 20 SBC #$20 + 1739 2A97 label91 + 1740 2A97 05 E0 ORA $E0 + 1741 2A99 91 DE STA ($DE),Y + 1742 2A9B C8 INY + 1743 2A9C 4C 73 2A JMP label92 + 1744 2A9F label89 + 1745 2A9F 98 TYA + 1746 2AA0 48 PHA + 1747 2AA1 A5 58 LDA SAVMSC + 1748 2AA3 85 E0 STA $E0 + 1749 2AA5 A9 03 LDA #$03 + 1750 2AA7 AA TAX + 1751 2AA8 18 CLC + 1752 2AA9 65 59 ADC SAVMSC+1 + 1753 2AAB 85 E1 STA $E1 + 1754 2AAD A0 BF LDY #$BF + 1755 2AAF A9 00 LDA #$00 + 1756 2AB1 label93 + 1757 2AB1 91 E0 STA ($E0),Y + 1758 2AB3 88 DEY + 1759 2AB4 C0 FF CPY #$FF + 1760 2AB6 D0 F9 BNE label93 + 1761 2AB8 C6 E1 DEC $E1 + 1762 2ABA CA DEX + 1763 2ABB 10 F4 BPL label93 + 1764 2ABD 68 PLA + 1765 2ABE A8 TAY + 1766 2ABF 4C 73 2A JMP label92 + 1767 2AC2 label88 + 1768 2AC2 A5 C9 LDA $C9 + 1769 2AC4 48 PHA + 1770 2AC5 A5 C8 LDA $C8 + 1771 2AC7 48 PHA + 1772 2AC8 60 RTS + 1773 2AC9 label87 + 1774 2AC9 E6 C8 INC $C8 + 1775 2ACB D0 02 BNE label94 + 1776 2ACD E6 C9 INC $C9 + 1777 2ACF label94 + 1778 2ACF A2 00 LDX #$00 + 1779 2AD1 A1 C8 LDA ($C8,X) + 1780 2AD3 60 RTS + 1781 2AD4 GoErrorDisp + 1782 2AD4 4C 93 21 JMP ErrorDisplay + 1783 ; Skok do Sio lub procedury Turbo + 1784 2AD7 GoSIO + 1785 2AD7 AC 22 21 LDY USmode + 1786 2ADA F0 03 BEQ StandardSpeed + 1787 2ADC 4C BD 27 JMP HappyUSMovedProc ; mozna skakac do tej procki + 1788 2ADF StandardSpeed + 1789 2ADF 4C 59 E4 JMP JSIOINT + 1790 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) + 1791 ; do bloku kontroli transmisji szeregowej DCB + 1792 2AE2 Table2DCB + 1793 2AE2 8C EB 2A STY IOtableAddr+1 + 1794 2AE5 8E EC 2A STX IOtableAddr+2 + 1795 2AE8 A2 0B LDX #$0B + 1796 2AEA IOtableAddr + 1797 2AEA BD FF FF LDA $FFFF,X + 1798 2AED 9D 00 03 STA DDEVIC,X + 1799 2AF0 CA DEX + 1800 2AF1 10 F7 BPL IOtableAddr + 1801 2AF3 60 RTS + 1802 2AF4 Close1 + 1803 2AF4 A2 10 LDX #$10 + 1804 2AF6 CloseX + 1805 2AF6 A9 0C LDA #$0C + 1806 2AF8 9D 42 03 STA ICCMD,X + 1807 2AFB 4C 56 E4 JMP JCIOMAIN + 1808 2AFE GetKey + 1809 2AFE A2 10 LDX #$10 + 1810 2B00 A9 03 LDA #$03 + 1811 2B02 9D 42 03 STA ICCMD,X + 1812 2B05 A9 04 LDA #$04 + 1813 2B07 9D 4A 03 STA ICAX1,X + 1814 2B0A A9 00 LDA #$00 + 1815 2B0C 9D 4B 03 STA ICAX2,X + 1816 2B0F 9D 49 03 STA ICBUFL+1,X + 1817 2B12 A9 FF LDA #$FF + 1818 2B14 9D 48 03 STA ICBUFL,X + 1819 2B17 A9 45 LDA #Kdriver + 1822 2B1E 9D 45 03 STA ICBUFA+1,X + 1823 2B21 20 56 E4 JSR JCIOMAIN + 1824 2B24 30 1C BMI GKeyError + 1825 2B26 A2 10 LDX #$10 + 1826 2B28 A9 00 LDA #$00 + 1827 2B2A 9D 48 03 STA ICBUFL,X + 1828 2B2D 9D 49 03 STA ICBUFL+1,X + 1829 2B30 A9 07 LDA #$07 + 1830 2B32 9D 42 03 STA ICCMD,X + 1831 2B35 20 56 E4 JSR JCIOMAIN + 1832 2B38 30 08 BMI GKeyError + 1833 2B3A 48 PHA + 1834 2B3B 20 F4 2A JSR Close1 + 1835 2B3E 30 02 BMI GKeyError + 1836 2B40 68 PLA + 1837 2B41 60 RTS + 1838 2B42 GKeyError + 1839 2B42 4C D4 2A JMP GoErrorDisp + 1840 2B45 Kdriver + 1841 2B45 4B 3A 9B .BY "K:",$9B + 1842 2B48 DiscChangeCheck + 1843 2B48 A0 80 LDY #DirMapSectorBuff + 1845 2B4C 20 F6 29 JSR ReadFirstSect + 1846 2B4F A2 7F LDX #$7F + 1847 2B51 label98 + 1848 2B51 BD 00 2D LDA FirstSectorBuff,X + 1849 2B54 DD 80 2D CMP DirMapSectorBuff,X + 1850 2B57 D0 05 BNE ChangedD + 1851 2B59 CA DEX + 1852 2B5A 10 F5 BPL label98 + 1853 2B5C A9 00 LDA #$00 + 1854 2B5E ChangedD + 1855 2B5E 60 RTS + 1856 ; obsluga gwiazdki + 1857 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * + 1858 ; w Y jest ) - X moze lepiej nie ruszac :) + 1859 2B5F Asteriks + 1860 2B5F A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + 1861 2B61 20 7D 2B JSR GetHexNumber + 1862 2B64 8D C5 02 STA COLPF1S ; literki + 1863 2B67 C8 INY + 1864 2B68 20 7D 2B JSR GetHexNumber + 1865 2B6B 8D C6 02 STA COLPF2S ; tlo + 1866 2B6E C8 INY + 1867 2B6F 20 7D 2B JSR GetHexNumber + 1868 2B72 8D C8 02 STA COLBAKS ; ramka + 1869 2B75 C8 INY + 1870 2B76 20 7D 2B JSR GetHexNumber + 1871 2B79 8D 26 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + 1872 2B7C 60 RTS + 1873 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX + 1874 ; i zamienia na bajt w A + 1875 2B7D GetHexNumber + 1876 2B7D 20 8D 2B JSR GetHEX4bits + 1877 2B80 0A ASL + 1878 2B81 0A ASL + 1879 2B82 0A ASL + 1880 2B83 0A ASL + 1881 2B84 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + 1882 2B86 C8 INY + 1883 2B87 20 8D 2B JSR GetHEX4bits + 1884 2B8A 05 E4 ORA TempZP + 1885 2B8C 60 RTS + 1886 2B8D GetHEX4bits + 1887 2B8D B1 D4 LDA ($D4),Y + 1888 2B8F 38 SEC + 1889 2B90 E9 30 SBC #'0' + 1890 2B92 C9 0A CMP #$0A ; sprawdzmy czy cyfra + 1891 2B94 90 02 BCC IsNumber + 1892 2B96 E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow + 1893 2B98 IsNumber + 1894 2B98 60 RTS + 1895 ; Ustawia numer satcji wg A + 1896 2B99 SeTDriveNR + 1897 2B99 C9 09 CMP #$09 + 1898 2B9B B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + 1899 2B9D 20 BB 2B JSR SeTblokDanychDrive + 1900 2BA0 18 CLC + 1901 2BA1 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + 1902 2BA3 8D D5 22 STA DriveDisp1 + 1903 2BA6 A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu + 1904 2BA8 8D D4 22 STA DriveDisp1-1 + 1905 2BAB 60 RTS + 1906 2BAC SeTDriveLetter + 1907 2BAC 20 BB 2B JSR SeTblokDanychDrive + 1908 2BAF 18 CLC + 1909 2BB0 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + 1910 2BB2 8D D5 22 STA DriveDisp1 + 1911 2BB5 A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + 1912 2BB7 8D D4 22 STA DriveDisp1-1 + 1913 2BBA 60 RTS + 1914 2BBB SeTblokDanychDrive + 1915 2BBB 8D 9B 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + 1916 2BBE 8D 3B 2A STA blokDanychIO+1 + 1917 2BC1 8D BD 28 STA blokDanychIO_GetUSSpeed+1 + 1918 2BC4 8D EB 29 STA blokDanychIO_PERCOM+1 + 1919 2BC7 60 RTS + 1920 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku + 1921 2BC8 MEMLOprint + 1922 2BC8 AD E7 02 LDA MEMLO + 1923 2BCB 48 PHA + 1924 2BCC 4A LSR + 1925 2BCD 4A LSR + 1926 2BCE 4A LSR + 1927 2BCF 4A LSR + 1928 2BD0 20 28 21 JSR bin2AsciiHex + 1929 2BD3 8D 01 2C STA MEMLOvalue+2 + 1930 2BD6 68 PLA + 1931 2BD7 20 28 21 JSR bin2AsciiHex + 1932 2BDA 8D 02 2C STA MEMLOvalue+3 + 1933 2BDD AD E8 02 LDA MEMLO+1 + 1934 2BE0 48 PHA + 1935 2BE1 4A LSR + 1936 2BE2 4A LSR + 1937 2BE3 4A LSR + 1938 2BE4 4A LSR + 1939 2BE5 20 28 21 JSR bin2AsciiHex + 1940 2BE8 8D FF 2B STA MEMLOvalue + 1941 2BEB 68 PLA + 1942 2BEC 20 28 21 JSR bin2AsciiHex + 1943 2BEF 8D 00 2C STA MEMLOvalue+1 + 1944 2BF2 20 47 2A JSR PrintXY + 1945 2BF5 1C 17 .BY 28,23 + 1946 2BF7 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" + 1947 2BFF MEMLOvalue + 1948 2BFF 30 30 30 30 .BY "0000" + 1949 2C03 00 .BY $00 + 1950 2C04 60 RTS + 1951 + 1952 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo + 1953 + 1954 2C05 xjsrTableL + 1955 2C05 EB FF 05 .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + 1956 2C08 0B 10 .BY <[xjsr4+1],<[xjsr5+1] + 1957 2C0A 1C 26 32 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + 1958 2C0D 37 3F .BY <[xjsr9+1],<[xjsrA+1] + 1959 2C0F xjsrTableH + 1960 2C0F 27 27 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + 1961 2C12 28 28 .BY >[xjsr4+1],>[xjsr5+1] + 1962 2C14 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + 1963 2C17 28 28 .BY >[xjsr9+1],>[xjsrA+1] + 1964 ; miejsce na wyliczony offset o jaki przesuwamy procedure + 1965 2C19 HappyOffset + 1966 2C19 00 00 .WO $0000 + 1967 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) + 1968 2C1B DensityCodes + 1969 2C1B F3 E4 F1 .by +$80,"sdq" + 1970 ;.by "SDQ" + 1971 ;.by $0e,$15,$a0 + 1972 2C1E ONtext + 1973 2C1E CF CE A0 .BY +$80,"ON " + 1974 2C21 OFFtext + 1975 2C21 CF C6 C6 .BY +$80,"OFF" + 1976 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) + 1977 2C24 PDVMASKtemp + 1978 2C24 00 .BY $00 + 1979 ; miejsce na blok PERCOM + 1980 2C25 PERCOMdata + 1981 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie + 1982 = 2C31 FirstSectorsTable=*+12 ; omijamy 12b na percom + 1983 ; zostawiamy $30 bajtow wolnego + 1984 + 1985 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow + 1986 = 2D00 ProgramEnd=FirstSectorBuff + 1987 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu + 1988 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu + 1989 2C25 FirstRun + 1990 ; odnotowujemy stan Shift z Bootowania + 1991 2C25 AD 0F D2 LDA SKSTAT + 1992 2C28 29 08 and #$08 + 1993 2C2A D0 03 BNE NoSHIFTboot + 1994 2C2C 8D 25 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 + 1995 2C2F NoSHIFTboot + 1996 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie + 1997 2C2F AD 01 D3 LDA PORTB + 1998 2C32 29 02 AND #$02 + 1999 2C34 D0 0B BNE BrakBasica + 2000 ; jest Basic + 2001 2C36 A0 02 LDY #$2 + 2002 2C38 BASstatprint + 2003 2C38 B9 1E 2C LDA ONtext,y + 2004 2C3B 99 F0 22 STA BASstatus,y + 2005 2C3E 88 DEY + 2006 2C3F 10 F7 bpl BASstatprint + 2007 2C41 BrakBasica + 2008 ; Sprawdzamy istnienie QMEGa + 2009 2C41 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy + 2010 2C43 testQMEGloop + 2011 2C43 B9 01 C0 LDA $C001,y + 2012 2C46 D9 76 2C CMP QMEGstring,y + 2013 2C49 D0 13 bne brakQMEGa + 2014 2C4B 88 dey + 2015 2C4C 10 F5 bpl testQMEGloop + 2016 ; jest QMEG + 2017 2C4E A9 00 LDA #0 + 2018 2C50 8D 23 21 STA QMEG + 2019 2C53 A0 02 LDY #$2 + 2020 2C55 Qstatprint + 2021 2C55 B9 1E 2C LDA ONtext,y + 2022 2C58 99 E8 22 STA QMEGstatus,y + 2023 2C5B 88 DEY + 2024 2C5C 10 F7 bpl Qstatprint + 2025 2C5E brakQMEGa + 2026 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi + 2027 2C5E AD 00 03 LDA DDEVIC + 2028 2C61 18 clc + 2029 2C62 6D 01 03 ADC DUNIT + 2030 2C65 38 sec + 2031 2C66 E9 01 SBC #$01 + 2032 2C68 29 0F AND #$0F ; zapamietanie numeru urzadzenia + 2033 2C6A 8D 24 21 STA BootDrive + 2034 2C6D 20 99 2B JSR SeTDriveNR + 2035 2C70 20 37 21 JSR EditorOpen + 2036 2C73 4C 65 21 JMP mainprog + 2037 2C76 QMEGstring + 2038 2C76 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 + 2039 2C7E 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" + 2040 ;.OPT List + 2041 + 2042 + 2043 = 0080 MAPCOUNTER + 2043 = 0082 COMPRESSEDMAPCOUNTER + 2043 = 0084 MAPCOUNTERMEM + 2043 = 0086 PREVFILESECTOR + 2043 = 0088 MAPPOSITIONMEM + 2043 = 008A SECTOROFFSET + 2043 = 008C SECTORSCOUNTER + 2043 org $02e0 + 2044 02E0-02E1> 99 26 .WO LoaderGo + 2045 ; .WO START + 2046 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) + 2047 ; OPT h- + 2048 ; org $0000 + 2049 ; .WO $0000 + 2050 diff --git a/loaderFN.xex b/loaderFN.xex index dd6d49522ca12e9acd56de95f68de4a95fb64b5f..145439ba7e08bae4c916535ae4c12a3f0e178b14 100644 GIT binary patch delta 2171 zcmYjSZ%iBK8NYiEIBX!HLlNdryZ4Okv(M*XNVm8d&?be%Nv^9zm1^Cj##0r^OhNmQ zs$ZrGljO~;lsBTfs7Vyjd1hDbGA_gWw63v4v;vmF|drtQ&ZAbTfOHX z-S&QXfA8PtdG4Oy`+NS{xY00BD*gMr1zB;+40ATDdBa*~SnCR7m5-9HDCvw6Z}bX| z^AmBCQ$FA|m)o5!nH;QWF5=bP#HV|ROJ|51kHewj(U9g@_7aaKF8hdB@R+C|YF^^f ze8e3ZuetRG+@p&~bJM>e{r7Zf0O>rvkMJL@%PmDtLA>tTGN_F6$CnU(EgxxPdtaF6 z?M#ee7(E}>PlS&zqKJ-&2ONvZTAd%+$7!ySZccNL^l+MIB+O~z$U#ndH4j(DR*q{o3Z#r$^6m~Dv4Jw(SMyfMnt z+q`<2Z64T=f=7~!&VfI@dgKrXj&x?^FbBT$XTiTNfPegIKG+&DT7-aGpiZIqOyXM7 zi!Y z^F#kX;#0McwFO7tUizF%yJN};CT02>vbJL72lK_IY^7Nb zb6l)SR;CZTX&CN4R%Dlwb1A3Q-ZH5}6!1}h!k)@4bhyl?;%`%&MudH&QP1dGI+GWjj^wkp+E=(5| zw1sTl_&()C%m1yy%=+0VHFYKa)KqbIYU;O&-Dzx}@l~1?c(-ue&Lo*LcUI5LE7zRb zZSyPTrqlAb<7oz98-Q}#Rk&@4f?1<~OeYb|AbpCK-$3{qNsX32Est4=$+ivGWS<+i zh1P;wnacij7_H&Z+TI%r))mu^>6%7#^X> zZw18xR}yS0N9Qr^mNGE7gK3X7I9Q^Bu!RiXLKY`t$pEgF;8C0;r|{1`#_0e#V<8EU zUjo9$AQ{ptNX((fj>Sk^S9>a2rOl0@VhcX&(azdpa8Pl2V4^cHgrvqTU@cJJuV@?? z#b&t{yP3og?S$Ki1!@KZ#U4Ni(HIOseE*AMP%k4fI2CqiC;MV_(4(E|Yo#YWQCcb$ zPJ%d`ifBVcek-=22slkJL)}PciR~)GFTP@O^h-`plWI_z8sh+>E_s*oX5Mhg^Z;_` z^ZiLoR}ksc`TkK%R}tybI!!d$HQDJfRuFwpv>yHiQT-X;T>c{wXZ-3rd|=>^^-{&H zm#QrA-o{-mt?ez|Z6SB)GGoB=JQ~u|>u|q8*2Q(O&<;c2na7>Dfvx0Esikusl}4{MWU2sE;{IkIX{OmVhevf3x(LBsO{N{>@QboC5vGJM_S@`(!zl-(+Kc(}Mad zTQgg&Ub6}HNlZ*_8ZtqqwOnW&ra5hHeN=s9YaKZ6(>@C=--QGB))+D!(aY$5De?ED z&l1LYDOhRvV>rY}l{EGs)C z15yuTpu#@s-1E{Emvk&3(RY4uIJ1VkL7-uDQ%HE6sR_!8tLanWG zdQV7NHmqgBkwOO8nN2dk&P3qO7?6Tf(xUQOe&~U8?jMr+bFB9`3#K8^N~~zv?6N;+xT|; zk>AlbPUoDUGC5~tb2?#76V{Yo#`FggO?&ABUj%6W->SjNn^gnJ!20mOx3#3?-&|#6 z(6HwEmwH}OUfzRUL1;|mL8-i|w%OCZ`*~6HK4}c|dH$cD-b#ErImvu0LvF!fXMMu>2v~_rj5&B7brBceS}Vc%!CPpm`SEGfpnTC zO#2TKA4@zb>zX+T*sfAV;eZ35BaICy(<&u1KqR-&Gl(SSqYzt`af_X!ZA{1%)OU7< z$&Iw{V|U(ryYKhjo0xlRUbs+rxL}P>Y84TBE1Hi#JzNEBb#0>T(o#-w(%XzuML%cMf6+lk<>(L-LwUDReYc0x zd99JZ*vlCUQce6Fu=F{%-9b_K zkssf}jo;*IgNFkuGRiJ}!G*_9aXLGGn$!LGCwvSg>-?NiLBHViTb{6O+bNEo;@T$n z%V9rR2jUbx&EXC%bX?`>7LMNJ;;6NeHxB3PbS7UPgs{3s80`*2H}EQIM+ub| zwt>HxXWGWJJVUqhUBiru!tE&1a<-sJ;5Q1#r%0@ zmiRME+E`mN7hJWZGmh{kuYY|Uscduwt4@zLve5vmqG%HvZD7^o(Uq)fkFH|z^Ev;b zpmxaaYq!(4?Z)?FRdEk)^1?fob1I?>L01}M&b%qMzv5^qzb^$UV+Rfg@J4Sa&9mt9xvI{=PkH1YGC#1~ zmbWt4@_|elkpb18nE953{285u}=)eEI>;0&^`|o(=Yt7qVMi8Kb z^}@L|>`&(=oPFhA$I9c@q#jK;TL3)DfUS8s)#Pp#m;a@T{uvJ3mtsySP$hjO|AQ5t z?zH2yH)c&{2NF(wR!jLrtTdTzSDfjy3)?0VGnA~Yc_GQRG5M>~i%!!TL%W>d^vBa` z!X2X0AMF$s-PSyZ=y0Y#KcEa`W+zriBaUxrK{6kiN%oy+nbl`Jo$NaM zF+OSEYDICh_p>{DKb8Cr|3vGw1LDuo3k*#&Y99@s zXYkLxp0F{JsW<+RS!%qK*!l5DC|Bv+vrvL0+yK&aUhEy=7I=F+w6SNK*oJXepCUW0{uXdQNg zGlR#x&H}(KD-B5*2TQ+72+=$9^Kck?1T;R?}0A-@Z%c6U(OXK>)a z3?Yag$?q0dY_1{G)oN0vJ;P8cO0VZM3P5ITYSXqJOh*_}r}Eo+F}=f(dId`VLj8q0 zn>NDGLbX}^$gTbo4CF`|WRy=K97S9T*`o+L;640NHLelmIh=3Jhi0`_PgSe5ns>}Y z8kFUxTGcfMwswiCdkn1Y7Go%0Qk!~JB#TqO7RmRMi^q0}`xmEy?gk17AB;arx!m$Q z+%FxALZ1h1_ z$k|li%R^*1nVSSt?i&j)rS}X%wuZD}rgm7@@}|F&dN_@PI+UORjZ4%`?;q(7)mqwfo`wQ<4hh|9cwUOOOWEJktg z())rw0!`_Fs7B~P5eCk)%UVS%nhsZm2BrawAs#qQy9Di^DD4n5fC2CTi<3g@abe#v zVaoV>kBwV`Zqw{IJPTK8POym2oM7;FA(9S}47|cEyx1Fnzr5Kxp8*oKR$Fe!$E=m^ z8-kJvDCs~j4?{DbiKBPZK`_$=IAJB1TY4e4Z=JVwy;r_x^;^2-%2G#oqu0-bf>NEg zX-Vf~9c&Wf;S}=SjQI4TzVa_s6pWSPyqBJ5(k8huMbcBG!yd#FUMqYgmjF1TQ(Bry{^MO$-%HaMUS1suUi@vJGvO!0Zzh3OH2x;%895QL(5JWsZWlk?;i z5o+YIGBl-Z7NN<_pR;<^YH7_9?DWHjg6l%BzWy8XyUy5gw_Bb!eSV Date: Mon, 13 May 2024 15:53:26 +0200 Subject: [PATCH 5/9] Filename fix --- loaderFN.asm | 2 +- loaderFN.lab | 210 +++---- loaderFN.lst | 1486 +++++++++++++++++++++++++------------------------- loaderFN.xex | Bin 3318 -> 3317 bytes 4 files changed, 849 insertions(+), 849 deletions(-) diff --git a/loaderFN.asm b/loaderFN.asm index 79803ca..b9bb497 100644 --- a/loaderFN.asm +++ b/loaderFN.asm @@ -1250,7 +1250,7 @@ NoZpage JMP loader.LoadStart ; po przepisaniu FileToOpen - .BYTE "H:SCORCH.XEX",155,0 + .BYTE 'H:SCORCH.XEX',0 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba ; na koniec odpowiednie zmodyfikowanie MEMLO ADDspeedProc diff --git a/loaderFN.lab b/loaderFN.lab index 588312d..a10e568 100644 --- a/loaderFN.lab +++ b/loaderFN.lab @@ -261,115 +261,115 @@ Label table: 00 2711 CLEARLOOP1 00 2723 NOZPAGE 00 274A FILETOOPEN -00 2758 ADDSPEEDPROC -00 2772 HAPPYRELOCATE -00 2792 LABEL72X -00 2796 TURBORELOCADDR -00 27A1 LABEL73 -00 27BC NOHAPPYLOADER -00 27BD HAPPYUSMOVEDPROC -00 27D4 COMMANDLOOP -00 27D5 HAPPYSPEED -00 27E0 DELAYLOOPCMD -00 27EA XJSR1 -00 27FE XJSR2 -00 2804 XJSR3 -00 280A XJSR4 -00 280F XJSR5 -00 2812 WAITFORENDOFTRANSMISSION -00 281B XJSR6 -00 2825 DOUBLEACK -00 2825 XJSR7 -00 2831 READSECTORLOOP -00 2831 XJSR8 -00 2836 XJSR9 -00 283E XJSRA -00 2845 ERRORHERE -00 2850 ENDOFTRANSMISSION -00 285E SECTRANSREG -00 2874 PUTSIOBYTE -00 2875 WAITFORSERIAL -00 2888 ADDCHECKSUM -00 2890 GETSIOBYTE -00 2892 EXTERNALLOOP -00 2896 INTERNALLOOP -00 28A6 ACKRECEIVE -00 28BC ENDHAPPYUSPROC -00 28BC BLOKDANYCHIO_GETUSSPEED -00 28C8 DIRMAPEND -00 28CB LABEL39 -00 28DF DISCNOTCHANGED2 -00 2907 LABEL80 -00 2915 NONEXTMAPSECTOR -00 2937 NOINCH -00 2967 LABEL79 -00 2994 LABEL75 -00 29A5 LABEL81 -00 29B3 LABEL82 -00 29C1 READPERCOM -00 29C6 READPERCOMRETRY -00 29DA PERCOMERROR -00 29DF SET1SECT128 -00 29EA BLOKDANYCHIO_PERCOM -00 29F6 READFIRSTSECT -00 2A0C READSECTOR -00 2A15 READSECTOR1 -00 2A23 DISKREADRETRY -00 2A30 LABEL85 -00 2A3A BLOKDANYCHIO -00 2A46 DISKRETRYCOUNT -00 2A47 PRINTXY -00 2A73 LABEL92 -00 2A90 LABEL90 -00 2A97 LABEL91 -00 2A9F LABEL89 -00 2AB1 LABEL93 -00 2AC2 LABEL88 -00 2AC9 LABEL87 -00 2ACF LABEL94 -00 2AD4 GOERRORDISP -00 2AD7 GOSIO -00 2ADF STANDARDSPEED -00 2AE2 TABLE2DCB -00 2AEA IOTABLEADDR -00 2AF4 CLOSE1 -00 2AF6 CLOSEX -00 2AFE GETKEY -00 2B42 GKEYERROR -00 2B45 KDRIVER -00 2B48 DISCCHANGECHECK -00 2B51 LABEL98 -00 2B5E CHANGEDD -00 2B5F ASTERIKS -00 2B7D GETHEXNUMBER -00 2B8D GETHEX4BITS -00 2B98 ISNUMBER -00 2B99 SETDRIVENR -00 2BAC SETDRIVELETTER -00 2BBB SETBLOKDANYCHDRIVE -00 2BC8 MEMLOPRINT -00 2BFF MEMLOVALUE -00 2C05 XJSRTABLEL -00 2C0F XJSRTABLEH -00 2C19 HAPPYOFFSET -00 2C1B DENSITYCODES -00 2C1E ONTEXT -00 2C21 OFFTEXT -00 2C24 PDVMASKTEMP -00 2C25 PERCOMDATA -00 2C31 FIRSTSECTORSTABLE +00 2757 ADDSPEEDPROC +00 2771 HAPPYRELOCATE +00 2791 LABEL72X +00 2795 TURBORELOCADDR +00 27A0 LABEL73 +00 27BB NOHAPPYLOADER +00 27BC HAPPYUSMOVEDPROC +00 27D3 COMMANDLOOP +00 27D4 HAPPYSPEED +00 27DF DELAYLOOPCMD +00 27E9 XJSR1 +00 27FD XJSR2 +00 2803 XJSR3 +00 2809 XJSR4 +00 280E XJSR5 +00 2811 WAITFORENDOFTRANSMISSION +00 281A XJSR6 +00 2824 DOUBLEACK +00 2824 XJSR7 +00 2830 READSECTORLOOP +00 2830 XJSR8 +00 2835 XJSR9 +00 283D XJSRA +00 2844 ERRORHERE +00 284F ENDOFTRANSMISSION +00 285D SECTRANSREG +00 2873 PUTSIOBYTE +00 2874 WAITFORSERIAL +00 2887 ADDCHECKSUM +00 288F GETSIOBYTE +00 2891 EXTERNALLOOP +00 2895 INTERNALLOOP +00 28A5 ACKRECEIVE +00 28BB ENDHAPPYUSPROC +00 28BB BLOKDANYCHIO_GETUSSPEED +00 28C7 DIRMAPEND +00 28CA LABEL39 +00 28DE DISCNOTCHANGED2 +00 2906 LABEL80 +00 2914 NONEXTMAPSECTOR +00 2936 NOINCH +00 2966 LABEL79 +00 2993 LABEL75 +00 29A4 LABEL81 +00 29B2 LABEL82 +00 29C0 READPERCOM +00 29C5 READPERCOMRETRY +00 29D9 PERCOMERROR +00 29DE SET1SECT128 +00 29E9 BLOKDANYCHIO_PERCOM +00 29F5 READFIRSTSECT +00 2A0B READSECTOR +00 2A14 READSECTOR1 +00 2A22 DISKREADRETRY +00 2A2F LABEL85 +00 2A39 BLOKDANYCHIO +00 2A45 DISKRETRYCOUNT +00 2A46 PRINTXY +00 2A72 LABEL92 +00 2A8F LABEL90 +00 2A96 LABEL91 +00 2A9E LABEL89 +00 2AB0 LABEL93 +00 2AC1 LABEL88 +00 2AC8 LABEL87 +00 2ACE LABEL94 +00 2AD3 GOERRORDISP +00 2AD6 GOSIO +00 2ADE STANDARDSPEED +00 2AE1 TABLE2DCB +00 2AE9 IOTABLEADDR +00 2AF3 CLOSE1 +00 2AF5 CLOSEX +00 2AFD GETKEY +00 2B41 GKEYERROR +00 2B44 KDRIVER +00 2B47 DISCCHANGECHECK +00 2B50 LABEL98 +00 2B5D CHANGEDD +00 2B5E ASTERIKS +00 2B7C GETHEXNUMBER +00 2B8C GETHEX4BITS +00 2B97 ISNUMBER +00 2B98 SETDRIVENR +00 2BAB SETDRIVELETTER +00 2BBA SETBLOKDANYCHDRIVE +00 2BC7 MEMLOPRINT +00 2BFE MEMLOVALUE +00 2C04 XJSRTABLEL +00 2C0E XJSRTABLEH +00 2C18 HAPPYOFFSET +00 2C1A DENSITYCODES +00 2C1D ONTEXT +00 2C20 OFFTEXT +00 2C23 PDVMASKTEMP +00 2C24 PERCOMDATA +00 2C30 FIRSTSECTORSTABLE 00 2D00 FIRSTSECTORBUFF 00 2D00 PROGRAMEND 00 2D80 DIRMAPSECTORBUFF 00 2F80 DIRSECTORBUFF -00 2C25 FIRSTRUN -00 2C2F NOSHIFTBOOT -00 2C38 BASSTATPRINT -00 2C41 BRAKBASICA -00 2C43 TESTQMEGLOOP -00 2C55 QSTATPRINT -00 2C5E BRAKQMEGA -00 2C76 QMEGSTRING +00 2C24 FIRSTRUN +00 2C2E NOSHIFTBOOT +00 2C37 BASSTATPRINT +00 2C40 BRAKBASICA +00 2C42 TESTQMEGLOOP +00 2C54 QSTATPRINT +00 2C5D BRAKQMEGA +00 2C75 QMEGSTRING 00 0080 MAPCOUNTER 00 0082 COMPRESSEDMAPCOUNTER 00 0084 MAPCOUNTERMEM diff --git a/loaderFN.lst b/loaderFN.lst index 62be225..414dcb6 100644 --- a/loaderFN.lst +++ b/loaderFN.lst @@ -281,7 +281,7 @@ Source: SYSEQU.ASM 184 = 07D7 TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) 185 186 START - 187 FFFF> 1FFD-2CE6> 4C 25 + JMP FirstRun ;1FFD 4C 70 21 + 187 FFFF> 1FFD-2CE5> 4C 24 + JMP FirstRun ;1FFD 4C 70 21 188 189 190 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu @@ -487,7 +487,7 @@ Source: SYSEQU.ASM 390 2137 EditorOpen 391 ; otwarcie ekranu !!! 392 2137 A2 00 LDX #$00 ; kanal nr 0 - 393 2139 20 F6 2A JSR CloseX ; najpierw Zamkniecie Ekranu + 393 2139 20 F5 2A JSR CloseX ; najpierw Zamkniecie Ekranu 394 213C 30 55 BMI ErrorDisplay 395 213E A2 00 LDX #$00 ; kanal nr 0 396 2140 A9 03 LDA #$03 @@ -512,9 +512,9 @@ Source: SYSEQU.ASM 415 216B 8D 22 21 STA USmode 416 216E F0 1E BEQ NoUSSpeed 417 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler - 418 2170 A0 BC ldy #blokDanychIO_GetUSSpeed - 420 2174 20 E2 2A jsr Table2DCB + 420 2174 20 E1 2A jsr Table2DCB 421 2177 20 59 E4 jsr JSIOINT ; wysylamy "?" 422 217A 10 07 bpl USSpeed 423 217C A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage @@ -523,7 +523,7 @@ Source: SYSEQU.ASM 426 2183 USSpeed 427 2183 A0 02 LDY #$2 428 2185 USstatprint - 429 2185 B9 1E 2C LDA ONtext,y + 429 2185 B9 1D 2C LDA ONtext,y 430 2188 99 F7 22 STA USstatus,y 431 218B 88 DEY 432 218C 10 F7 bpl USstatprint @@ -536,7 +536,7 @@ Source: SYSEQU.ASM 439 2193 ErrorDisplay 440 2193 98 TYA 441 2194 48 PHA - 442 2195 20 F4 2A JSR Close1 + 442 2195 20 F3 2A JSR Close1 443 2198 68 PLA 444 2199 48 PHA 445 219A 4A LSR @@ -548,7 +548,7 @@ Source: SYSEQU.ASM 451 21A4 68 PLA 452 21A5 20 28 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX 453 21A8 8D BB 21 STA ErrorNumHex+1 - 454 21AB 20 47 2A JSR PrintXY + 454 21AB 20 46 2A JSR PrintXY 455 21AE 00 00 .BY $00,$00 456 21B0 7D .BY $7d ; kod czyszczenia ekranu 457 21B1 45 52 52 4F 52 20 + .BY "ERROR - $" @@ -567,14 +567,14 @@ Source: SYSEQU.ASM 470 ; po bledzie przechodzimy na te z ktorej sie ladowalismy 471 21CB AD 24 21 LDA BootDrive 472 ;LDA #1 - 473 21CE 20 99 2B JSR SeTDriveNR + 473 21CE 20 98 2B JSR SeTDriveNR 474 ; ----------------- 475 21D1 4C 65 21 JMP mainprog ; i odpalamy program od nowa 476 21D4 ReadMainDir - 477 21D4 20 C1 29 JSR ReadPERCOM + 477 21D4 20 C0 29 JSR ReadPERCOM 478 21D7 A2 2D LDX #>FirstSectorBuff 479 21D9 A0 00 LDY #" @@ -984,7 +984,7 @@ Source: SYSEQU.ASM 887 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) 888 2503 C9 10 CMP #$10 889 2505 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) - 890 2507 20 AC 2B JSR SeTDriveLetter + 890 2507 20 AB 2B JSR SeTDriveLetter 891 250A 4C 65 21 JMP mainprog 892 250D noCtrlLetter 893 ; sprawdzenie klawiszy 1-8 @@ -994,7 +994,7 @@ Source: SYSEQU.ASM 897 2513 B0 09 BCS NoNumber 898 2515 38 SEC 899 2516 E9 30 SBC #'0' - 900 2518 20 99 2B JSR SeTDriveNR + 900 2518 20 98 2B JSR SeTDriveNR 901 251B 4C 65 21 JMP mainprog 902 ; ----------------- 903 251E NoNumber @@ -1008,9 +1008,9 @@ Source: SYSEQU.ASM 911 2529 B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz 912 252B 0A ASL 913 252C AA TAX - 914 252D BD 31 2C LDA FirstSectorsTable,X + 914 252D BD 30 2C LDA FirstSectorsTable,X 915 2530 85 D4 STA $D4 - 916 2532 BD 32 2C LDA FirstSectorsTable+1,X + 916 2532 BD 31 2C LDA FirstSectorsTable+1,X 917 2535 85 D5 STA $D5 918 2537 A0 00 LDY #$00 919 2539 B1 D4 LDA ($D4),Y @@ -1027,7 +1027,7 @@ Source: SYSEQU.ASM 930 254B SubDirText 931 254B 3C 53 55 42 2D 44 + .BY "" 932 2554 GOtoLoader - 933 2554 20 48 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 933 2554 20 47 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka 934 2557 F0 03 BEQ DiskNotChanged1 935 2559 4C D4 21 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego 936 255C DiskNotChanged1 @@ -1042,11 +1042,11 @@ Source: SYSEQU.ASM 945 256B A0 01 LDY #$01 946 256D B1 D4 LDA ($D4),Y 947 256F 8D D7 20 STA .adr loader.FirstMapSectorNr ; przed przepisaniem - 948 2572 8D 44 2A sta blokDanychIO+$A ; od razu do bloku IOCB + 948 2572 8D 43 2A sta blokDanychIO+$A ; od razu do bloku IOCB 949 2575 C8 INY 950 2576 B1 D4 LDA ($D4),Y 951 2578 8D D8 20 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem - 952 257B 8D 45 2A sta blokDanychIO+$B ; od razu do bloku IOCB + 952 257B 8D 44 2A sta blokDanychIO+$B ; od razu do bloku IOCB 953 257E C8 INY 954 257F B1 D4 LDA ($D4),Y 955 2581 49 FF EOR #$FF @@ -1070,7 +1070,7 @@ Source: SYSEQU.ASM 973 ; czytamy pierwszy sektor mapy 974 2596 A0 80 LDY #DirMapSectorBuff - 976 259A 20 0C 2A Jsr ReadSector + 976 259A 20 0B 2A Jsr ReadSector 977 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! 978 259D A9 00 LDA #00 979 259F 85 82 STA CompressedMapCounter @@ -1173,12 +1173,12 @@ Source: SYSEQU.ASM 1076 264C 0D 81 2D ORA DirMapSectorBuff+1 1077 264F F0 45 BEQ EndMakingMap 1078 2651 AD 80 2D LDA DirMapSectorBuff - 1079 2654 8D 44 2A sta blokDanychIO+$A + 1079 2654 8D 43 2A sta blokDanychIO+$A 1080 2657 AD 81 2D LDA DirMapSectorBuff+1 - 1081 265A 8D 45 2A sta blokDanychIO+$B + 1081 265A 8D 44 2A sta blokDanychIO+$B 1082 265D A0 80 LDY #DirMapSectorBuff - 1084 2661 20 0C 2A Jsr ReadSector + 1084 2661 20 0B 2A Jsr ReadSector 1085 ; zerujemy licznik mapy 1086 2664 A9 00 LDA #$00 1087 2666 85 81 STA MapCounter+1 @@ -1236,13 +1236,13 @@ Source: SYSEQU.ASM 1139 ; STA DOSVEC 1140 ; zapamietanie stanu urzadzen PBI 1141 26B4 AD 47 02 LDA PDVMASK - 1142 26B7 8D 24 2C STA PDVMASKtemp + 1142 26B7 8D 23 2C STA PDVMASKtemp 1143 26BA 4C 74 E4 JMP JRESETWM ; wymuszenie cieplego resetu - z ustawionymi odpowiednimi prametrami powrotu 1144 26BD AfterWormStart 1145 ; wyznaczamy MEMlo, najpierw dodajemy dlugosc bufora na sektor 1146 ; do koncowego adresu naszej procedury 1147 ; odtworzenie stanu PBI - 1148 26BD AD 24 2C LDA PDVMASKtemp + 1148 26BD AD 23 2C LDA PDVMASKtemp 1149 26C0 8D 47 02 STA PDVMASK 1150 ; JSR EditorOpen ; zamiast cieplego startu czyszczenie ekranu 1151 26C3 18 CLC @@ -1268,11 +1268,11 @@ Source: SYSEQU.ASM 1171 26E1 AD E7 02 LDA MEMLO 1172 ; ADC CompressedMapCounter 1173 ; STA MEMLO - 1174 26E4 8D 96 27 STA TurboRelocADDR + 1174 26E4 8D 95 27 STA TurboRelocADDR 1175 26E7 AD E8 02 LDA MEMLO+1 1176 ; ADC CompressedMapCounter+1 1177 ; STA MEMLO+1 - 1178 26EA 8D 97 27 STA TurboRelocADDR+1 + 1178 26EA 8D 96 27 STA TurboRelocADDR+1 1179 26ED A9 71 LDA #JTESTROM @@ -1311,8 +1311,8 @@ Source: SYSEQU.ASM 1214 SectorMapReady 1215 */ 1215 - 1216 2708 20 58 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO - 1217 270B 20 C8 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 1216 2708 20 57 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + 1217 270B 20 C7 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) 1218 1219 270E A2 00 LDX #$00 1220 2710 8A TXA @@ -1348,66 +1348,66 @@ Source: SYSEQU.ASM 1250 1251 2747 4C D9 07 JMP loader.LoadStart ; po przepisaniu 1252 274A FileToOpen - 1253 274A 28 1A 33 23 2F 32 + .BYTE "H:SCORCH.XEX",155,0 + 1253 274A 48 3A 53 43 4F 52 + .BYTE 'H:SCORCH.XEX',0 1254 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba 1255 ; na koniec odpowiednie zmodyfikowanie MEMLO - 1256 2758 ADDspeedProc - 1257 2758 AD 22 21 LDA USmode - 1258 275B F0 5F beq NoHappyLoader + 1256 2757 ADDspeedProc + 1257 2757 AD 22 21 LDA USmode + 1258 275A F0 5F beq NoHappyLoader 1259 ; wyznaczamy offset procedury - 1260 275D 38 SEC - 1261 275E A9 BD LDA #HappyUSMovedProc - 1265 2768 ED E8 02 SBC MEMLO+1 - 1266 276B 8D 1A 2C STA HappyOffset+1 + 1260 275C 38 SEC + 1261 275D A9 BC LDA #HappyUSMovedProc + 1265 2767 ED E8 02 SBC MEMLO+1 + 1266 276A 8D 19 2C STA HappyOffset+1 1267 - 1268 276E A0 00 LDY #0 - 1269 2770 A2 09 LDX #[$A-1] ;xjsrA - the last + 1268 276D A0 00 LDY #0 + 1269 276F A2 09 LDX #[$A-1] ;xjsrA - the last 1270 ; relokujemy skoki pod offset z MEMLO - 1271 2772 HappyRelocate - 1272 2772 38 SEC - 1273 2773 BD 05 2C LDA xjsrTableL,x - 1274 2776 85 32 STA SecBuffer - 1275 2778 BD 0F 2C LDA xjsrTableH,x - 1276 277B 85 33 STA SecBuffer+1 - 1277 277D B1 32 LDA (SecBuffer),y - 1278 277F ED 19 2C SBC HappyOffset - 1279 2782 91 32 STA (SecBuffer),y - 1280 2784 C8 INY - 1281 2785 B1 32 LDA (SecBuffer),y - 1282 2787 ED 1A 2C SBC HappyOffset+1 - 1283 278A 91 32 STA (SecBuffer),y - 1284 278C 88 DEY - 1285 278D CA DEX - 1286 278E 10 E2 BPL HappyRelocate + 1271 2771 HappyRelocate + 1272 2771 38 SEC + 1273 2772 BD 04 2C LDA xjsrTableL,x + 1274 2775 85 32 STA SecBuffer + 1275 2777 BD 0E 2C LDA xjsrTableH,x + 1276 277A 85 33 STA SecBuffer+1 + 1277 277C B1 32 LDA (SecBuffer),y + 1278 277E ED 18 2C SBC HappyOffset + 1279 2781 91 32 STA (SecBuffer),y + 1280 2783 C8 INY + 1281 2784 B1 32 LDA (SecBuffer),y + 1282 2786 ED 19 2C SBC HappyOffset+1 + 1283 2789 91 32 STA (SecBuffer),y + 1284 278B 88 DEY + 1285 278C CA DEX + 1286 278D 10 E2 BPL HappyRelocate 1287 - 1288 2790 A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] - 1289 2792 label72x - 1290 2792 BD BD 27 LDA HappyUSMovedProc,X - 1291 = 2796 TurboRelocADDR=*+1 - 1292 2795 9D 00 0A STA $0A00,X - 1293 2798 CA DEX - 1294 2799 E0 FF CPX #$FF - 1295 279B D0 F5 BNE label72x - 1296 279D A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] - 1297 279F A2 00 LDX #$00 + 1288 278F A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] + 1289 2791 label72x + 1290 2791 BD BC 27 LDA HappyUSMovedProc,X + 1291 = 2795 TurboRelocADDR=*+1 + 1292 2794 9D 00 0A STA $0A00,X + 1293 2797 CA DEX + 1294 2798 E0 FF CPX #$FF + 1295 279A D0 F5 BNE label72x + 1296 279C A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] + 1297 279E A2 00 LDX #$00 1298 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. - 1299 27A1 label73 - 1300 27A1 98 TYA - 1301 27A2 18 CLC - 1302 27A3 6D E7 02 ADC MEMLO - 1303 27A6 8D E7 02 STA MEMLO - 1304 27A9 8A TXA - 1305 27AA 6D E8 02 ADC MEMLO+1 - 1306 27AD 8D E8 02 STA MEMLO+1 - 1307 27B0 AD 96 27 LDA TurboRelocADDR - 1308 27B3 8D 97 07 STA loader.SioJMP+1 ; po przepisaniu - 1309 27B6 AD 97 27 LDA TurboRelocADDR+1 - 1310 27B9 8D 98 07 STA loader.SioJMP+2 ; po przepisaniu - 1311 27BC NoHappyLoader - 1312 27BC 60 RTS + 1299 27A0 label73 + 1300 27A0 98 TYA + 1301 27A1 18 CLC + 1302 27A2 6D E7 02 ADC MEMLO + 1303 27A5 8D E7 02 STA MEMLO + 1304 27A8 8A TXA + 1305 27A9 6D E8 02 ADC MEMLO+1 + 1306 27AC 8D E8 02 STA MEMLO+1 + 1307 27AF AD 95 27 LDA TurboRelocADDR + 1308 27B2 8D 97 07 STA loader.SioJMP+1 ; po przepisaniu + 1309 27B5 AD 96 27 LDA TurboRelocADDR+1 + 1310 27B8 8D 98 07 STA loader.SioJMP+2 ; po przepisaniu + 1311 27BB NoHappyLoader + 1312 27BB 60 RTS 1313 1314 1315 @@ -1415,726 +1415,726 @@ Source: SYSEQU.ASM 1317 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! 1318 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone 1319 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! - 1320 27BD HappyUSMovedProc ; + 1320 27BC HappyUSMovedProc ; 1321 - 1322 27BD AD 04 03 LDA DBUFA - 1323 27C0 85 32 STA SecBuffer - 1324 27C2 AD 05 03 LDA DBUFA+1 - 1325 27C5 85 33 STA SecBuffer+1 + 1322 27BC AD 04 03 LDA DBUFA + 1323 27BF 85 32 STA SecBuffer + 1324 27C1 AD 05 03 LDA DBUFA+1 + 1325 27C4 85 33 STA SecBuffer+1 1326 - 1327 27C7 AD 08 03 LDA DBYT - 1328 27CA 85 31 STA SecLenUS + 1327 27C6 AD 08 03 LDA DBYT + 1328 27C9 85 31 STA SecLenUS 1329 - 1330 27CC 78 SEI - 1331 27CD BA TSX - 1332 27CE 86 37 STX StackCopy - 1333 27D0 A9 0D LDA #$0D - 1334 27D2 85 34 STA CRETRYZ + 1330 27CB 78 SEI + 1331 27CC BA TSX + 1332 27CD 86 37 STX StackCopy + 1333 27CF A9 0D LDA #$0D + 1334 27D1 85 34 STA CRETRYZ 1335 ;command retry on zero page - 1336 27D4 CommandLoop - 1337 = 27D5 HappySpeed = *+1 - 1338 27D4 A9 28 LDA #$28 ;here goes speed from "?" - 1339 27D6 8D 04 D2 STA AUDF3 - 1340 27D9 A9 34 LDA #$34 - 1341 27DB 8D 03 D3 STA PBCTL ;ustawienie linii command - 1342 27DE A2 80 LDX #$80 - 1343 27E0 DelayLoopCmd - 1344 27E0 CA DEX - 1345 27E1 D0 FD BNE DelayLoopCmd - 1346 27E3 8E 06 D2 STX AUDF4 ; zero - 1347 27E6 86 35 STX TransmitError + 1336 27D3 CommandLoop + 1337 = 27D4 HappySpeed = *+1 + 1338 27D3 A9 28 LDA #$28 ;here goes speed from "?" + 1339 27D5 8D 04 D2 STA AUDF3 + 1340 27D8 A9 34 LDA #$34 + 1341 27DA 8D 03 D3 STA PBCTL ;ustawienie linii command + 1342 27DD A2 80 LDX #$80 + 1343 27DF DelayLoopCmd + 1344 27DF CA DEX + 1345 27E0 D0 FD BNE DelayLoopCmd + 1346 27E2 8E 06 D2 STX AUDF4 ; zero + 1347 27E5 86 35 STX TransmitError 1348 ; pokey init - 1349 27E8 A9 23 LDA #$23 - 1350 27EA 20 5E 28 xjsr1 JSR SecTransReg + 1349 27E7 A9 23 LDA #$23 + 1350 27E9 20 5D 28 xjsr1 JSR SecTransReg 1351 ; 1352 - 1353 27ED 18 CLC - 1354 27EE AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) - 1355 27F1 6D 01 03 ADC DUNIT ; dodajemy numer stacji - 1356 27F4 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) - 1357 27F6 85 30 STA CheckSum - 1358 27F8 8D 0D D2 STA SEROUT - 1359 27FB AD 02 03 LDA DCOMND - 1360 27FE 20 74 28 xjsr2 JSR PutSIOByte - 1361 2801 AD 0A 03 LDA DAUX1 - 1362 2804 20 74 28 xjsr3 JSR PutSIOByte - 1363 2807 AD 0B 03 LDA DAUX2 - 1364 280A 20 74 28 xjsr4 JSR PutSIOByte - 1365 280D A5 30 LDA CheckSum - 1366 280F 20 74 28 xjsr5 JSR PutSIOByte + 1353 27EC 18 CLC + 1354 27ED AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + 1355 27F0 6D 01 03 ADC DUNIT ; dodajemy numer stacji + 1356 27F3 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + 1357 27F5 85 30 STA CheckSum + 1358 27F7 8D 0D D2 STA SEROUT + 1359 27FA AD 02 03 LDA DCOMND + 1360 27FD 20 73 28 xjsr2 JSR PutSIOByte + 1361 2800 AD 0A 03 LDA DAUX1 + 1362 2803 20 73 28 xjsr3 JSR PutSIOByte + 1363 2806 AD 0B 03 LDA DAUX2 + 1364 2809 20 73 28 xjsr4 JSR PutSIOByte + 1365 280C A5 30 LDA CheckSum + 1366 280E 20 73 28 xjsr5 JSR PutSIOByte 1367 - 1368 2812 waitforEndOftransmission - 1369 2812 AD 0E D2 LDA IRQST - 1370 2815 29 08 AND #$08 - 1371 2817 D0 F9 BNE waitforEndOftransmission + 1368 2811 waitforEndOftransmission + 1369 2811 AD 0E D2 LDA IRQST + 1370 2814 29 08 AND #$08 + 1371 2816 D0 F9 BNE waitforEndOftransmission 1372 - 1373 2819 A9 13 LDA #$13 - 1374 281B 20 5E 28 xjsr6 JSR SecTransReg + 1373 2818 A9 13 LDA #$13 + 1374 281A 20 5D 28 xjsr6 JSR SecTransReg 1375 - 1376 281E A9 3C LDA #$3c - 1377 2820 8D 03 D3 STA PBCTL ;command line off + 1376 281D A9 3C LDA #$3c + 1377 281F 8D 03 D3 STA PBCTL ;command line off 1378 ; two ACK's - 1379 2823 A0 02 LDY #2 - 1380 2825 DoubleACK - 1381 2825 20 90 28 xjsr7 JSR GetSIOByte - 1382 2828 C9 44 CMP #$44 - 1383 282A B0 19 BCS ErrorHere - 1384 282C 88 DEY - 1385 282D D0 F6 BNE DoubleACK + 1379 2822 A0 02 LDY #2 + 1380 2824 DoubleACK + 1381 2824 20 8F 28 xjsr7 JSR GetSIOByte + 1382 2827 C9 44 CMP #$44 + 1383 2829 B0 19 BCS ErrorHere + 1384 282B 88 DEY + 1385 282C D0 F6 BNE DoubleACK 1386 1387 ;ldy #0 - 1388 282F 84 30 STY CheckSum - 1389 2831 ReadSectorLoop - 1390 2831 20 90 28 xjsr8 JSR GetSIOByte - 1391 2834 91 32 STA (SecBuffer),y - 1392 2836 20 88 28 xjsr9 JSR AddCheckSum - 1393 2839 C8 INY - 1394 283A C4 31 CPY SecLenUS - 1395 283C D0 F3 BNE ReadSectorLoop + 1388 282E 84 30 STY CheckSum + 1389 2830 ReadSectorLoop + 1390 2830 20 8F 28 xjsr8 JSR GetSIOByte + 1391 2833 91 32 STA (SecBuffer),y + 1392 2835 20 87 28 xjsr9 JSR AddCheckSum + 1393 2838 C8 INY + 1394 2839 C4 31 CPY SecLenUS + 1395 283B D0 F3 BNE ReadSectorLoop 1396 - 1397 283E 20 90 28 xjsrA JSR GetSIOByte - 1398 2841 C5 30 CMP CheckSum - 1399 2843 F0 0B BEQ EndOfTransmission + 1397 283D 20 8F 28 xjsrA JSR GetSIOByte + 1398 2840 C5 30 CMP CheckSum + 1399 2842 F0 0B BEQ EndOfTransmission 1400 ;error!!! - 1401 2845 ErrorHere - 1402 2845 A0 90 LDY #$90 - 1403 2847 84 35 STY TransmitError - 1404 2849 A6 37 LDX StackCopy - 1405 284B 9A TXS - 1406 284C C6 34 DEC CRETRYZ - 1407 284E D0 84 BNE CommandLoop + 1401 2844 ErrorHere + 1402 2844 A0 90 LDY #$90 + 1403 2846 84 35 STY TransmitError + 1404 2848 A6 37 LDX StackCopy + 1405 284A 9A TXS + 1406 284B C6 34 DEC CRETRYZ + 1407 284D D0 84 BNE CommandLoop 1408 - 1409 2850 EndOfTransmission - 1410 2850 A9 00 LDA #0 - 1411 2852 8D 07 D2 STA AUDC4 - 1412 2855 A5 10 LDA IRQENS - 1413 2857 8D 0E D2 STA IRQEN - 1414 285A 58 CLI - 1415 285B A4 35 LDY TransmitError - 1416 285D 60 RTS + 1409 284F EndOfTransmission + 1410 284F A9 00 LDA #0 + 1411 2851 8D 07 D2 STA AUDC4 + 1412 2854 A5 10 LDA IRQENS + 1413 2856 8D 0E D2 STA IRQEN + 1414 2859 58 CLI + 1415 285A A4 35 LDY TransmitError + 1416 285C 60 RTS 1417 - 1418 285E SecTransReg - 1419 285E 8D 0F D2 STA SKCTL - 1420 2861 8D 0A D2 STA SKSTRES - 1421 2864 A9 38 LDA #$38 - 1422 2866 8D 0E D2 STA IRQEN - 1423 2869 A9 28 LDA #$28 - 1424 286B 8D 08 D2 STA AUDCTL - 1425 286E A9 A8 LDA #$A8 - 1426 2870 8D 07 D2 STA AUDC4 - 1427 2873 60 RTS + 1418 285D SecTransReg + 1419 285D 8D 0F D2 STA SKCTL + 1420 2860 8D 0A D2 STA SKSTRES + 1421 2863 A9 38 LDA #$38 + 1422 2865 8D 0E D2 STA IRQEN + 1423 2868 A9 28 LDA #$28 + 1424 286A 8D 08 D2 STA AUDCTL + 1425 286D A9 A8 LDA #$A8 + 1426 286F 8D 07 D2 STA AUDC4 + 1427 2872 60 RTS 1428 - 1429 2874 PutSIOByte - 1430 2874 AA TAX - 1431 2875 waitforSerial - 1432 2875 AD 0E D2 LDA IRQST - 1433 2878 29 10 AND #$10 - 1434 287A D0 F9 BNE waitforSerial + 1429 2873 PutSIOByte + 1430 2873 AA TAX + 1431 2874 waitforSerial + 1432 2874 AD 0E D2 LDA IRQST + 1433 2877 29 10 AND #$10 + 1434 2879 D0 F9 BNE waitforSerial 1435 - 1436 287C 8D 0E D2 STA IRQEN - 1437 287F A9 10 LDA #$10 - 1438 2881 8D 0E D2 STA IRQEN + 1436 287B 8D 0E D2 STA IRQEN + 1437 287E A9 10 LDA #$10 + 1438 2880 8D 0E D2 STA IRQEN 1439 - 1440 2884 8A TXA - 1441 2885 8D 0D D2 STA SEROUT + 1440 2883 8A TXA + 1441 2884 8D 0D D2 STA SEROUT 1442 - 1443 2888 AddCheckSum - 1444 2888 18 CLC - 1445 2889 65 30 ADC CheckSum - 1446 288B 69 00 ADC #0 - 1447 288D 85 30 STA CheckSum - 1448 288F 60 RTS + 1443 2887 AddCheckSum + 1444 2887 18 CLC + 1445 2888 65 30 ADC CheckSum + 1446 288A 69 00 ADC #0 + 1447 288C 85 30 STA CheckSum + 1448 288E 60 RTS 1449 - 1450 2890 GetSIOByte - 1451 2890 A2 0A LDX #10 ;acktimeout - 1452 2892 ExternalLoop - 1453 2892 A9 00 LDA #0 - 1454 2894 85 36 STA looperka - 1455 2896 InternalLoop - 1456 2896 AD 0E D2 LDA IRQST - 1457 2899 29 20 AND #$20 - 1458 289B F0 09 BEQ ACKReceive - 1459 289D C6 36 DEC looperka - 1460 289F D0 F5 BNE InternalLoop - 1461 28A1 CA DEX - 1462 28A2 D0 EE BNE ExternalLoop - 1463 28A4 F0 9F BEQ ErrorHere - 1464 28A6 ACKReceive + 1450 288F GetSIOByte + 1451 288F A2 0A LDX #10 ;acktimeout + 1452 2891 ExternalLoop + 1453 2891 A9 00 LDA #0 + 1454 2893 85 36 STA looperka + 1455 2895 InternalLoop + 1456 2895 AD 0E D2 LDA IRQST + 1457 2898 29 20 AND #$20 + 1458 289A F0 09 BEQ ACKReceive + 1459 289C C6 36 DEC looperka + 1460 289E D0 F5 BNE InternalLoop + 1461 28A0 CA DEX + 1462 28A1 D0 EE BNE ExternalLoop + 1463 28A3 F0 9F BEQ ErrorHere + 1464 28A5 ACKReceive 1465 ; zero we have now - 1466 28A6 8D 0E D2 STA IRQST - 1467 28A9 A9 20 LDA #$20 - 1468 28AB 8D 0E D2 STA IRQST - 1469 28AE AD 0F D2 LDA SKSTAT - 1470 28B1 8D 0A D2 STA SKSTRES - 1471 28B4 29 20 AND #$20 - 1472 28B6 F0 8D BEQ ErrorHere + 1466 28A5 8D 0E D2 STA IRQST + 1467 28A8 A9 20 LDA #$20 + 1468 28AA 8D 0E D2 STA IRQST + 1469 28AD AD 0F D2 LDA SKSTAT + 1470 28B0 8D 0A D2 STA SKSTRES + 1471 28B3 29 20 AND #$20 + 1472 28B5 F0 8D BEQ ErrorHere 1473 ; - 1474 28B8 AD 0D D2 LDA SERIN - 1475 28BB 60 RTS - 1476 28BC EndHappyUSProc + 1474 28B7 AD 0D D2 LDA SERIN + 1475 28BA 60 RTS + 1476 28BB EndHappyUSProc 1477 1478 1479 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler - 1480 28BC blokDanychIO_GetUSSpeed - 1481 28BC 31 01 3F 40 .BY $31,$01,"?",$40 - 1482 28C0 D5 27 .WO HappySpeed - 1483 28C2 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A - 1484 28C8 DirMapEnd - 1485 28C8 4C 94 29 JMP label75 - 1486 28CB label39 - 1487 28CB 85 DA STA $DA - 1488 28CD A5 D0 LDA CurrentFileInfoBuff - 1489 28CF 85 DB STA $DB - 1490 28D1 A5 D1 LDA CurrentFileInfoBuff+1 - 1491 28D3 85 DC STA $DC - 1492 28D5 20 48 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka - 1493 28D8 F0 05 BEQ DiscNotChanged2 - 1494 28DA 68 PLA - 1495 28DB 68 PLA - 1496 28DC 4C D4 21 JMP ReadMainDir - 1497 28DF DiscNotChanged2 + 1480 28BB blokDanychIO_GetUSSpeed + 1481 28BB 31 01 3F 40 .BY $31,$01,"?",$40 + 1482 28BF D4 27 .WO HappySpeed + 1483 28C1 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A + 1484 28C7 DirMapEnd + 1485 28C7 4C 93 29 JMP label75 + 1486 28CA label39 + 1487 28CA 85 DA STA $DA + 1488 28CC A5 D0 LDA CurrentFileInfoBuff + 1489 28CE 85 DB STA $DB + 1490 28D0 A5 D1 LDA CurrentFileInfoBuff+1 + 1491 28D2 85 DC STA $DC + 1492 28D4 20 47 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 1493 28D7 F0 05 BEQ DiscNotChanged2 + 1494 28D9 68 PLA + 1495 28DA 68 PLA + 1496 28DB 4C D4 21 JMP ReadMainDir + 1497 28DE DiscNotChanged2 1498 ; odczyt sektora mapy wskazywanego przez DirMapSec - 1499 28DF A5 D2 LDA DirMapSect - 1500 28E1 8D 44 2A STA blokDanychIO+10 - 1501 28E4 A5 D3 LDA DirMapSect+1 - 1502 28E6 8D 45 2A STA blokDanychIO+11 - 1503 28E9 0D 44 2A ORA blokDanychIO+10 - 1504 28EC F0 DA BEQ DirMapEnd - 1505 28EE A2 2D LDX #>DirMapSectorBuff - 1506 28F0 A0 80 LDY #DirMapSectorBuff + 1506 28EF A0 80 LDY #DirMapSectorBuff ; -- - 1532 291C 65 E3 ADC InMapPointer+1 ; -- - 1533 291E 85 E5 STA TempZP+1 ; -- - 1534 2920 B1 E4 LDA (TempZP),Y - 1535 2922 8D 44 2A STA blokDanychIO+10 - 1536 2925 C8 INY - 1537 2926 B1 E4 LDA (TempZP),Y - 1538 2928 8D 45 2A STA blokDanychIO+11 - 1539 292B 0D 44 2A ORA blokDanychIO+10 - 1540 292E F0 64 BEQ label75 + 1528 2914 A9 80 LDA #DirMapSectorBuff ; -- + 1532 291B 65 E3 ADC InMapPointer+1 ; -- + 1533 291D 85 E5 STA TempZP+1 ; -- + 1534 291F B1 E4 LDA (TempZP),Y + 1535 2921 8D 43 2A STA blokDanychIO+10 + 1536 2924 C8 INY + 1537 2925 B1 E4 LDA (TempZP),Y + 1538 2927 8D 44 2A STA blokDanychIO+11 + 1539 292A 0D 43 2A ORA blokDanychIO+10 + 1540 292D F0 64 BEQ label75 1541 ; i zwiekszenie wskaznika mapy o 2 - 1542 2930 C8 INY - 1543 2931 84 E2 STY InMapPointer - 1544 2933 D0 02 BNE NoIncH ; -- - 1545 2935 E6 E3 INC InMapPointer+1 ; -- - 1546 2937 NoIncH - 1547 2937 AD E5 02 LDA MEMTOP - 1548 293A 38 SEC - 1549 293B E5 D0 SBC CurrentFileInfoBuff - 1550 293D AD E6 02 LDA MEMTOP+1 - 1551 2940 E5 D1 SBC CurrentFileInfoBuff+1 - 1552 2942 F0 50 BEQ label75 - 1553 2944 A4 D0 LDY CurrentFileInfoBuff - 1554 2946 A6 D1 LDX CurrentFileInfoBuff+1 - 1555 2948 20 0C 2A JSR ReadSector - 1556 294B A5 D4 LDA $D4 - 1557 294D 05 D5 ORA $D5 - 1558 294F D0 16 BNE label79 - 1559 2951 A0 03 LDY #$03 - 1560 2953 B1 D0 LDA (CurrentFileInfoBuff),Y - 1561 2955 85 D4 STA $D4 - 1562 2957 C8 INY - 1563 2958 B1 D0 LDA (CurrentFileInfoBuff),Y - 1564 295A 85 D5 STA $D5 - 1565 295C C8 INY - 1566 295D B1 D0 LDA (CurrentFileInfoBuff),Y - 1567 295F F0 06 BEQ label79 - 1568 2961 A9 FF LDA #$FF - 1569 2963 85 D4 STA $D4 - 1570 2965 85 D5 STA $D5 - 1571 2967 label79 - 1572 2967 A5 D0 LDA CurrentFileInfoBuff - 1573 2969 18 CLC - 1574 296A 6D A2 20 ADC .adr loader.SecLen ; przed przepisaniem - 1575 296D 85 D0 STA CurrentFileInfoBuff - 1576 296F A5 D1 LDA CurrentFileInfoBuff+1 - 1577 2971 6D A3 20 ADC .adr loader.SecLen+1 ; przed przepisaniem - 1578 2974 85 D1 STA CurrentFileInfoBuff+1 - 1579 2976 A5 D4 LDA $D4 - 1580 2978 38 SEC - 1581 2979 ED A2 20 SBC .adr loader.SecLen ; przed przepisaniem - 1582 297C 85 D4 STA $D4 - 1583 297E A5 D5 LDA $D5 - 1584 2980 ED A3 20 SBC .adr loader.SecLen+1 ; przed przepisaniem - 1585 2983 85 D5 STA $D5 - 1586 2985 B0 80 BCS label80 - 1587 2987 A5 D0 LDA CurrentFileInfoBuff - 1588 2989 18 CLC - 1589 298A 65 D4 ADC $D4 - 1590 298C 85 D0 STA CurrentFileInfoBuff - 1591 298E A5 D1 LDA CurrentFileInfoBuff+1 - 1592 2990 65 D5 ADC $D5 - 1593 2992 85 D1 STA CurrentFileInfoBuff+1 - 1594 2994 label75 - 1595 2994 A5 DC LDA $DC - 1596 2996 C5 D1 CMP CurrentFileInfoBuff+1 - 1597 2998 90 0B BCC label81 - 1598 299A D0 17 BNE label82 - 1599 299C A5 DB LDA $DB - 1600 299E C5 D0 CMP CurrentFileInfoBuff - 1601 29A0 90 03 BCC label81 - 1602 29A2 D0 0F BNE label82 - 1603 29A4 60 RTS - 1604 29A5 label81 - 1605 29A5 A5 DB LDA $DB - 1606 29A7 18 CLC - 1607 29A8 65 DA ADC $DA - 1608 29AA 85 DB STA $DB - 1609 29AC 90 E6 BCC label75 - 1610 29AE E6 DC INC $DC - 1611 29B0 4C 94 29 JMP label75 - 1612 29B3 label82 - 1613 29B3 A5 DB LDA $DB - 1614 29B5 38 SEC - 1615 29B6 E5 DA SBC $DA - 1616 29B8 85 D0 STA CurrentFileInfoBuff - 1617 29BA A5 DC LDA $DC - 1618 29BC E9 00 SBC #$00 - 1619 29BE 85 D1 STA CurrentFileInfoBuff+1 - 1620 29C0 60 RTS + 1542 292F C8 INY + 1543 2930 84 E2 STY InMapPointer + 1544 2932 D0 02 BNE NoIncH ; -- + 1545 2934 E6 E3 INC InMapPointer+1 ; -- + 1546 2936 NoIncH + 1547 2936 AD E5 02 LDA MEMTOP + 1548 2939 38 SEC + 1549 293A E5 D0 SBC CurrentFileInfoBuff + 1550 293C AD E6 02 LDA MEMTOP+1 + 1551 293F E5 D1 SBC CurrentFileInfoBuff+1 + 1552 2941 F0 50 BEQ label75 + 1553 2943 A4 D0 LDY CurrentFileInfoBuff + 1554 2945 A6 D1 LDX CurrentFileInfoBuff+1 + 1555 2947 20 0B 2A JSR ReadSector + 1556 294A A5 D4 LDA $D4 + 1557 294C 05 D5 ORA $D5 + 1558 294E D0 16 BNE label79 + 1559 2950 A0 03 LDY #$03 + 1560 2952 B1 D0 LDA (CurrentFileInfoBuff),Y + 1561 2954 85 D4 STA $D4 + 1562 2956 C8 INY + 1563 2957 B1 D0 LDA (CurrentFileInfoBuff),Y + 1564 2959 85 D5 STA $D5 + 1565 295B C8 INY + 1566 295C B1 D0 LDA (CurrentFileInfoBuff),Y + 1567 295E F0 06 BEQ label79 + 1568 2960 A9 FF LDA #$FF + 1569 2962 85 D4 STA $D4 + 1570 2964 85 D5 STA $D5 + 1571 2966 label79 + 1572 2966 A5 D0 LDA CurrentFileInfoBuff + 1573 2968 18 CLC + 1574 2969 6D A2 20 ADC .adr loader.SecLen ; przed przepisaniem + 1575 296C 85 D0 STA CurrentFileInfoBuff + 1576 296E A5 D1 LDA CurrentFileInfoBuff+1 + 1577 2970 6D A3 20 ADC .adr loader.SecLen+1 ; przed przepisaniem + 1578 2973 85 D1 STA CurrentFileInfoBuff+1 + 1579 2975 A5 D4 LDA $D4 + 1580 2977 38 SEC + 1581 2978 ED A2 20 SBC .adr loader.SecLen ; przed przepisaniem + 1582 297B 85 D4 STA $D4 + 1583 297D A5 D5 LDA $D5 + 1584 297F ED A3 20 SBC .adr loader.SecLen+1 ; przed przepisaniem + 1585 2982 85 D5 STA $D5 + 1586 2984 B0 80 BCS label80 + 1587 2986 A5 D0 LDA CurrentFileInfoBuff + 1588 2988 18 CLC + 1589 2989 65 D4 ADC $D4 + 1590 298B 85 D0 STA CurrentFileInfoBuff + 1591 298D A5 D1 LDA CurrentFileInfoBuff+1 + 1592 298F 65 D5 ADC $D5 + 1593 2991 85 D1 STA CurrentFileInfoBuff+1 + 1594 2993 label75 + 1595 2993 A5 DC LDA $DC + 1596 2995 C5 D1 CMP CurrentFileInfoBuff+1 + 1597 2997 90 0B BCC label81 + 1598 2999 D0 17 BNE label82 + 1599 299B A5 DB LDA $DB + 1600 299D C5 D0 CMP CurrentFileInfoBuff + 1601 299F 90 03 BCC label81 + 1602 29A1 D0 0F BNE label82 + 1603 29A3 60 RTS + 1604 29A4 label81 + 1605 29A4 A5 DB LDA $DB + 1606 29A6 18 CLC + 1607 29A7 65 DA ADC $DA + 1608 29A9 85 DB STA $DB + 1609 29AB 90 E6 BCC label75 + 1610 29AD E6 DC INC $DC + 1611 29AF 4C 93 29 JMP label75 + 1612 29B2 label82 + 1613 29B2 A5 DB LDA $DB + 1614 29B4 38 SEC + 1615 29B5 E5 DA SBC $DA + 1616 29B7 85 D0 STA CurrentFileInfoBuff + 1617 29B9 A5 DC LDA $DC + 1618 29BB E9 00 SBC #$00 + 1619 29BD 85 D1 STA CurrentFileInfoBuff+1 + 1620 29BF 60 RTS 1621 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora - 1622 29C1 ReadPERCOM - 1623 29C1 A9 04 LDA #$04 - 1624 29C3 8D 46 2A STA DiskRetryCount - 1625 29C6 ReadPERCOMretry - 1626 29C6 A0 EA LDY #blokDanychIO_PERCOM - 1628 29CA 20 E2 2A JSR Table2DCB - 1629 29CD 20 D7 2A JSR GoSIO - 1630 29D0 30 08 BMI PercomError + 1622 29C0 ReadPERCOM + 1623 29C0 A9 04 LDA #$04 + 1624 29C2 8D 45 2A STA DiskRetryCount + 1625 29C5 ReadPERCOMretry + 1626 29C5 A0 E9 LDY #blokDanychIO_PERCOM + 1628 29C9 20 E1 2A JSR Table2DCB + 1629 29CC 20 D6 2A JSR GoSIO + 1630 29CF 30 08 BMI PercomError 1631 ; blok odczytany - ustawmy dlugosc 1 sektora - 1632 29D2 AD 2B 2C LDA PERCOMdata+6 - 1633 29D5 C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 - 1634 29D7 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest - 1635 29D9 60 RTS - 1636 29DA PercomError - 1637 29DA CE 46 2A DEC DiskRetryCount - 1638 29DD D0 E7 BNE ReadPERCOMretry + 1632 29D1 AD 2A 2C LDA PERCOMdata+6 + 1633 29D4 C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + 1634 29D6 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + 1635 29D8 60 RTS + 1636 29D9 PercomError + 1637 29D9 CE 45 2A DEC DiskRetryCount + 1638 29DC D0 E7 BNE ReadPERCOMretry 1639 ; blok nieodczytany - dlugosc 1 sektora na $80 - 1640 29DF Set1Sect128 - 1641 29DF A9 00 LDA #$00 - 1642 29E1 8D 2B 2C STA PERCOMdata+6 - 1643 29E4 A9 80 LDA #$80 - 1644 29E6 8D 2C 2C STA PERCOMdata+7 - 1645 29E9 60 RTS - 1646 29EA blokDanychIO_PERCOM - 1647 29EA 31 01 4E 40 .BY $31,$01,$4E,$40 - 1648 29EE 25 2C .WO PERCOMdata - 1649 29F0 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 + 1640 29DE Set1Sect128 + 1641 29DE A9 00 LDA #$00 + 1642 29E0 8D 2A 2C STA PERCOMdata+6 + 1643 29E3 A9 80 LDA #$80 + 1644 29E5 8D 2B 2C STA PERCOMdata+7 + 1645 29E8 60 RTS + 1646 29E9 blokDanychIO_PERCOM + 1647 29E9 31 01 4E 40 .BY $31,$01,$4E,$40 + 1648 29ED 24 2C .WO PERCOMdata + 1649 29EF 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 1650 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) - 1651 29F6 ReadFirstSect - 1652 29F6 A9 01 LDA #$01 - 1653 29F8 8D 44 2A STA blokDanychIO+10 - 1654 29FB A9 00 LDA #$00 - 1655 29FD 8D 45 2A STA blokDanychIO+11 - 1656 2A00 AD 2B 2C LDA PERCOMdata+6 - 1657 2A03 8D 43 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b - 1658 2A06 AD 2C 2C LDA PERCOMdata+7 - 1659 2A09 4C 15 2A JMP ReadSector1 + 1651 29F5 ReadFirstSect + 1652 29F5 A9 01 LDA #$01 + 1653 29F7 8D 43 2A STA blokDanychIO+10 + 1654 29FA A9 00 LDA #$00 + 1655 29FC 8D 44 2A STA blokDanychIO+11 + 1656 29FF AD 2A 2C LDA PERCOMdata+6 + 1657 2A02 8D 42 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1658 2A05 AD 2B 2C LDA PERCOMdata+7 + 1659 2A08 4C 14 2A JMP ReadSector1 1660 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) 1661 ; reszta danych jak nizej (A nie wazne) - 1662 2A0C ReadSector - 1663 2A0C AD A3 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b - 1664 2A0F 8D 43 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b - 1665 2A12 AD A2 20 LDA .adr loader.SecLen ; przed przepisaniem - 1666 2A15 ReadSector1 - 1667 2A15 8D 42 2A STA blokDanychIO+8 - 1668 2A18 8E 3F 2A STX blokDanychIO+5 - 1669 2A1B 8C 3E 2A STY blokDanychIO+4 - 1670 2A1E A9 04 LDA #$04 - 1671 2A20 8D 46 2A STA DiskRetryCount - 1672 2A23 DiskReadRetry - 1673 2A23 A0 3A LDY #blokDanychIO - 1675 2A27 20 E2 2A JSR Table2DCB - 1676 2A2A 20 D7 2A JSR GoSIO - 1677 2A2D 30 01 BMI label85 - 1678 2A2F 60 RTS - 1679 2A30 label85 - 1680 2A30 CE 46 2A DEC DiskRetryCount - 1681 2A33 D0 EE BNE DiskReadRetry - 1682 2A35 68 PLA - 1683 2A36 68 PLA - 1684 2A37 4C 93 21 JMP ErrorDisplay - 1685 2A3A blokDanychIO - 1686 2A3A 31 01 52 40 .BY $31,$01,$52,$40 - 1687 2A3E 80 2D .WO DirMapSectorBuff - 1688 2A40 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 - 1689 2A46 DiskRetryCount - 1690 2A46 00 .BY $00 - 1691 2A47 PrintXY - 1692 2A47 68 PLA - 1693 2A48 85 C8 STA $C8 - 1694 2A4A 68 PLA - 1695 2A4B 85 C9 STA $C9 - 1696 2A4D A9 00 LDA #$00 - 1697 2A4F 85 DF STA $DF - 1698 2A51 20 C9 2A JSR label87 - 1699 2A54 48 PHA - 1700 2A55 20 C9 2A JSR label87 - 1701 2A58 85 DE STA $DE - 1702 2A5A 0A ASL - 1703 2A5B 0A ASL - 1704 2A5C 18 CLC - 1705 2A5D 65 DE ADC $DE - 1706 2A5F 0A ASL - 1707 2A60 0A ASL - 1708 2A61 26 DF ROL $DF - 1709 2A63 0A ASL - 1710 2A64 26 DF ROL $DF - 1711 2A66 18 CLC - 1712 2A67 65 58 ADC SAVMSC - 1713 2A69 85 DE STA $DE - 1714 2A6B A5 DF LDA $DF - 1715 2A6D 65 59 ADC SAVMSC+1 - 1716 2A6F 85 DF STA $DF - 1717 2A71 68 PLA - 1718 2A72 A8 TAY - 1719 2A73 label92 - 1720 2A73 20 C9 2A JSR label87 - 1721 2A76 C9 00 CMP #$00 - 1722 2A78 F0 48 BEQ label88 - 1723 2A7A C9 7D CMP #$7D - 1724 2A7C F0 21 BEQ label89 - 1725 2A7E A2 00 LDX #$00 - 1726 2A80 86 E0 STX $E0 - 1727 2A82 C9 80 CMP #$80 - 1728 2A84 66 E0 ROR $E0 - 1729 2A86 29 7F AND #$7F - 1730 2A88 C9 20 CMP #$20 - 1731 2A8A B0 04 BCS label90 - 1732 2A8C 09 40 ORA #$40 - 1733 2A8E D0 07 BNE label91 - 1734 2A90 label90 - 1735 2A90 C9 60 CMP #$60 - 1736 2A92 B0 03 BCS label91 - 1737 2A94 38 SEC - 1738 2A95 E9 20 SBC #$20 - 1739 2A97 label91 - 1740 2A97 05 E0 ORA $E0 - 1741 2A99 91 DE STA ($DE),Y - 1742 2A9B C8 INY - 1743 2A9C 4C 73 2A JMP label92 - 1744 2A9F label89 - 1745 2A9F 98 TYA - 1746 2AA0 48 PHA - 1747 2AA1 A5 58 LDA SAVMSC - 1748 2AA3 85 E0 STA $E0 - 1749 2AA5 A9 03 LDA #$03 - 1750 2AA7 AA TAX - 1751 2AA8 18 CLC - 1752 2AA9 65 59 ADC SAVMSC+1 - 1753 2AAB 85 E1 STA $E1 - 1754 2AAD A0 BF LDY #$BF - 1755 2AAF A9 00 LDA #$00 - 1756 2AB1 label93 - 1757 2AB1 91 E0 STA ($E0),Y - 1758 2AB3 88 DEY - 1759 2AB4 C0 FF CPY #$FF - 1760 2AB6 D0 F9 BNE label93 - 1761 2AB8 C6 E1 DEC $E1 - 1762 2ABA CA DEX - 1763 2ABB 10 F4 BPL label93 - 1764 2ABD 68 PLA - 1765 2ABE A8 TAY - 1766 2ABF 4C 73 2A JMP label92 - 1767 2AC2 label88 - 1768 2AC2 A5 C9 LDA $C9 - 1769 2AC4 48 PHA - 1770 2AC5 A5 C8 LDA $C8 - 1771 2AC7 48 PHA - 1772 2AC8 60 RTS - 1773 2AC9 label87 - 1774 2AC9 E6 C8 INC $C8 - 1775 2ACB D0 02 BNE label94 - 1776 2ACD E6 C9 INC $C9 - 1777 2ACF label94 - 1778 2ACF A2 00 LDX #$00 - 1779 2AD1 A1 C8 LDA ($C8,X) - 1780 2AD3 60 RTS - 1781 2AD4 GoErrorDisp - 1782 2AD4 4C 93 21 JMP ErrorDisplay + 1662 2A0B ReadSector + 1663 2A0B AD A3 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + 1664 2A0E 8D 42 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1665 2A11 AD A2 20 LDA .adr loader.SecLen ; przed przepisaniem + 1666 2A14 ReadSector1 + 1667 2A14 8D 41 2A STA blokDanychIO+8 + 1668 2A17 8E 3E 2A STX blokDanychIO+5 + 1669 2A1A 8C 3D 2A STY blokDanychIO+4 + 1670 2A1D A9 04 LDA #$04 + 1671 2A1F 8D 45 2A STA DiskRetryCount + 1672 2A22 DiskReadRetry + 1673 2A22 A0 39 LDY #blokDanychIO + 1675 2A26 20 E1 2A JSR Table2DCB + 1676 2A29 20 D6 2A JSR GoSIO + 1677 2A2C 30 01 BMI label85 + 1678 2A2E 60 RTS + 1679 2A2F label85 + 1680 2A2F CE 45 2A DEC DiskRetryCount + 1681 2A32 D0 EE BNE DiskReadRetry + 1682 2A34 68 PLA + 1683 2A35 68 PLA + 1684 2A36 4C 93 21 JMP ErrorDisplay + 1685 2A39 blokDanychIO + 1686 2A39 31 01 52 40 .BY $31,$01,$52,$40 + 1687 2A3D 80 2D .WO DirMapSectorBuff + 1688 2A3F 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 + 1689 2A45 DiskRetryCount + 1690 2A45 00 .BY $00 + 1691 2A46 PrintXY + 1692 2A46 68 PLA + 1693 2A47 85 C8 STA $C8 + 1694 2A49 68 PLA + 1695 2A4A 85 C9 STA $C9 + 1696 2A4C A9 00 LDA #$00 + 1697 2A4E 85 DF STA $DF + 1698 2A50 20 C8 2A JSR label87 + 1699 2A53 48 PHA + 1700 2A54 20 C8 2A JSR label87 + 1701 2A57 85 DE STA $DE + 1702 2A59 0A ASL + 1703 2A5A 0A ASL + 1704 2A5B 18 CLC + 1705 2A5C 65 DE ADC $DE + 1706 2A5E 0A ASL + 1707 2A5F 0A ASL + 1708 2A60 26 DF ROL $DF + 1709 2A62 0A ASL + 1710 2A63 26 DF ROL $DF + 1711 2A65 18 CLC + 1712 2A66 65 58 ADC SAVMSC + 1713 2A68 85 DE STA $DE + 1714 2A6A A5 DF LDA $DF + 1715 2A6C 65 59 ADC SAVMSC+1 + 1716 2A6E 85 DF STA $DF + 1717 2A70 68 PLA + 1718 2A71 A8 TAY + 1719 2A72 label92 + 1720 2A72 20 C8 2A JSR label87 + 1721 2A75 C9 00 CMP #$00 + 1722 2A77 F0 48 BEQ label88 + 1723 2A79 C9 7D CMP #$7D + 1724 2A7B F0 21 BEQ label89 + 1725 2A7D A2 00 LDX #$00 + 1726 2A7F 86 E0 STX $E0 + 1727 2A81 C9 80 CMP #$80 + 1728 2A83 66 E0 ROR $E0 + 1729 2A85 29 7F AND #$7F + 1730 2A87 C9 20 CMP #$20 + 1731 2A89 B0 04 BCS label90 + 1732 2A8B 09 40 ORA #$40 + 1733 2A8D D0 07 BNE label91 + 1734 2A8F label90 + 1735 2A8F C9 60 CMP #$60 + 1736 2A91 B0 03 BCS label91 + 1737 2A93 38 SEC + 1738 2A94 E9 20 SBC #$20 + 1739 2A96 label91 + 1740 2A96 05 E0 ORA $E0 + 1741 2A98 91 DE STA ($DE),Y + 1742 2A9A C8 INY + 1743 2A9B 4C 72 2A JMP label92 + 1744 2A9E label89 + 1745 2A9E 98 TYA + 1746 2A9F 48 PHA + 1747 2AA0 A5 58 LDA SAVMSC + 1748 2AA2 85 E0 STA $E0 + 1749 2AA4 A9 03 LDA #$03 + 1750 2AA6 AA TAX + 1751 2AA7 18 CLC + 1752 2AA8 65 59 ADC SAVMSC+1 + 1753 2AAA 85 E1 STA $E1 + 1754 2AAC A0 BF LDY #$BF + 1755 2AAE A9 00 LDA #$00 + 1756 2AB0 label93 + 1757 2AB0 91 E0 STA ($E0),Y + 1758 2AB2 88 DEY + 1759 2AB3 C0 FF CPY #$FF + 1760 2AB5 D0 F9 BNE label93 + 1761 2AB7 C6 E1 DEC $E1 + 1762 2AB9 CA DEX + 1763 2ABA 10 F4 BPL label93 + 1764 2ABC 68 PLA + 1765 2ABD A8 TAY + 1766 2ABE 4C 72 2A JMP label92 + 1767 2AC1 label88 + 1768 2AC1 A5 C9 LDA $C9 + 1769 2AC3 48 PHA + 1770 2AC4 A5 C8 LDA $C8 + 1771 2AC6 48 PHA + 1772 2AC7 60 RTS + 1773 2AC8 label87 + 1774 2AC8 E6 C8 INC $C8 + 1775 2ACA D0 02 BNE label94 + 1776 2ACC E6 C9 INC $C9 + 1777 2ACE label94 + 1778 2ACE A2 00 LDX #$00 + 1779 2AD0 A1 C8 LDA ($C8,X) + 1780 2AD2 60 RTS + 1781 2AD3 GoErrorDisp + 1782 2AD3 4C 93 21 JMP ErrorDisplay 1783 ; Skok do Sio lub procedury Turbo - 1784 2AD7 GoSIO - 1785 2AD7 AC 22 21 LDY USmode - 1786 2ADA F0 03 BEQ StandardSpeed - 1787 2ADC 4C BD 27 JMP HappyUSMovedProc ; mozna skakac do tej procki - 1788 2ADF StandardSpeed - 1789 2ADF 4C 59 E4 JMP JSIOINT + 1784 2AD6 GoSIO + 1785 2AD6 AC 22 21 LDY USmode + 1786 2AD9 F0 03 BEQ StandardSpeed + 1787 2ADB 4C BC 27 JMP HappyUSMovedProc ; mozna skakac do tej procki + 1788 2ADE StandardSpeed + 1789 2ADE 4C 59 E4 JMP JSIOINT 1790 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) 1791 ; do bloku kontroli transmisji szeregowej DCB - 1792 2AE2 Table2DCB - 1793 2AE2 8C EB 2A STY IOtableAddr+1 - 1794 2AE5 8E EC 2A STX IOtableAddr+2 - 1795 2AE8 A2 0B LDX #$0B - 1796 2AEA IOtableAddr - 1797 2AEA BD FF FF LDA $FFFF,X - 1798 2AED 9D 00 03 STA DDEVIC,X - 1799 2AF0 CA DEX - 1800 2AF1 10 F7 BPL IOtableAddr - 1801 2AF3 60 RTS - 1802 2AF4 Close1 - 1803 2AF4 A2 10 LDX #$10 - 1804 2AF6 CloseX - 1805 2AF6 A9 0C LDA #$0C - 1806 2AF8 9D 42 03 STA ICCMD,X - 1807 2AFB 4C 56 E4 JMP JCIOMAIN - 1808 2AFE GetKey - 1809 2AFE A2 10 LDX #$10 - 1810 2B00 A9 03 LDA #$03 - 1811 2B02 9D 42 03 STA ICCMD,X - 1812 2B05 A9 04 LDA #$04 - 1813 2B07 9D 4A 03 STA ICAX1,X - 1814 2B0A A9 00 LDA #$00 - 1815 2B0C 9D 4B 03 STA ICAX2,X - 1816 2B0F 9D 49 03 STA ICBUFL+1,X - 1817 2B12 A9 FF LDA #$FF - 1818 2B14 9D 48 03 STA ICBUFL,X - 1819 2B17 A9 45 LDA #Kdriver - 1822 2B1E 9D 45 03 STA ICBUFA+1,X - 1823 2B21 20 56 E4 JSR JCIOMAIN - 1824 2B24 30 1C BMI GKeyError - 1825 2B26 A2 10 LDX #$10 - 1826 2B28 A9 00 LDA #$00 - 1827 2B2A 9D 48 03 STA ICBUFL,X - 1828 2B2D 9D 49 03 STA ICBUFL+1,X - 1829 2B30 A9 07 LDA #$07 - 1830 2B32 9D 42 03 STA ICCMD,X - 1831 2B35 20 56 E4 JSR JCIOMAIN - 1832 2B38 30 08 BMI GKeyError - 1833 2B3A 48 PHA - 1834 2B3B 20 F4 2A JSR Close1 - 1835 2B3E 30 02 BMI GKeyError - 1836 2B40 68 PLA - 1837 2B41 60 RTS - 1838 2B42 GKeyError - 1839 2B42 4C D4 2A JMP GoErrorDisp - 1840 2B45 Kdriver - 1841 2B45 4B 3A 9B .BY "K:",$9B - 1842 2B48 DiscChangeCheck - 1843 2B48 A0 80 LDY #DirMapSectorBuff - 1845 2B4C 20 F6 29 JSR ReadFirstSect - 1846 2B4F A2 7F LDX #$7F - 1847 2B51 label98 - 1848 2B51 BD 00 2D LDA FirstSectorBuff,X - 1849 2B54 DD 80 2D CMP DirMapSectorBuff,X - 1850 2B57 D0 05 BNE ChangedD - 1851 2B59 CA DEX - 1852 2B5A 10 F5 BPL label98 - 1853 2B5C A9 00 LDA #$00 - 1854 2B5E ChangedD - 1855 2B5E 60 RTS + 1792 2AE1 Table2DCB + 1793 2AE1 8C EA 2A STY IOtableAddr+1 + 1794 2AE4 8E EB 2A STX IOtableAddr+2 + 1795 2AE7 A2 0B LDX #$0B + 1796 2AE9 IOtableAddr + 1797 2AE9 BD FF FF LDA $FFFF,X + 1798 2AEC 9D 00 03 STA DDEVIC,X + 1799 2AEF CA DEX + 1800 2AF0 10 F7 BPL IOtableAddr + 1801 2AF2 60 RTS + 1802 2AF3 Close1 + 1803 2AF3 A2 10 LDX #$10 + 1804 2AF5 CloseX + 1805 2AF5 A9 0C LDA #$0C + 1806 2AF7 9D 42 03 STA ICCMD,X + 1807 2AFA 4C 56 E4 JMP JCIOMAIN + 1808 2AFD GetKey + 1809 2AFD A2 10 LDX #$10 + 1810 2AFF A9 03 LDA #$03 + 1811 2B01 9D 42 03 STA ICCMD,X + 1812 2B04 A9 04 LDA #$04 + 1813 2B06 9D 4A 03 STA ICAX1,X + 1814 2B09 A9 00 LDA #$00 + 1815 2B0B 9D 4B 03 STA ICAX2,X + 1816 2B0E 9D 49 03 STA ICBUFL+1,X + 1817 2B11 A9 FF LDA #$FF + 1818 2B13 9D 48 03 STA ICBUFL,X + 1819 2B16 A9 44 LDA #Kdriver + 1822 2B1D 9D 45 03 STA ICBUFA+1,X + 1823 2B20 20 56 E4 JSR JCIOMAIN + 1824 2B23 30 1C BMI GKeyError + 1825 2B25 A2 10 LDX #$10 + 1826 2B27 A9 00 LDA #$00 + 1827 2B29 9D 48 03 STA ICBUFL,X + 1828 2B2C 9D 49 03 STA ICBUFL+1,X + 1829 2B2F A9 07 LDA #$07 + 1830 2B31 9D 42 03 STA ICCMD,X + 1831 2B34 20 56 E4 JSR JCIOMAIN + 1832 2B37 30 08 BMI GKeyError + 1833 2B39 48 PHA + 1834 2B3A 20 F3 2A JSR Close1 + 1835 2B3D 30 02 BMI GKeyError + 1836 2B3F 68 PLA + 1837 2B40 60 RTS + 1838 2B41 GKeyError + 1839 2B41 4C D3 2A JMP GoErrorDisp + 1840 2B44 Kdriver + 1841 2B44 4B 3A 9B .BY "K:",$9B + 1842 2B47 DiscChangeCheck + 1843 2B47 A0 80 LDY #DirMapSectorBuff + 1845 2B4B 20 F5 29 JSR ReadFirstSect + 1846 2B4E A2 7F LDX #$7F + 1847 2B50 label98 + 1848 2B50 BD 00 2D LDA FirstSectorBuff,X + 1849 2B53 DD 80 2D CMP DirMapSectorBuff,X + 1850 2B56 D0 05 BNE ChangedD + 1851 2B58 CA DEX + 1852 2B59 10 F5 BPL label98 + 1853 2B5B A9 00 LDA #$00 + 1854 2B5D ChangedD + 1855 2B5D 60 RTS 1856 ; obsluga gwiazdki 1857 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * 1858 ; w Y jest ) - X moze lepiej nie ruszac :) - 1859 2B5F Asteriks - 1860 2B5F A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) - 1861 2B61 20 7D 2B JSR GetHexNumber - 1862 2B64 8D C5 02 STA COLPF1S ; literki - 1863 2B67 C8 INY - 1864 2B68 20 7D 2B JSR GetHexNumber - 1865 2B6B 8D C6 02 STA COLPF2S ; tlo - 1866 2B6E C8 INY - 1867 2B6F 20 7D 2B JSR GetHexNumber - 1868 2B72 8D C8 02 STA COLBAKS ; ramka - 1869 2B75 C8 INY - 1870 2B76 20 7D 2B JSR GetHexNumber - 1871 2B79 8D 26 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) - 1872 2B7C 60 RTS + 1859 2B5E Asteriks + 1860 2B5E A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + 1861 2B60 20 7C 2B JSR GetHexNumber + 1862 2B63 8D C5 02 STA COLPF1S ; literki + 1863 2B66 C8 INY + 1864 2B67 20 7C 2B JSR GetHexNumber + 1865 2B6A 8D C6 02 STA COLPF2S ; tlo + 1866 2B6D C8 INY + 1867 2B6E 20 7C 2B JSR GetHexNumber + 1868 2B71 8D C8 02 STA COLBAKS ; ramka + 1869 2B74 C8 INY + 1870 2B75 20 7C 2B JSR GetHexNumber + 1871 2B78 8D 26 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + 1872 2B7B 60 RTS 1873 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX 1874 ; i zamienia na bajt w A - 1875 2B7D GetHexNumber - 1876 2B7D 20 8D 2B JSR GetHEX4bits - 1877 2B80 0A ASL - 1878 2B81 0A ASL - 1879 2B82 0A ASL - 1880 2B83 0A ASL - 1881 2B84 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. - 1882 2B86 C8 INY - 1883 2B87 20 8D 2B JSR GetHEX4bits - 1884 2B8A 05 E4 ORA TempZP - 1885 2B8C 60 RTS - 1886 2B8D GetHEX4bits - 1887 2B8D B1 D4 LDA ($D4),Y - 1888 2B8F 38 SEC - 1889 2B90 E9 30 SBC #'0' - 1890 2B92 C9 0A CMP #$0A ; sprawdzmy czy cyfra - 1891 2B94 90 02 BCC IsNumber - 1892 2B96 E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow - 1893 2B98 IsNumber - 1894 2B98 60 RTS + 1875 2B7C GetHexNumber + 1876 2B7C 20 8C 2B JSR GetHEX4bits + 1877 2B7F 0A ASL + 1878 2B80 0A ASL + 1879 2B81 0A ASL + 1880 2B82 0A ASL + 1881 2B83 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + 1882 2B85 C8 INY + 1883 2B86 20 8C 2B JSR GetHEX4bits + 1884 2B89 05 E4 ORA TempZP + 1885 2B8B 60 RTS + 1886 2B8C GetHEX4bits + 1887 2B8C B1 D4 LDA ($D4),Y + 1888 2B8E 38 SEC + 1889 2B8F E9 30 SBC #'0' + 1890 2B91 C9 0A CMP #$0A ; sprawdzmy czy cyfra + 1891 2B93 90 02 BCC IsNumber + 1892 2B95 E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow + 1893 2B97 IsNumber + 1894 2B97 60 RTS 1895 ; Ustawia numer satcji wg A - 1896 2B99 SeTDriveNR - 1897 2B99 C9 09 CMP #$09 - 1898 2B9B B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry - 1899 2B9D 20 BB 2B JSR SeTblokDanychDrive - 1900 2BA0 18 CLC - 1901 2BA1 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 - 1902 2BA3 8D D5 22 STA DriveDisp1 - 1903 2BA6 A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu - 1904 2BA8 8D D4 22 STA DriveDisp1-1 - 1905 2BAB 60 RTS - 1906 2BAC SeTDriveLetter - 1907 2BAC 20 BB 2B JSR SeTblokDanychDrive - 1908 2BAF 18 CLC - 1909 2BB0 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu - 1910 2BB2 8D D5 22 STA DriveDisp1 - 1911 2BB5 A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja - 1912 2BB7 8D D4 22 STA DriveDisp1-1 - 1913 2BBA 60 RTS - 1914 2BBB SeTblokDanychDrive - 1915 2BBB 8D 9B 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem - 1916 2BBE 8D 3B 2A STA blokDanychIO+1 - 1917 2BC1 8D BD 28 STA blokDanychIO_GetUSSpeed+1 - 1918 2BC4 8D EB 29 STA blokDanychIO_PERCOM+1 - 1919 2BC7 60 RTS + 1896 2B98 SeTDriveNR + 1897 2B98 C9 09 CMP #$09 + 1898 2B9A B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + 1899 2B9C 20 BA 2B JSR SeTblokDanychDrive + 1900 2B9F 18 CLC + 1901 2BA0 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + 1902 2BA2 8D D5 22 STA DriveDisp1 + 1903 2BA5 A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu + 1904 2BA7 8D D4 22 STA DriveDisp1-1 + 1905 2BAA 60 RTS + 1906 2BAB SeTDriveLetter + 1907 2BAB 20 BA 2B JSR SeTblokDanychDrive + 1908 2BAE 18 CLC + 1909 2BAF 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + 1910 2BB1 8D D5 22 STA DriveDisp1 + 1911 2BB4 A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + 1912 2BB6 8D D4 22 STA DriveDisp1-1 + 1913 2BB9 60 RTS + 1914 2BBA SeTblokDanychDrive + 1915 2BBA 8D 9B 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + 1916 2BBD 8D 3A 2A STA blokDanychIO+1 + 1917 2BC0 8D BC 28 STA blokDanychIO_GetUSSpeed+1 + 1918 2BC3 8D EA 29 STA blokDanychIO_PERCOM+1 + 1919 2BC6 60 RTS 1920 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku - 1921 2BC8 MEMLOprint - 1922 2BC8 AD E7 02 LDA MEMLO - 1923 2BCB 48 PHA - 1924 2BCC 4A LSR - 1925 2BCD 4A LSR - 1926 2BCE 4A LSR - 1927 2BCF 4A LSR - 1928 2BD0 20 28 21 JSR bin2AsciiHex - 1929 2BD3 8D 01 2C STA MEMLOvalue+2 - 1930 2BD6 68 PLA - 1931 2BD7 20 28 21 JSR bin2AsciiHex - 1932 2BDA 8D 02 2C STA MEMLOvalue+3 - 1933 2BDD AD E8 02 LDA MEMLO+1 - 1934 2BE0 48 PHA - 1935 2BE1 4A LSR - 1936 2BE2 4A LSR - 1937 2BE3 4A LSR - 1938 2BE4 4A LSR - 1939 2BE5 20 28 21 JSR bin2AsciiHex - 1940 2BE8 8D FF 2B STA MEMLOvalue - 1941 2BEB 68 PLA - 1942 2BEC 20 28 21 JSR bin2AsciiHex - 1943 2BEF 8D 00 2C STA MEMLOvalue+1 - 1944 2BF2 20 47 2A JSR PrintXY - 1945 2BF5 1C 17 .BY 28,23 - 1946 2BF7 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" - 1947 2BFF MEMLOvalue - 1948 2BFF 30 30 30 30 .BY "0000" - 1949 2C03 00 .BY $00 - 1950 2C04 60 RTS + 1921 2BC7 MEMLOprint + 1922 2BC7 AD E7 02 LDA MEMLO + 1923 2BCA 48 PHA + 1924 2BCB 4A LSR + 1925 2BCC 4A LSR + 1926 2BCD 4A LSR + 1927 2BCE 4A LSR + 1928 2BCF 20 28 21 JSR bin2AsciiHex + 1929 2BD2 8D 00 2C STA MEMLOvalue+2 + 1930 2BD5 68 PLA + 1931 2BD6 20 28 21 JSR bin2AsciiHex + 1932 2BD9 8D 01 2C STA MEMLOvalue+3 + 1933 2BDC AD E8 02 LDA MEMLO+1 + 1934 2BDF 48 PHA + 1935 2BE0 4A LSR + 1936 2BE1 4A LSR + 1937 2BE2 4A LSR + 1938 2BE3 4A LSR + 1939 2BE4 20 28 21 JSR bin2AsciiHex + 1940 2BE7 8D FE 2B STA MEMLOvalue + 1941 2BEA 68 PLA + 1942 2BEB 20 28 21 JSR bin2AsciiHex + 1943 2BEE 8D FF 2B STA MEMLOvalue+1 + 1944 2BF1 20 46 2A JSR PrintXY + 1945 2BF4 1C 17 .BY 28,23 + 1946 2BF6 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" + 1947 2BFE MEMLOvalue + 1948 2BFE 30 30 30 30 .BY "0000" + 1949 2C02 00 .BY $00 + 1950 2C03 60 RTS 1951 1952 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo 1953 - 1954 2C05 xjsrTableL - 1955 2C05 EB FF 05 .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] - 1956 2C08 0B 10 .BY <[xjsr4+1],<[xjsr5+1] - 1957 2C0A 1C 26 32 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] - 1958 2C0D 37 3F .BY <[xjsr9+1],<[xjsrA+1] - 1959 2C0F xjsrTableH - 1960 2C0F 27 27 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] - 1961 2C12 28 28 .BY >[xjsr4+1],>[xjsr5+1] - 1962 2C14 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] - 1963 2C17 28 28 .BY >[xjsr9+1],>[xjsrA+1] + 1954 2C04 xjsrTableL + 1955 2C04 EA FE 04 .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + 1956 2C07 0A 0F .BY <[xjsr4+1],<[xjsr5+1] + 1957 2C09 1B 25 31 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + 1958 2C0C 36 3E .BY <[xjsr9+1],<[xjsrA+1] + 1959 2C0E xjsrTableH + 1960 2C0E 27 27 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + 1961 2C11 28 28 .BY >[xjsr4+1],>[xjsr5+1] + 1962 2C13 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + 1963 2C16 28 28 .BY >[xjsr9+1],>[xjsrA+1] 1964 ; miejsce na wyliczony offset o jaki przesuwamy procedure - 1965 2C19 HappyOffset - 1966 2C19 00 00 .WO $0000 + 1965 2C18 HappyOffset + 1966 2C18 00 00 .WO $0000 1967 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) - 1968 2C1B DensityCodes - 1969 2C1B F3 E4 F1 .by +$80,"sdq" + 1968 2C1A DensityCodes + 1969 2C1A F3 E4 F1 .by +$80,"sdq" 1970 ;.by "SDQ" 1971 ;.by $0e,$15,$a0 - 1972 2C1E ONtext - 1973 2C1E CF CE A0 .BY +$80,"ON " - 1974 2C21 OFFtext - 1975 2C21 CF C6 C6 .BY +$80,"OFF" + 1972 2C1D ONtext + 1973 2C1D CF CE A0 .BY +$80,"ON " + 1974 2C20 OFFtext + 1975 2C20 CF C6 C6 .BY +$80,"OFF" 1976 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) - 1977 2C24 PDVMASKtemp - 1978 2C24 00 .BY $00 + 1977 2C23 PDVMASKtemp + 1978 2C23 00 .BY $00 1979 ; miejsce na blok PERCOM - 1980 2C25 PERCOMdata + 1980 2C24 PERCOMdata 1981 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie - 1982 = 2C31 FirstSectorsTable=*+12 ; omijamy 12b na percom + 1982 = 2C30 FirstSectorsTable=*+12 ; omijamy 12b na percom 1983 ; zostawiamy $30 bajtow wolnego 1984 1985 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow 1986 = 2D00 ProgramEnd=FirstSectorBuff 1987 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu 1988 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu - 1989 2C25 FirstRun + 1989 2C24 FirstRun 1990 ; odnotowujemy stan Shift z Bootowania - 1991 2C25 AD 0F D2 LDA SKSTAT - 1992 2C28 29 08 and #$08 - 1993 2C2A D0 03 BNE NoSHIFTboot - 1994 2C2C 8D 25 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 - 1995 2C2F NoSHIFTboot + 1991 2C24 AD 0F D2 LDA SKSTAT + 1992 2C27 29 08 and #$08 + 1993 2C29 D0 03 BNE NoSHIFTboot + 1994 2C2B 8D 25 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 + 1995 2C2E NoSHIFTboot 1996 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie - 1997 2C2F AD 01 D3 LDA PORTB - 1998 2C32 29 02 AND #$02 - 1999 2C34 D0 0B BNE BrakBasica + 1997 2C2E AD 01 D3 LDA PORTB + 1998 2C31 29 02 AND #$02 + 1999 2C33 D0 0B BNE BrakBasica 2000 ; jest Basic - 2001 2C36 A0 02 LDY #$2 - 2002 2C38 BASstatprint - 2003 2C38 B9 1E 2C LDA ONtext,y - 2004 2C3B 99 F0 22 STA BASstatus,y - 2005 2C3E 88 DEY - 2006 2C3F 10 F7 bpl BASstatprint - 2007 2C41 BrakBasica + 2001 2C35 A0 02 LDY #$2 + 2002 2C37 BASstatprint + 2003 2C37 B9 1D 2C LDA ONtext,y + 2004 2C3A 99 F0 22 STA BASstatus,y + 2005 2C3D 88 DEY + 2006 2C3E 10 F7 bpl BASstatprint + 2007 2C40 BrakBasica 2008 ; Sprawdzamy istnienie QMEGa - 2009 2C41 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy - 2010 2C43 testQMEGloop - 2011 2C43 B9 01 C0 LDA $C001,y - 2012 2C46 D9 76 2C CMP QMEGstring,y - 2013 2C49 D0 13 bne brakQMEGa - 2014 2C4B 88 dey - 2015 2C4C 10 F5 bpl testQMEGloop + 2009 2C40 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy + 2010 2C42 testQMEGloop + 2011 2C42 B9 01 C0 LDA $C001,y + 2012 2C45 D9 75 2C CMP QMEGstring,y + 2013 2C48 D0 13 bne brakQMEGa + 2014 2C4A 88 dey + 2015 2C4B 10 F5 bpl testQMEGloop 2016 ; jest QMEG - 2017 2C4E A9 00 LDA #0 - 2018 2C50 8D 23 21 STA QMEG - 2019 2C53 A0 02 LDY #$2 - 2020 2C55 Qstatprint - 2021 2C55 B9 1E 2C LDA ONtext,y - 2022 2C58 99 E8 22 STA QMEGstatus,y - 2023 2C5B 88 DEY - 2024 2C5C 10 F7 bpl Qstatprint - 2025 2C5E brakQMEGa + 2017 2C4D A9 00 LDA #0 + 2018 2C4F 8D 23 21 STA QMEG + 2019 2C52 A0 02 LDY #$2 + 2020 2C54 Qstatprint + 2021 2C54 B9 1D 2C LDA ONtext,y + 2022 2C57 99 E8 22 STA QMEGstatus,y + 2023 2C5A 88 DEY + 2024 2C5B 10 F7 bpl Qstatprint + 2025 2C5D brakQMEGa 2026 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi - 2027 2C5E AD 00 03 LDA DDEVIC - 2028 2C61 18 clc - 2029 2C62 6D 01 03 ADC DUNIT - 2030 2C65 38 sec - 2031 2C66 E9 01 SBC #$01 - 2032 2C68 29 0F AND #$0F ; zapamietanie numeru urzadzenia - 2033 2C6A 8D 24 21 STA BootDrive - 2034 2C6D 20 99 2B JSR SeTDriveNR - 2035 2C70 20 37 21 JSR EditorOpen - 2036 2C73 4C 65 21 JMP mainprog - 2037 2C76 QMEGstring - 2038 2C76 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 - 2039 2C7E 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" + 2027 2C5D AD 00 03 LDA DDEVIC + 2028 2C60 18 clc + 2029 2C61 6D 01 03 ADC DUNIT + 2030 2C64 38 sec + 2031 2C65 E9 01 SBC #$01 + 2032 2C67 29 0F AND #$0F ; zapamietanie numeru urzadzenia + 2033 2C69 8D 24 21 STA BootDrive + 2034 2C6C 20 98 2B JSR SeTDriveNR + 2035 2C6F 20 37 21 JSR EditorOpen + 2036 2C72 4C 65 21 JMP mainprog + 2037 2C75 QMEGstring + 2038 2C75 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 + 2039 2C7D 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" 2040 ;.OPT List 2041 2042 diff --git a/loaderFN.xex b/loaderFN.xex index 145439ba7e08bae4c916535ae4c12a3f0e178b14..5821f5120a1cc89a40f93e2ac487c2da80ee2fa4 100644 GIT binary patch delta 1136 zcmX|BU2GIp6rMZ#+u3cYVx<)p?`~^%_s%Tt79~r8D(P7==Cj!#ZVM&`~8BaMiP9XBF*CLOj&JC34m z6$v^po#ORIWK2^ABSGoHydcKFt1s3F9OI=uDuA{^&yt8{>R_>V79IbC zm|P4bNx)OxIgg@jtC$)?uhgGgA;>~F-I-@1zjZ|n$8htdrNW4_OLlI}`e$NW p8c3xVZKSKgv{r-c8~{VNJ{F9%J=Se-wcpwsMD(r$edH5w$A9AixbXl0 delta 1134 zcmX|BT}&KR6rMZF{xG}XYO}Ub7Vj=UJ9~H5?k@hUv=)CB*wn=ulScbe*2G3gG{)NC zQwt_c!$WTaxul4Qovbd&sMD}7MzoXAq-}OEsRLbVOX~|=ph$_Mr8Fj5yaUAZaK3ZS zd^tID=9}}NV!gt#vGMOyi$ba{=hzFtI!S=%>Mvw?IFI1rqT4Pr*zYr(5<5{X3_tYu zxgVwqK56i?BwQmB@PJnGJ@A(ghf+s<@M16%mKeBB7J(n^CZ%i${7jx@d#V4C^-}5$ z_Gxb`dfbx>{{TNc2Jfu>buV=B{P|yC;#g8cT@s4q7gNcH%0D(YUE3YKscl z>CqVJDtW8B6#q@|@timzkK=T__y3QYE%#lYD^Gk zB_>x0Lc=4mxdKU9p8!eHZuN2rl+P9L4Tzh`DQh)wk*sy1Jb{!?!?+nqJ()0ck@szf z?6pGbcu}b(d0RbyHlW;P@lZhiNOZ|Xu`I)!a;OX(W$Y^B8)Y1K^*`a;0hlLG+Fv}t zS2on_iPiAs@w)g3qtMUL9+%bCB^Fl*a$uD@&u1Q~D*3|hwVw^(A-gg}ChZM}j_|t_#_|EMbZ&?dTsEVy7I>UjxJ~ageKuki z%4dQO{cm{(Ji^QSu;rS>!hT*$j92vO>%9>g55!;}pT88<@56qQbo4wk8?ZBgVYt*_ zP@K!^;;rnocpD}|hP9)EDknRG6DWI)Zm2AQj5(^89=fJ~9D4%hI*Z%&ck{jTI=gsB zSzzM}y0XYFOdD@}t&dGp?wh6Wbq@x!x8e(PqMp6I%!t!zxdgW$>Gw>~RPC=Q;!r|@ z1`J#JY75ersDwj;+=B%n9R;tyR3~tZi_RzmItqQ(j3^twiWEUed64oIG~*1!ub?wc z==6TH)x0r-wwr@Ad$ol$a?q-wB-BVd=LH%$!SUc@GRFC-*SIQ94WteiPp_ae_sAby z6f_f`v!-ngMc9sXs(@Z=9NARJdN9+iGU4BP!n$?J{Xk~Yk`tZ?Q4Qx!xUvQLEvWaU zAr5iW#9|&|GT`)d{}kHQIgV%jRR0Bk8k*^(nM!7gM iFwDas*(Si`%`QRT(PzF2uJM^ygS5MLf?@KB>*RkX4zqm# From 4a66d2730c3e6278df44f4d14e88084d68f1c86a Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 13 May 2024 15:53:55 +0200 Subject: [PATCH 6/9] Create .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b9bd87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +*.bak From c1cec0d265a107656e14d5b649ef3cac769becf4 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 13 May 2024 20:56:06 +0200 Subject: [PATCH 7/9] It works! --- loaderFN.asm | 24 +- loaderFN.lab | 470 +++---- loaderFN.lst | 3712 +++++++++++++++++++++++++------------------------- loaderFN.xex | Bin 3317 -> 3292 bytes 4 files changed, 2087 insertions(+), 2119 deletions(-) diff --git a/loaderFN.asm b/loaderFN.asm index b9bb497..10a3c31 100644 --- a/loaderFN.asm +++ b/loaderFN.asm @@ -79,13 +79,13 @@ IRQENS = $10 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) ; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku -InBlockAddr = $24 ; word +InBlockAddr = $64 ; word ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) -ToBlockEnd = $26 ; word -BlockLen= $26 ; word +ToBlockEnd = $66 ; word +BlockLen = $66 ; word ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH ToFileEndL = $28 -BlockATemp = $28 +BlockATemp = $68 CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku CheckSUM = $30 @@ -199,23 +199,7 @@ movedproc ToFileEndH .WO $0000 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym - TXA - PHA - LDA ToFileEndL - PHA - LDA CompressedMapPos - PHA - LDA CompressedMapPos+1 - PHA JSR GoInitAddr - PLA - STA CompressedMapPos+1 - PLA - STA CompressedMapPos - PLA - STA ToFileEndL - PLA - TAX FileNextBlock ; wczytanie kolejnego bloku binarnego JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) diff --git a/loaderFN.lab b/loaderFN.lab index a10e568..c53bcbe 100644 --- a/loaderFN.lab +++ b/loaderFN.lab @@ -1,4 +1,4 @@ -mads 2.1.6 build 65 (4 Jun 23) +mads 2.1.7 build 3 (13 Sep 23) Label table: 00 0247 PDVMASK 00 0340 IOCB @@ -70,11 +70,11 @@ Label table: 00 000A DOSVEC 00 000C DOSINI 00 0010 IRQENS -00 0024 INBLOCKADDR -00 0026 TOBLOCKEND -00 0026 BLOCKLEN +00 0064 INBLOCKADDR +00 0066 TOBLOCKEND +00 0066 BLOCKLEN 00 0028 TOFILEENDL -00 0028 BLOCKATEMP +00 0068 BLOCKATEMP 00 003D COMPRESSEDMAPPOS 00 0030 CHECKSUM 00 0031 SECLENUS @@ -130,246 +130,246 @@ Label table: 00 E471 JTESTROM 00 E474 JRESETWM 00 E477 JRESETCD -00 07D7 FILESECBUFF -00 07D7 TEMPMEMLO +00 07BE FILESECBUFF +00 07BE TEMPMEMLO 00 1FFD START 00 2000 MOVEDPROC 00 0700 LOADER 00 0700 LOADER.TOFILEENDH 00 0702 LOADER.FILEINIT -00 071B LOADER.FILENEXTBLOCK -00 0730 LOADER.FILENOFFFFHEAD -00 0763 LOADER.WHATISIT -00 0772 LOADER.FILENOFIRSTBLOCK -00 077C LOADER.BLOCKREADLOOP -00 0788 LOADER.FILEGETBLOCKSTART -00 0793 LOADER.GOINITADDR -00 0796 LOADER.SIOJMP -00 079A LOADER.BLOKDANYCHIO_LOADER -00 07A2 LOADER.SECLEN -00 07A4 LOADER.SECTORNUMBER -00 07A6 LOADER.ENDOFFILE -00 07AF LOADER.JRTS -00 07B0 LOADER.GETFILE2BYTES -00 07B8 LOADER.GETFILEBYTES -00 07D6 LOADER.INSECTORCOUNTH -00 07D7 LOADER.ZZZZZZ -00 07D7 LOADER.FIRSTMAPSECTORNR -00 07D9 LOADER.LOADSTART -00 07E2 LOADER.OUTMEMCLEARLOOP -00 07E4 LOADER.INMEMCLEARLOOP -00 0800 LOADER.LASTMEMPAGECLEAR -00 0821 LOADER.TEMPTOFILEENDL -00 2122 JAKIETURBO -00 2122 USMODE -00 2123 QMEG -00 2124 BOOTDRIVE -00 2125 BOOTSHIFT -00 2126 FOLDERTURBO -00 2127 NEWCOLORS -00 2128 BIN2ASCIIHEX -00 2133 LABELKA -00 2134 EDRIVER -00 2137 EDITOROPEN -00 2165 MAINPROG -00 2183 USSPEED -00 2185 USSTATPRINT -00 218E NOUSSPEED -00 2191 ERROR148 -00 2193 ERRORDISPLAY -00 21BA ERRORNUMHEX -00 21C2 WAITKLOOP -00 21D4 READMAINDIR -00 21ED SPARTADISK -00 21F8 SEKTOR128B -00 220A READDIR -00 2243 LABEL46 -00 2251 LABEL40 -00 225F LABEL43 -00 226C PROGNAME -00 2277 LABEL42 -00 2282 LABEL45 -00 2285 DATFILEFOUND -00 22A5 LABEL47 -00 22BC TOSTARTOFDIR -00 22CD STATUSBARPRINT -00 22D3 DENSITYDISPLAY -00 22D5 DRIVEDISP1 -00 22E8 QMEGSTATUS -00 22F0 BASSTATUS -00 22F7 USSTATUS -00 2373 LABEL68 -00 2381 NOLASTFILEINDIR -00 238B LABEL50 -00 2395 LABEL51 -00 23BC LABEL53 -00 23C4 LABEL56 -00 23CD LABEL55 -00 23D0 LASTFILESPAGEJUMP -00 23D3 LABEL54 -00 23D6 LABEL52 -00 23E8 LABEL65 -00 23F6 LABEL60 -00 2404 COMPARENAMES -00 2406 CHECKING62 -00 2412 REPLACINGNAME -00 241E CHECKNEXTNAME -00 2429 LABEL64 -00 242C GAMENAMEPRINT -00 2438 YPOSGAMENAME -00 2439 GAMEKEYSYMBOL -00 243C GAMENAME -00 2479 LABEL66 -00 2484 LABEL59 -00 248F LABEL69 -00 2492 MAINDIRKEY -00 2495 UPDIRKEY -00 24A5 ESCKEY -00 24B2 NOSHIFTESC -00 24B9 TOSTARTOFDIRJUMP -00 24BC SPACEKEY -00 24C3 CONTARROWSPRINT -00 24D4 LASTFILESPAGE -00 24D6 KEYBOARDPROC -00 24E8 COLORSALREADYSET -00 250D NOCTRLLETTER -00 251E NONUMBER -00 2524 BIGLETTERS -00 254B SUBDIRTEXT -00 2554 GOTOLOADER -00 255C DISKNOTCHANGED1 -00 2568 SETTURBOOFF -00 256B NOSHIFT +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 2F80 COMPRESSEDMAP -00 25C0 GENERATECOMPRESSEDMAP -00 25FF JUMPFORWARD -00 260C OFFSETTOBIG -00 2622 GETNEXTMAPWORD -00 262D SECTOR00 -00 2638 OPS01 -00 2644 NOTEQAL01 -00 266F ADDTOCOMPRESSEDMAP -00 2681 XXXXBLA -00 2689 NOINC013 -00 268A FLUSHBUFFER -00 2695 NOFLUSH -00 2696 ENDMAKINGMAP -00 2699 LOADERGO -00 26AC NORUNFROMDOS -00 26BD AFTERWORMSTART -00 26F9 MOVELOOP1 -00 2711 CLEARLOOP1 -00 2723 NOZPAGE -00 274A FILETOOPEN -00 2757 ADDSPEEDPROC -00 2771 HAPPYRELOCATE -00 2791 LABEL72X -00 2795 TURBORELOCADDR -00 27A0 LABEL73 -00 27BB NOHAPPYLOADER -00 27BC HAPPYUSMOVEDPROC -00 27D3 COMMANDLOOP -00 27D4 HAPPYSPEED -00 27DF DELAYLOOPCMD -00 27E9 XJSR1 -00 27FD XJSR2 -00 2803 XJSR3 -00 2809 XJSR4 -00 280E XJSR5 -00 2811 WAITFORENDOFTRANSMISSION -00 281A XJSR6 -00 2824 DOUBLEACK -00 2824 XJSR7 -00 2830 READSECTORLOOP -00 2830 XJSR8 -00 2835 XJSR9 -00 283D XJSRA -00 2844 ERRORHERE -00 284F ENDOFTRANSMISSION -00 285D SECTRANSREG -00 2873 PUTSIOBYTE -00 2874 WAITFORSERIAL -00 2887 ADDCHECKSUM -00 288F GETSIOBYTE -00 2891 EXTERNALLOOP -00 2895 INTERNALLOOP -00 28A5 ACKRECEIVE -00 28BB ENDHAPPYUSPROC -00 28BB BLOKDANYCHIO_GETUSSPEED -00 28C7 DIRMAPEND -00 28CA LABEL39 -00 28DE DISCNOTCHANGED2 -00 2906 LABEL80 -00 2914 NONEXTMAPSECTOR -00 2936 NOINCH -00 2966 LABEL79 -00 2993 LABEL75 -00 29A4 LABEL81 -00 29B2 LABEL82 -00 29C0 READPERCOM -00 29C5 READPERCOMRETRY -00 29D9 PERCOMERROR -00 29DE SET1SECT128 -00 29E9 BLOKDANYCHIO_PERCOM -00 29F5 READFIRSTSECT -00 2A0B READSECTOR -00 2A14 READSECTOR1 -00 2A22 DISKREADRETRY -00 2A2F LABEL85 -00 2A39 BLOKDANYCHIO -00 2A45 DISKRETRYCOUNT -00 2A46 PRINTXY -00 2A72 LABEL92 -00 2A8F LABEL90 -00 2A96 LABEL91 -00 2A9E LABEL89 -00 2AB0 LABEL93 -00 2AC1 LABEL88 -00 2AC8 LABEL87 -00 2ACE LABEL94 -00 2AD3 GOERRORDISP -00 2AD6 GOSIO -00 2ADE STANDARDSPEED -00 2AE1 TABLE2DCB -00 2AE9 IOTABLEADDR -00 2AF3 CLOSE1 -00 2AF5 CLOSEX -00 2AFD GETKEY -00 2B41 GKEYERROR -00 2B44 KDRIVER -00 2B47 DISCCHANGECHECK -00 2B50 LABEL98 -00 2B5D CHANGEDD -00 2B5E ASTERIKS -00 2B7C GETHEXNUMBER -00 2B8C GETHEX4BITS -00 2B97 ISNUMBER -00 2B98 SETDRIVENR -00 2BAB SETDRIVELETTER -00 2BBA SETBLOKDANYCHDRIVE -00 2BC7 MEMLOPRINT -00 2BFE MEMLOVALUE -00 2C04 XJSRTABLEL -00 2C0E XJSRTABLEH -00 2C18 HAPPYOFFSET -00 2C1A DENSITYCODES -00 2C1D ONTEXT -00 2C20 OFFTEXT -00 2C23 PDVMASKTEMP -00 2C24 PERCOMDATA -00 2C30 FIRSTSECTORSTABLE +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 2D00 FIRSTSECTORBUFF 00 2D00 PROGRAMEND 00 2D80 DIRMAPSECTORBUFF 00 2F80 DIRSECTORBUFF -00 2C24 FIRSTRUN -00 2C2E NOSHIFTBOOT -00 2C37 BASSTATPRINT -00 2C40 BRAKBASICA -00 2C42 TESTQMEGLOOP -00 2C54 QSTATPRINT -00 2C5D BRAKQMEGA -00 2C75 QMEGSTRING +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 0080 MAPCOUNTER 00 0082 COMPRESSEDMAPCOUNTER 00 0084 MAPCOUNTERMEM diff --git a/loaderFN.lst b/loaderFN.lst index 414dcb6..b28ffdd 100644 --- a/loaderFN.lst +++ b/loaderFN.lst @@ -1,4 +1,4 @@ -mads 2.1.6 build 65 (4 Jun 23) +mads 2.1.7 build 3 (13 Sep 23) Source: loaderFN.asm 1 ;MICRO SPARTA DOS 4.7 2 @@ -176,13 +176,13 @@ Source: SYSEQU.ASM 79 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane) 80 81 ; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku - 82 = 0024 InBlockAddr = $24 ; word + 82 = 0064 InBlockAddr = $64 ; word 83 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci) - 84 = 0026 ToBlockEnd = $26 ; word - 85 = 0026 BlockLen= $26 ; word + 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 = 0028 BlockATemp = $28 + 88 = 0068 BlockATemp = $68 89 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku 90 91 = 0030 CheckSUM = $30 @@ -277,11 +277,11 @@ Source: SYSEQU.ASM 180 181 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura 182 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!! - 183 = 07D7 FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu - 184 = 07D7 TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) + 183 = 07BE FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu + 184 = 07BE TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) 185 186 START - 187 FFFF> 1FFD-2CE5> 4C 24 + JMP FirstRun ;1FFD 4C 70 21 + 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 @@ -296,1860 +296,1844 @@ Source: SYSEQU.ASM 199 0700 ToFileEndH 200 0700 00 00 .WO $0000 201 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym - 202 0702 8A TXA - 203 0703 48 PHA - 204 0704 A5 28 LDA ToFileEndL - 205 0706 48 PHA - 206 0707 A5 3D LDA CompressedMapPos - 207 0709 48 PHA - 208 070A A5 3E LDA CompressedMapPos+1 - 209 070C 48 PHA - 210 070D 20 93 07 JSR GoInitAddr - 211 0710 68 PLA - 212 0711 85 3E STA CompressedMapPos+1 - 213 0713 68 PLA - 214 0714 85 3D STA CompressedMapPos - 215 0716 68 PLA - 216 0717 85 28 STA ToFileEndL - 217 0719 68 PLA - 218 071A AA TAX - 219 071B FileNextBlock - 220 ; wczytanie kolejnego bloku binarnego - 221 071B 20 88 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku) - 222 071E C0 88 CPY #$88 ; czy EOF - 223 0720 D0 03 4C A6 07 jeq EndOfFile - 224 0725 A5 24 LDA InBlockAddr - 225 0727 25 25 AND InBlockAddr+1 - 226 0729 C9 FF CMP #$FF ; jesli oba sa $FF to..... - 227 072B D0 03 BNE FileNoFFFFHead - 228 072D 20 88 07 JSR FileGetBlockStart ; pobranie jeszcze raz - 229 0730 FileNoFFFFHead - 230 0730 A5 24 85 28 A5 25 + mwa InBlockAddr BlockATemp ; zapamietanie adresu poczatkowego bloku (na chwile) - 231 0738 A9 26 LDA #BlockLen - 234 073E 85 25 sta InBlockAddr+1 - 235 0740 20 B0 07 JSR GetFile2Bytes ; pobranie dwoch bajtow - ; Pobranie adresu konca ladowanego bloku - 236 0743 C0 88 CPY #$88 ; czy EOF - 237 0745 F0 5F beq EndOfFile - 238 ; wyliczenie długości bloku programu binarnego - 239 0747 38 sec - 240 0748 A5 26 lda BlockLen - 241 074A E5 28 sbc BlockATemp - 242 074C 85 26 sta BlockLen - 243 074E A5 27 lda BlockLen+1 - 244 0750 E5 29 sbc BlockATemp+1 - 245 0752 85 27 sta BlockLen+1 - 246 0754 E6 26 D0 02 E6 27 inw BlockLen - 247 075A A5 28 85 24 A5 29 + mwa BlockATemp InBlockAddr ; odtworzenie adresu poczatkowego bloku - 248 0762 38 SEC - 249 0763 WhatIsIt - 250 0763 B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y - 251 ; ktory tylko wylacza skok !!! - 252 0765 CE 63 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!! - 253 0768 A5 24 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ - 254 076A 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu - 255 076D A5 25 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem - 256 076F 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak). - 257 0772 FileNoFirstBlock - 258 0772 A9 AF LDA #Jrts ; jesli nie jest to blok z adresem inicjacji - 261 0779 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie - 262 - 263 077C BlockReadLoop ;; petla odczytujaca z pliku blok binarny - 264 077C 20 B8 07 JSR GetFileBytes - 265 077F C0 88 CPY #$88 ; czy EOF - 266 0781 F0 23 beq EndOfFile - 267 0783 F0 03 4C 02 07 jne FileInit ; koniec bloku - skok pod adres inicjalizacji - 268 0788 FileGetBlockStart - 269 0788 A9 24 LDA #InBlockAddr - 272 078E 85 25 sta InBlockAddr+1 - 273 0790 4C B0 07 JMP GetFile2Bytes ; pobranie dwoch bajtow - 274 0793 GoInitAddr - 275 0793 6C E2 02 JMP ($02E2) - 276 0796 SioJMP - 277 0796 20 59 E4 JSR JSIOINT - 278 ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie - 279 0799 60 RTS - 280 079A blokDanychIO_Loader - 281 079A 31 01 52 40 D7 07 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 - 282 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) - 283 = 07A2 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 - 284 07A4 SectorNumber - 285 07A4 00 00 .WO $0000 - 286 07A6 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku - 287 07A6 A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu - 288 07A8 48 PHA - 289 07A9 A9 73 LDA #<(JRESETWM-1) - 290 07AB 48 PHA - 291 ;WaitLine0 - 292 ; LDA VCOUNT - 293 ; bne WaitLine0 - 294 07AC 6C E0 02 JMP ($02E0) - 295 07AF Jrts - 296 07AF 60 RTS - 297 07B0 GetFile2Bytes - 298 07B0 A9 02 85 26 A9 00 + mwa #2 BlockLen - 299 07B8 GetFileBytes - 300 07B8 A2 10 LDX #16 ; kanal 1 - 301 07BA A9 07 LDA #CGBINR ; rozkaz BGET - 302 07BC 9D 42 03 STA ICCOM,X ; COMMAND - 303 07BF A5 24 LDA InBlockAddr - 304 07C1 9D 44 03 STA ICBUFA,x - 305 07C4 A5 25 LDA InBlockAddr+1 - 306 07C6 9D 45 03 STA ICBUFA+1,x - 307 07C9 A5 26 LDA BlockLen - 308 07CB 9D 48 03 STA ICBUFL,x - 309 07CE A5 27 LDA BlockLen+1 - 310 07D0 9D 49 03 STA ICBUFL+1,x - 311 07D3 4C 56 E4 JMP CIO - 312 - 313 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X - 314 ; potrzebny do obslugi sektorow wiekszych od 256b - 315 07D6 InSectorCountH - 316 07D6 00 .BY $00 - 317 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700 - 318 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz - 319 ; w tym miejscu potem bedzie bufor - 320 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora - 321 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania - 322 07D7 zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie - 323 07D7 FirstMapSectorNr - 324 07D7 00 00 .WO $0000 - 325 07D9 LoadStart - 326 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP - 327 07D9 AC E7 02 LDY MEMLO - 328 07DC AD E8 02 LDA MEMLO+1 - 329 07DF 8D E6 07 STA InMemClearLoop+2 - 330 07E2 OutMemClearLoop - 331 07E2 A9 00 LDA #$00 - 332 07E4 InMemClearLoop - 333 07E4 99 00 09 STA $0900,Y - 334 07E7 C8 INY - 335 07E8 D0 FA BNE InMemClearLoop - 336 07EA EE E6 07 INC InMemClearLoop+2 - 337 07ED AD E6 07 LDA InMemClearLoop+2 - 338 07F0 CD E6 02 CMP MEMTOP+1 - 339 07F3 90 ED BCC OutMemClearLoop - 340 07F5 AD E6 02 LDA MEMTOP+1 - 341 07F8 8D 02 08 STA LastMemPageClear+2 - 342 07FB AC E5 02 LDY MEMTOP - 343 07FE A9 00 LDA #$00 - 344 0800 LastMemPageClear - 345 0800 99 00 80 STA $8000,Y - 346 0803 88 DEY - 347 0804 C0 FF CPY #$FF - 348 0806 D0 F8 BNE LastMemPageClear - 349 ; wyczyszczona, wiec .... - 350 0808 AD 21 08 LDA tempToFileEndL - 351 080B 85 28 STA ToFileEndL - 352 080D A9 FF LDA #$FF - 353 080F 8D FC 02 STA KBCODES - 354 0812 EE 63 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) - 355 0815 AE A2 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora - 356 0818 AD A3 07 LDA Seclen+1 ; -- - 357 081B 8D D6 07 STA InSectorCountH ; -- obsluga sektorow ponad 256b - 358 ;jmp * - 359 081E 4C 1B 07 JMP FileNextBlock - 360 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku - 361 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera - 362 0821 tempToFileEndL - 363 0821 00 .BY $00 - 364 .endl - 365 2122 JAkieTurbo - 366 2122 USmode - 367 2122 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed - 368 2123 QMEG - 369 2123 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG - 370 2124 BootDrive - 371 2124 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi - 372 2125 BootShift - 373 2125 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety - 374 2126 FolderTurbo - 375 2126 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT - 376 2127 NewColors - 377 2127 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano - 378 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) - 379 2128 bin2AsciiHex - 380 2128 29 0F AND #$0F - 381 212A 09 30 ORA #$30 - 382 212C C9 3A CMP #$3A - 383 212E 90 03 BCC labelka - 384 2130 18 CLC - 385 2131 69 07 ADC #$07 - 386 2133 labelka - 387 2133 60 RTS - 388 2134 Edriver - 389 2134 45 3A 9B .BY "E:",$9b - 390 2137 EditorOpen - 391 ; otwarcie ekranu !!! - 392 2137 A2 00 LDX #$00 ; kanal nr 0 - 393 2139 20 F5 2A JSR CloseX ; najpierw Zamkniecie Ekranu - 394 213C 30 55 BMI ErrorDisplay - 395 213E A2 00 LDX #$00 ; kanal nr 0 - 396 2140 A9 03 LDA #$03 - 397 2142 9D 42 03 STA ICCMD,X - 398 2145 A9 0C LDA #$0C - 399 2147 9D 4A 03 STA ICAX1,X - 400 214A 9D 48 03 STA ICBUFL,X - 401 214D A9 00 LDA #$00 - 402 214F 9D 4B 03 STA ICAX2,X - 403 2152 9D 49 03 STA ICBUFL+1,X - 404 2155 A9 34 LDA #Edriver - 407 215C 9D 45 03 STA ICBUFA+1,X - 408 215F 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0 - 409 2162 30 2F BMI ErrorDisplay - 410 2164 60 RTS - 411 - 412 2165 mainprog - 413 2165 AD 23 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US - 414 2168 2D 25 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza - 415 216B 8D 22 21 STA USmode - 416 216E F0 1E BEQ NoUSSpeed - 417 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler - 418 2170 A0 BB ldy #blokDanychIO_GetUSSpeed - 420 2174 20 E1 2A jsr Table2DCB - 421 2177 20 59 E4 jsr JSIOINT ; wysylamy "?" - 422 217A 10 07 bpl USSpeed - 423 217C A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage - 424 217E 8D 22 21 sta USmode - 425 2181 F0 0B beq NoUSSpeed - 426 2183 USSpeed - 427 2183 A0 02 LDY #$2 - 428 2185 USstatprint - 429 2185 B9 1D 2C LDA ONtext,y - 430 2188 99 F7 22 STA USstatus,y - 431 218B 88 DEY - 432 218C 10 F7 bpl USstatprint - 433 - 434 218E NoUSSpeed - 435 218E 4C D4 21 JMP ReadMainDir - 436 2191 Error148 - 437 2191 A0 94 LDY #$94 ; kod bledu do Y - 438 ; wyswietlenie komunikatu o bledzie - kod bledu w Y - 439 2193 ErrorDisplay - 440 2193 98 TYA - 441 2194 48 PHA - 442 2195 20 F3 2A JSR Close1 - 443 2198 68 PLA - 444 2199 48 PHA - 445 219A 4A LSR - 446 219B 4A LSR - 447 219C 4A LSR - 448 219D 4A LSR - 449 219E 20 28 21 JSR bin2AsciiHex ; 4 starsze bity na HEX - 450 21A1 8D BA 21 STA ErrorNumHex - 451 21A4 68 PLA - 452 21A5 20 28 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX - 453 21A8 8D BB 21 STA ErrorNumHex+1 - 454 21AB 20 46 2A JSR PrintXY - 455 21AE 00 00 .BY $00,$00 - 456 21B0 7D .BY $7d ; kod czyszczenia ekranu - 457 21B1 45 52 52 4F 52 20 + .BY "ERROR - $" - 458 21BA ErrorNumHex - 459 21BA 30 30 00 .BY "00",$00 - 460 ; czekamy na dowolny klawisz - 461 21BD A9 FF LDA #$FF - 462 21BF 8D FC 02 STA KBCODES - 463 21C2 WaitKloop - 464 21C2 AE FC 02 LDX KBCODES - 465 21C5 E8 INX - 466 21C6 F0 FA BEQ WaitKloop - 467 21C8 8D FC 02 STA KBCODES ; w A jest $FF - 468 ; ------------------ - 469 ; na wypadek wybrania nieistniejacej stacji - 470 ; po bledzie przechodzimy na te z ktorej sie ladowalismy - 471 21CB AD 24 21 LDA BootDrive - 472 ;LDA #1 - 473 21CE 20 98 2B JSR SeTDriveNR - 474 ; ----------------- - 475 21D1 4C 65 21 JMP mainprog ; i odpalamy program od nowa - 476 21D4 ReadMainDir - 477 21D4 20 C0 29 JSR ReadPERCOM - 478 21D7 A2 2D LDX #>FirstSectorBuff - 479 21D9 A0 00 LDY #= 4.39 (moga byc sektory wieksze niz 256b) - 488 21EB D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki - 489 21ED SpartaDisk - 490 21ED A2 00 LDX #$00 - 491 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256 - 492 21EF AD 1F 2D LDA FirstSectorBuff+$1F - 493 21F2 30 04 BMI Sektor128b - 494 21F4 AA TAX - 495 21F5 A9 00 LDA #$00 - 496 21F7 E8 INX ; i wyliczenie starszego bajtu - 497 21F8 Sektor128b - 498 21F8 8D A2 20 STA .adr loader.SecLen ; przed przepisaniem - 499 21FB 8E A3 20 STX .adr loader.SecLen+1 ; przed przepisaniem - 500 ; pokazanie na ekranie - 501 21FE BD 1A 2C LDA DensityCodes,X - 502 2201 8D D3 22 STA DensityDisplay - 503 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu - 504 2204 AC 09 2D LDY FirstSectorBuff+$09 - 505 2207 AE 0A 2D LDX FirstSectorBuff+$0A - 506 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x - 507 220A ReadDIR - 508 ; ustawienie znacznika wlaczenia Turbo dla katalogu - 509 220A A9 01 LDA #$01 - 510 220C 8D 26 21 STA FolderTurbo - 511 220F 84 D2 STY DirMapSect - 512 2211 86 D3 STX DirMapSect+1 - 513 2213 A9 2F LDA #>DirSectorBuff - 514 2215 85 D1 STA CurrentFileInfoBuff+1 - 515 2217 85 CB STA CurrentDirBuf+1 - 516 2219 A9 80 LDA #" - 658 2359 3A 4D 61 69 6E 20 + .BY ":Main Dir. " - 659 2365 BC .BY +$80,"<" - 660 2366 3A 55 50 2D 44 49 + .BY ":UP-DIR." - 661 236E 00 .BY $00 - 662 236F A9 00 LDA #$00 - 663 2371 85 D9 STA NamesOnScreen - 664 2373 label68 - 665 2373 A5 D1 LDA CurrentFileInfoBuff+1 - 666 2375 C5 CD CMP CurrentDirBufEnd+1 - 667 2377 90 08 BCC NoLastFileInDir - 668 2379 D0 55 BNE LastFilesPageJump - 669 237B A5 D0 LDA CurrentFileInfoBuff - 670 237D C5 CC CMP CurrentDirBufEnd - 671 237F B0 4F BCS LastFilesPageJump - 672 2381 NoLastFileInDir - 673 2381 A0 00 LDY #$00 - 674 2383 B1 D0 LDA (CurrentFileInfoBuff),Y - 675 2385 F0 49 BEQ LastFilesPageJump - 676 2387 A2 22 LDX #$22 - 677 2389 A9 20 LDA #$20 ; spacja - 678 238B label50 - 679 238B 9D 3C 24 STA GameName,X - 680 238E CA DEX - 681 238F 10 FA BPL label50 - 682 2391 A0 10 LDY #$10 - 683 2393 A2 0A LDX #$0A - 684 2395 label51 - 685 2395 B1 D0 LDA (CurrentFileInfoBuff),Y - 686 2397 9D 3C 24 STA GameName,X - 687 239A 88 DEY - 688 239B CA DEX - 689 239C 10 F7 BPL label51 - 690 239E A5 D9 LDA NamesOnScreen - 691 23A0 18 CLC - 692 23A1 69 41 ADC #$41 ; literka "A" - 693 23A3 8D 39 24 STA GameKeySymbol - 694 23A6 A5 D8 LDA $D8 - 695 23A8 D0 2C BNE label52 - 696 23AA A0 00 LDY #$00 - 697 ; status sprawdzanego pliku - 698 23AC B1 D0 LDA (CurrentFileInfoBuff),Y - 699 23AE 29 19 AND #$19 - 700 23B0 C9 09 CMP #$09 - 701 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" - 702 23B2 F0 08 BEQ label53 - 703 23B4 A6 D7 LDX $D7 - 704 23B6 F0 1B BEQ label54 - 705 23B8 C9 08 CMP #$08 - 706 23BA D0 17 BNE label54 - 707 23BC label53 - 708 ; jeszcze raz status sprawdzanego pliku - 709 23BC B1 D0 LDA (CurrentFileInfoBuff),Y - 710 23BE 29 20 AND #$20 - 711 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) - 712 23C0 F0 0B BEQ label55 - 713 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") - 714 23C2 A2 08 LDX #$08 - 715 23C4 label56 - 716 23C4 BD 4B 25 LDA SubDirText,X - 717 23C7 8D 48 24 STA GameName+12 - 718 23CA CA DEX - 719 23CB 10 F7 BPL label56 - 720 23CD label55 - 721 23CD 4C 2C 24 JMP GameNamePrint - 722 23D0 LastFilesPageJump - 723 23D0 4C D4 24 JMP LastFilesPage - 724 23D3 label54 - 725 23D3 4C 84 24 JMP label59 - 726 23D6 label52 - 727 23D6 A0 00 LDY #$00 - 728 23D8 B1 D0 LDA (CurrentFileInfoBuff),Y - 729 23DA 29 18 AND #$18 - 730 23DC C9 08 CMP #$08 - 731 23DE D0 F3 BNE label54 - 732 23E0 A5 CC LDA CurrentDirBufEnd - 733 23E2 85 D4 STA $D4 - 734 23E4 A5 CD LDA CurrentDirBufEnd+1 - 735 23E6 85 D5 STA $D5 - 736 23E8 label65 - 737 23E8 A5 D5 LDA $D5 - 738 23EA C5 CF CMP $CF - 739 23EC 90 08 BCC label60 - 740 23EE D0 E3 BNE label54 - 741 23F0 A5 D4 LDA $D4 - 742 23F2 C5 CE CMP $CE - 743 23F4 B0 DD BCS label54 - 744 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy - 745 23F6 label60 - 746 23F6 A0 00 LDY #$00 - 747 23F8 B1 D4 LDA ($D4),Y - 748 23FA C9 2A CMP #'*' - 749 23FC D0 06 BNE CompareNames - 750 23FE 8D 27 21 STA NewColors - 751 2401 20 5E 2B JSR Asteriks - 752 2404 CompareNames - 753 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT - 754 2404 A0 0A LDY #$0A ; 8+3 znaki - 755 2406 Checking62 - 756 2406 B1 D4 LDA ($D4),Y - 757 2408 D9 3C 24 CMP GameName,Y - 758 240B D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw - 759 240D 88 DEY - 760 240E 10 F6 BPL Checking62 - 761 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku - 762 2410 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku - 763 2412 ReplacingName - 764 2412 B1 D4 LDA ($D4),Y - 765 2414 99 31 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania - 766 2417 C8 INY - 767 2418 C0 2E CPY #$2E - 768 241A 90 F6 BCC ReplacingName - 769 241C B0 0E BCS GameNamePrint - 770 241E CheckNextName - 771 241E A5 D4 LDA $D4 - 772 2420 18 CLC - 773 2421 69 2E ADC #$2E - 774 2423 85 D4 STA $D4 - 775 2425 90 02 BCC label64 - 776 2427 E6 D5 INC $D5 - 777 2429 label64 - 778 2429 4C E8 23 JMP label65 - 779 242C GameNamePrint - 780 242C A5 D9 LDA NamesOnScreen - 781 242E 18 CLC - 782 242F 69 02 ADC #$02 - 783 2431 8D 38 24 STA YposGameName - 784 2434 20 46 2A JSR PrintXY - 785 2437 01 .BY $01 - 786 2438 YposGameName - 787 2438 02 .BY $02 - 788 2439 GameKeySymbol - 789 2439 41 29 20 .BY "A) " - 790 243C GameName - 791 243C 20 20 20 20 20 20 + .BY " " - 792 245F 00 .BY $00 - 793 2460 A5 D9 LDA NamesOnScreen - 794 2462 0A ASL - 795 2463 AA TAX - 796 2464 A5 D0 LDA CurrentFileInfoBuff - 797 2466 9D 30 2C STA FirstSectorsTable,X - 798 2469 A5 D1 LDA CurrentFileInfoBuff+1 - 799 246B 9D 31 2C STA FirstSectorsTable+1,X - 800 246E A5 D0 LDA CurrentFileInfoBuff - 801 2470 18 CLC - 802 2471 69 17 ADC #$17 - 803 2473 85 D0 STA CurrentFileInfoBuff - 804 2475 90 02 BCC label66 - 805 2477 E6 D1 INC CurrentFileInfoBuff+1 - 806 2479 label66 - 807 2479 E6 D9 INC NamesOnScreen - 808 247B A5 D9 LDA NamesOnScreen - 809 247D C9 13 CMP #$13 - 810 247F B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie - 811 2481 4C 73 23 JMP label68 - 812 2484 label59 - 813 2484 A5 D0 LDA CurrentFileInfoBuff - 814 2486 18 CLC - 815 2487 69 17 ADC #$17 - 816 2489 85 D0 STA CurrentFileInfoBuff - 817 248B 90 02 BCC label69 - 818 248D E6 D1 INC CurrentFileInfoBuff+1 - 819 248F label69 - 820 248F 4C 73 23 JMP label68 - 821 2492 MainDirKEY - 822 2492 4C D4 21 JMP ReadMainDir - 823 2495 UpDirKEY - 824 2495 A0 02 LDY #$02 - 825 2497 B1 CA LDA (CurrentDirBuf),Y - 826 2499 AA TAX - 827 249A 88 DEY - 828 249B 11 CA ORA (CurrentDirBuf),Y - 829 249D F0 37 BEQ KeyboardProc - 830 249F B1 CA LDA (CurrentDirBuf),Y - 831 24A1 A8 TAY - 832 24A2 4C 0A 22 JMP ReadDIR - 833 24A5 EscKEY - 834 ; sprawdzmy czy z Shift - 835 24A5 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!! - 836 24A8 29 08 and #$08 - 837 24AA D0 06 BNE NoSHIFTEsc - 838 24AC 20 37 21 JSR EditorOpen - 839 24AF 6C 0A 00 JMP (DOSVEC) - 840 24B2 NoSHIFTEsc - 841 24B2 A2 00 LDX #$00 - 842 24B4 86 D8 STX $D8 - 843 24B6 E8 INX - 844 24B7 86 D7 STX $D7 - 845 24B9 ToStartOfDirJump - 846 24B9 4C BC 22 JMP ToStartOfDir - 847 24BC SpaceKEY - 848 24BC A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy - 849 24BE D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku - 850 24C0 4C CD 22 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej - 851 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie - 852 24C3 ContArrowsPrint - 853 24C3 20 46 2A JSR PrintXY - 854 24C6 01 15 .BY $01,$15 - 855 24C8 1D .BY $1D ; strzalka w dol - 856 24C9 00 .BY $00 - 857 24CA 20 46 2A JSR PrintXY - 858 24CD 0E 15 .BY $0E,$15 - 859 24CF 1D .BY $1D ; strzalka w dol - 860 24D0 00 .BY $00 - 861 24D1 4C D6 24 JMP KeyboardProc - 862 24D4 LastFilesPage - 863 24D4 E6 D6 INC LastFilesPageFlag - 864 24D6 KeyboardProc - 865 24D6 AD 27 21 LDA NewColors - 866 24D9 D0 0D BNE ColorsAlreadySet - 867 24DB A9 C4 LDA #$C4 ; ustawienie koloru tła i liter - 868 24DD 8D C6 02 STA COLPF2S - 869 24E0 8D C8 02 STA COLBAKS - 870 24E3 A9 CA LDA #$CA - 871 24E5 8D C5 02 STA COLPF1S - 872 24E8 ColorsAlreadySet - 873 24E8 20 FD 2A JSR GetKey - 874 24EB 29 7F AND #%01111111 ; eliminujemy invers - 875 24ED F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu - 876 24EF C9 3E CMP #$3E ; ">" - 877 24F1 F0 9F BEQ MainDirKEY - 878 24F3 C9 3C CMP #$3C ; "<" - 879 24F5 F0 9E BEQ UpDirKEY - 880 24F7 C9 7E CMP #$7E ; BackSpace - 881 24F9 F0 9A BEQ UpDirKEY - 882 24FB C9 1B CMP #$1B ; Esc - 883 24FD F0 A6 BEQ EscKEY - 884 24FF C9 20 CMP #$20 ; Spacja - 885 2501 F0 B9 BEQ SpaceKEY - 886 ; ---------------- - 887 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) - 888 2503 C9 10 CMP #$10 - 889 2505 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) - 890 2507 20 AB 2B JSR SeTDriveLetter - 891 250A 4C 65 21 JMP mainprog - 892 250D noCtrlLetter - 893 ; sprawdzenie klawiszy 1-8 - 894 250D C9 31 CMP #'1' - 895 250F 90 0D BCC NoNumber - 896 2511 C9 39 CMP #'9' - 897 2513 B0 09 BCS NoNumber - 898 2515 38 SEC - 899 2516 E9 30 SBC #'0' - 900 2518 20 98 2B JSR SeTDriveNR - 901 251B 4C 65 21 JMP mainprog - 902 ; ----------------- - 903 251E NoNumber - 904 251E C9 61 CMP #'a' ; czy nie ma capsa - 905 2520 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany - 906 2522 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze) - 907 2524 BigLetters - 908 2524 38 SEC - 909 2525 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy - 910 2527 C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie - 911 2529 B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz - 912 252B 0A ASL - 913 252C AA TAX - 914 252D BD 30 2C LDA FirstSectorsTable,X - 915 2530 85 D4 STA $D4 - 916 2532 BD 31 2C LDA FirstSectorsTable+1,X - 917 2535 85 D5 STA $D5 - 918 2537 A0 00 LDY #$00 - 919 2539 B1 D4 LDA ($D4),Y - 920 253B 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik - 921 253D F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader - 922 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran - 923 253F A0 02 LDY #$02 - 924 2541 B1 D4 LDA ($D4),Y - 925 2543 AA TAX - 926 2544 88 DEY - 927 2545 B1 D4 LDA ($D4),Y - 928 2547 A8 TAY - 929 2548 4C 0A 22 JMP ReadDIR - 930 254B SubDirText - 931 254B 3C 53 55 42 2D 44 + .BY "" - 932 2554 GOtoLoader - 933 2554 20 47 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka - 934 2557 F0 03 BEQ DiskNotChanged1 - 935 2559 4C D4 21 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego - 936 255C DiskNotChanged1 - 937 255C AD 26 21 LDA FolderTurbo - 938 255F F0 07 BEQ SetTurboOFF - 939 2561 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! - 940 2564 29 08 and #$08 - 941 2566 D0 03 BNE NoSHIFT - 942 2568 SetTurboOFF - 943 2568 8D 22 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 - 944 256B NoSHIFT - 945 256B A0 01 LDY #$01 - 946 256D B1 D4 LDA ($D4),Y - 947 256F 8D D7 20 STA .adr loader.FirstMapSectorNr ; przed przepisaniem - 948 2572 8D 43 2A sta blokDanychIO+$A ; od razu do bloku IOCB - 949 2575 C8 INY - 950 2576 B1 D4 LDA ($D4),Y - 951 2578 8D D8 20 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem - 952 257B 8D 44 2A sta blokDanychIO+$B ; od razu do bloku IOCB - 953 257E C8 INY - 954 257F B1 D4 LDA ($D4),Y - 955 2581 49 FF EOR #$FF - 956 2583 8D 21 21 STA .adr loader.tempToFileEndL - 957 2586 C8 INY - 958 2587 B1 D4 LDA ($D4),Y - 959 2589 49 FF EOR #$FF - 960 258B 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem - 961 258E C8 INY - 962 258F B1 D4 LDA ($D4),Y - 963 2591 49 FF EOR #$FF - 964 2593 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem - 965 ; wszystko zapamietane mozna robic mape sektorow.... - 966 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu - 967 ; czyli DirSectorBuff - 968 ; sektor mapy przed kompresja leci do DirMapSectorBuff - 969 ; UWAGA - 970 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi - 971 ; zawierac rozkaz przeczytania pierwszego sektora!!!!! - 972 = 2F80 CompressedMap = DirSectorBuff - 973 ; czytamy pierwszy sektor mapy - 974 2596 A0 80 LDY #DirMapSectorBuff - 976 259A 20 0B 2A Jsr ReadSector - 977 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!! - 978 259D A9 00 LDA #00 - 979 259F 85 82 STA CompressedMapCounter - 980 25A1 85 83 STA CompressedMapCounter+1 - 981 25A3 20 6F 26 JSR AddToCompressedMAP - 982 25A6 AD 84 2D LDA DirMapSectorBuff+4 - 983 25A9 85 86 STA PrevFileSector - 984 25AB 20 6F 26 JSR AddToCompressedMAP - 985 25AE AD 85 2D LDA DirMapSectorBuff+5 - 986 25B1 85 87 sta PrevFileSector+1 - 987 25B3 20 6F 26 JSR AddToCompressedMAP - 988 ; Inicjujemy liczniki - 989 25B6 .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 - 990 25B6 .zpvar PrevFileSector, MapPositionMem .word - 991 25B6 .zpvar SectorOffset .word - 992 25B6 .zpvar SectorsCounter .byte - 993 25B6 A9 00 LDA #$00 - 994 25B8 85 81 STA MapCounter+1 - 995 25BA 85 8C STA SectorsCounter - 996 25BC A9 06 lda #$06 - 997 25BE 85 80 STA MapCounter - 998 25C0 GenerateCompressedMap - 999 25C0 18 CLC - 1000 25C1 A9 80 LDA #DirMapSectorBuff - 1004 25C9 65 81 ADC MapCounter+1 - 1005 25CB 85 89 STA MAPPositionMem+1 - 1006 25CD A2 00 LDX #0 - 1007 25CF A0 01 LDY #1 - 1008 25D1 A1 88 LDA (MAPPositionMem,x) - 1009 25D3 11 88 ORA (MAPPositionMem),y - 1010 25D5 F0 56 BEQ Sector00 - 1011 25D7 38 SEC - 1012 25D8 A1 88 LDA (MAPPositionMem,x) - 1013 25DA E5 86 SBC PrevFileSector - 1014 25DC 85 8A STA SectorOffset - 1015 25DE B1 88 LDA (MAPPositionMem),y - 1016 25E0 E5 87 SBC PrevFileSector+1 - 1017 25E2 85 8B STA SectorOffset+1 - 1018 ; mamy odstep miedzy poprzednim a nastepnym sektorem - 1019 25E4 D0 26 BNE OffsetToBig - 1020 25E6 A5 8A LDA SectorOffset - 1021 25E8 30 22 BMI OffsetToBig ; max przeskok 127 sektorow - 1022 25EA C9 01 CMP #$01 - 1023 25EC D0 11 BNE JumpForward - 1024 ; kolejny sektor - 1025 ; zwiekszamy wiec licznik - 1026 25EE E6 8C inc SectorsCounter - 1027 25F0 A5 8C LDA SectorsCounter - 1028 25F2 C9 7F CMP #%01111111 - 1029 25F4 D0 2C BNE GetNextMapWord - 1030 ; tu licznik dotarl do konca zerujemy go - 1031 ; dodajemy wpis do skompresowanej mapy i gotowe - 1032 25F6 20 6F 26 JSR AddToCompressedMAP - 1033 25F9 A9 00 LDA #0 - 1034 25FB 85 8C STA SectorsCounter - 1035 25FD F0 23 BEQ GetNextMapWord - 1036 ; ominiecie wyznaczonej ilości sektorów (w A) - 1037 25FF JumpForward - 1038 25FF 20 8A 26 JSR FlushBuffer - 1039 2602 A5 8A LDA SectorOffset - 1040 2604 09 80 ORA #%10000000 - 1041 2606 20 6F 26 JSR AddToCompressedMAP - 1042 2609 4C 22 26 JMP GetNextMapWord - 1043 ; wyznaczenie skoku do nowego sektora pliku - 1044 260C OffsetToBig - 1045 260C 20 8A 26 JSR FlushBuffer - 1046 260F A9 00 LDA #0 - 1047 2611 20 6F 26 JSR AddToCompressedMAP - 1048 2614 A0 00 LDY #00 - 1049 2616 B1 88 LDA (MAPPositionMem),y - 1050 2618 20 6F 26 JSR AddToCompressedMAP - 1051 261B A0 01 LDY #01 - 1052 261D B1 88 LDA (MAPPositionMem),y - 1053 261F 20 6F 26 JSR AddToCompressedMAP - 1054 2622 GetNextMapWord - 1055 ; zapamietanie numeru obecnego sektora do porownania potem - 1056 2622 A0 00 LDY #00 - 1057 2624 B1 88 LDA (MAPPositionMem),y - 1058 2626 85 86 STA PrevFileSector - 1059 2628 C8 INY - 1060 2629 B1 88 LDA (MAPPositionMem),y - 1061 262B 85 87 STA PrevFileSector+1 - 1062 262D Sector00 - 1063 262D 18 A5 80 69 02 85 + ADW MapCounter #2 - 1064 2638 ops01 - 1065 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala - 1066 2638 A5 81 LDA MapCounter+1 - 1067 263A CD A3 20 CMP .adr loader.SecLen+1 - 1068 263D D0 05 bne noteqal01 - 1069 263F A5 80 LDA MapCounter - 1070 2641 CD A2 20 CMP .adr loader.SecLen - 1071 2644 noteqal01 - 1072 2644 F0 03 4C C0 25 JNE GenerateCompressedMap - 1073 ; czytamy nastepny sektor mapy - 1074 ; sprawdzmy czy nie koniec - 1075 2649 AD 80 2D LDA DirMapSectorBuff - 1076 264C 0D 81 2D ORA DirMapSectorBuff+1 - 1077 264F F0 45 BEQ EndMakingMap - 1078 2651 AD 80 2D LDA DirMapSectorBuff - 1079 2654 8D 43 2A sta blokDanychIO+$A - 1080 2657 AD 81 2D LDA DirMapSectorBuff+1 - 1081 265A 8D 44 2A sta blokDanychIO+$B - 1082 265D A0 80 LDY #DirMapSectorBuff - 1084 2661 20 0B 2A Jsr ReadSector - 1085 ; zerujemy licznik mapy - 1086 2664 A9 00 LDA #$00 - 1087 2666 85 81 STA MapCounter+1 - 1088 2668 A9 04 lda #$04 - 1089 266A 85 80 STA MapCounter - 1090 266C 4C C0 25 JMP GenerateCompressedMap - 1091 ; dpisanie bajtu z A do mapy sektorow skompresowanej - 1092 266F AddToCompressedMAP - 1093 266F 48 PHA - 1094 ; wyliczamy adresa - 1095 2670 18 CLC - 1096 2671 A5 82 LDA CompressedMapCounter - 1097 2673 69 80 ADC #CompressedMap - 1101 267C 8D 82 26 STA xxxxbla+1 - 1102 267F 68 PLA - 1103 = 2681 xxxxbla=*+1 - 1104 2680 8D FF FF STA $FFFF - 1105 2683 E6 82 INC CompressedMapCounter - 1106 2685 D0 02 BNE noinc013 - 1107 2687 E6 83 INC CompressedMapCounter+1 - 1108 2689 noinc013 - 1109 2689 60 RTS - 1110 268A FlushBuffer - 1111 268A A5 8C LDA SectorsCounter - 1112 268C F0 07 BEQ NoFlush - 1113 268E 20 6F 26 JSR AddToCompressedMAP - 1114 2691 A9 00 LDA #0 - 1115 2693 85 8C STA SectorsCounter - 1116 2695 NoFlush - 1117 2695 60 RTS - 1118 2696 EndMakingMap - 1119 2696 20 8A 26 JSR FlushBuffer - 1120 2699 LoaderGo - 1121 2699 A0 00 LDY #$00 - 1122 269B 8C 44 02 STY COLDST - 1123 269E A9 01 LDA #$01 - 1124 26A0 85 09 STA BOOT - 1125 26A2 AE 00 07 LDX $700 - 1126 26A5 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta - 1127 26A7 D0 03 BNE NoRunFromDOS - 1128 26A9 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!! - 1129 ; STA $D5EC ; to wylacza SpartaDOS X - 1130 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :) - 1131 26AC NoRunFromDOS - 1132 26AC A9 BD LDA #AfterWormStart - 1135 26B2 85 0D STA DOSINI+1 - 1136 ; LDA #>JRESETCD - 1137 ; STA DOSVEC+1 - 1138 ; LDA #TempMEMLO - 1159 26D0 6D A3 20 ADC .adr loader.SecLen+1 - 1160 26D3 8D E8 02 STA MEMLO+1 - 1161 26D6 85 3E STA CompressedMapPos+1 - 1162 ; STA pointerMov2b - 1163 ; STA APPMHI+1 - 1164 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora - 1165 ; jest to jednoczesnie adres umieszczenia skompresowanej - 1166 ; mapy sektorow pliku dla loadera ale MINUS 1 - 1167 26D8 A5 3D D0 02 C6 3E + DEW CompressedMapPos - 1168 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej - 1169 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu) - 1170 26E0 18 CLC - 1171 26E1 AD E7 02 LDA MEMLO - 1172 ; ADC CompressedMapCounter - 1173 ; STA MEMLO - 1174 26E4 8D 95 27 STA TurboRelocADDR - 1175 26E7 AD E8 02 LDA MEMLO+1 - 1176 ; ADC CompressedMapCounter+1 - 1177 ; STA MEMLO+1 - 1178 26EA 8D 96 27 STA TurboRelocADDR+1 - 1179 26ED A9 71 LDA #JTESTROM - 1182 26F3 85 0D STA DOSINI+1 - 1183 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI) - 1184 ; INC $033D ; bajty kontrolne zimnego startu - 1185 ; INC $033E ; zmiana ich wartosci wymusza - 1186 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja) - 1187 26F5 A2 00 LDX #$00 - 1188 26F7 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter) - 1189 ; STX BOOT - 1190 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci - 1191 26F9 moveloop1 - 1192 26F9 BD 00 20 LDA movedproc,X - 1193 26FC 9D 00 07 STA $0700,X - 1194 26FF BD 00 21 LDA movedproc+$0100,X - 1195 2702 9D 00 08 STA $0800,X - 1196 2705 E8 INX - 1197 2706 D0 F1 BNE moveloop1 - 1198 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora - 1199 /* moveloop2 - 1200 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy - 1201 pointerMov2a=*+2 - 1202 LDA CompressedMap,x ; kod samomodyfikujacy sie - 1203 pointerMov2b=*+2 - 1204 STA $FFFF,x ; kod samomodyfikujacy sie - 1205 LDA CompressedMapCounter - 1206 AND CompressedMapCounter+1 - 1207 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!! - 1208 BEQ SectorMapReady - 1209 INX - 1210 BNE moveloop2 - 1211 inc pointerMov2a - 1212 inc pointerMov2b - 1213 bne moveloop2 - 1214 SectorMapReady - 1215 */ - 1215 - 1216 2708 20 57 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO - 1217 270B 20 C7 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) - 1218 - 1219 270E A2 00 LDX #$00 - 1220 2710 8A TXA - 1221 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny) - 1222 2711 ClearLoop1 - 1223 2711 9D 00 01 STA $0100,X ; STOS !!! - 1224 2714 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b) - 1225 2717 9D 00 05 STA $0500,X - 1226 271A 9D 00 06 STA $0600,X - 1227 271D E0 80 CPX #$80 ;tylko ponad $80 - 1228 271F 90 02 BCC NoZpage - 1229 2721 95 00 STA $00,X ; czyli polowa strony zerowej - 1230 2723 NoZpage - 1231 2723 E8 INX - 1232 2724 D0 EB BNE ClearLoop1 - 1233 2726 A2 FF LDX #$FF - 1234 2728 9A TXS ; "wyzerowanie wskaznika STOSU - 1235 - 1236 ; a tutaj otwieramy kanal 1 CIO do odczytu - 1237 - 1238 2729 A2 10 LDX #16 ; kanal 1 - 1239 272B A9 03 LDA #COPN ; rozkaz OPEN - 1240 272D 9D 42 03 STA ICCOM,X ; COMMAND - 1241 2730 A9 04 LDA #$04 ; READ - 1242 2732 9D 4A 03 STA ICAUX1,X - 1243 2735 A9 00 LDA #$00 - 1244 2737 9D 4B 03 STA ICAUX2,X - 1245 273A A9 4A LDA # FileToOpen - 1248 2741 9D 45 03 STA ICBADR+1,X - 1249 2744 20 56 E4 JSR CIO - 1250 - 1251 2747 4C D9 07 JMP loader.LoadStart ; po przepisaniu - 1252 274A FileToOpen - 1253 274A 48 3A 53 43 4F 52 + .BYTE 'H:SCORCH.XEX',0 - 1254 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba - 1255 ; na koniec odpowiednie zmodyfikowanie MEMLO - 1256 2757 ADDspeedProc - 1257 2757 AD 22 21 LDA USmode - 1258 275A F0 5F beq NoHappyLoader - 1259 ; wyznaczamy offset procedury - 1260 275C 38 SEC - 1261 275D A9 BC LDA #HappyUSMovedProc - 1265 2767 ED E8 02 SBC MEMLO+1 - 1266 276A 8D 19 2C STA HappyOffset+1 - 1267 - 1268 276D A0 00 LDY #0 - 1269 276F A2 09 LDX #[$A-1] ;xjsrA - the last - 1270 ; relokujemy skoki pod offset z MEMLO - 1271 2771 HappyRelocate - 1272 2771 38 SEC - 1273 2772 BD 04 2C LDA xjsrTableL,x - 1274 2775 85 32 STA SecBuffer - 1275 2777 BD 0E 2C LDA xjsrTableH,x - 1276 277A 85 33 STA SecBuffer+1 - 1277 277C B1 32 LDA (SecBuffer),y - 1278 277E ED 18 2C SBC HappyOffset - 1279 2781 91 32 STA (SecBuffer),y - 1280 2783 C8 INY - 1281 2784 B1 32 LDA (SecBuffer),y - 1282 2786 ED 19 2C SBC HappyOffset+1 - 1283 2789 91 32 STA (SecBuffer),y - 1284 278B 88 DEY - 1285 278C CA DEX - 1286 278D 10 E2 BPL HappyRelocate - 1287 - 1288 278F A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1] - 1289 2791 label72x - 1290 2791 BD BC 27 LDA HappyUSMovedProc,X - 1291 = 2795 TurboRelocADDR=*+1 - 1292 2794 9D 00 0A STA $0A00,X - 1293 2797 CA DEX - 1294 2798 E0 FF CPX #$FF - 1295 279A D0 F5 BNE label72x - 1296 279C A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc] - 1297 279E A2 00 LDX #$00 - 1298 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. - 1299 27A0 label73 - 1300 27A0 98 TYA - 1301 27A1 18 CLC - 1302 27A2 6D E7 02 ADC MEMLO - 1303 27A5 8D E7 02 STA MEMLO - 1304 27A8 8A TXA - 1305 27A9 6D E8 02 ADC MEMLO+1 - 1306 27AC 8D E8 02 STA MEMLO+1 - 1307 27AF AD 95 27 LDA TurboRelocADDR - 1308 27B2 8D 97 07 STA loader.SioJMP+1 ; po przepisaniu - 1309 27B5 AD 96 27 LDA TurboRelocADDR+1 - 1310 27B8 8D 98 07 STA loader.SioJMP+2 ; po przepisaniu - 1311 27BB NoHappyLoader - 1312 27BB 60 RTS + 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 - 1315 - 1316 ; UWAGA !!!!!!!!!!!!!! - 1317 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!! - 1318 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone - 1319 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!! - 1320 27BC HappyUSMovedProc ; - 1321 - 1322 27BC AD 04 03 LDA DBUFA - 1323 27BF 85 32 STA SecBuffer - 1324 27C1 AD 05 03 LDA DBUFA+1 - 1325 27C4 85 33 STA SecBuffer+1 - 1326 - 1327 27C6 AD 08 03 LDA DBYT - 1328 27C9 85 31 STA SecLenUS - 1329 - 1330 27CB 78 SEI - 1331 27CC BA TSX - 1332 27CD 86 37 STX StackCopy - 1333 27CF A9 0D LDA #$0D - 1334 27D1 85 34 STA CRETRYZ - 1335 ;command retry on zero page - 1336 27D3 CommandLoop - 1337 = 27D4 HappySpeed = *+1 - 1338 27D3 A9 28 LDA #$28 ;here goes speed from "?" - 1339 27D5 8D 04 D2 STA AUDF3 - 1340 27D8 A9 34 LDA #$34 - 1341 27DA 8D 03 D3 STA PBCTL ;ustawienie linii command - 1342 27DD A2 80 LDX #$80 - 1343 27DF DelayLoopCmd - 1344 27DF CA DEX - 1345 27E0 D0 FD BNE DelayLoopCmd - 1346 27E2 8E 06 D2 STX AUDF4 ; zero - 1347 27E5 86 35 STX TransmitError - 1348 ; pokey init - 1349 27E7 A9 23 LDA #$23 - 1350 27E9 20 5D 28 xjsr1 JSR SecTransReg - 1351 ; - 1352 - 1353 27EC 18 CLC - 1354 27ED AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) - 1355 27F0 6D 01 03 ADC DUNIT ; dodajemy numer stacji - 1356 27F3 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) - 1357 27F5 85 30 STA CheckSum - 1358 27F7 8D 0D D2 STA SEROUT - 1359 27FA AD 02 03 LDA DCOMND - 1360 27FD 20 73 28 xjsr2 JSR PutSIOByte - 1361 2800 AD 0A 03 LDA DAUX1 - 1362 2803 20 73 28 xjsr3 JSR PutSIOByte - 1363 2806 AD 0B 03 LDA DAUX2 - 1364 2809 20 73 28 xjsr4 JSR PutSIOByte - 1365 280C A5 30 LDA CheckSum - 1366 280E 20 73 28 xjsr5 JSR PutSIOByte - 1367 - 1368 2811 waitforEndOftransmission - 1369 2811 AD 0E D2 LDA IRQST - 1370 2814 29 08 AND #$08 - 1371 2816 D0 F9 BNE waitforEndOftransmission - 1372 - 1373 2818 A9 13 LDA #$13 - 1374 281A 20 5D 28 xjsr6 JSR SecTransReg - 1375 - 1376 281D A9 3C LDA #$3c - 1377 281F 8D 03 D3 STA PBCTL ;command line off - 1378 ; two ACK's - 1379 2822 A0 02 LDY #2 - 1380 2824 DoubleACK - 1381 2824 20 8F 28 xjsr7 JSR GetSIOByte - 1382 2827 C9 44 CMP #$44 - 1383 2829 B0 19 BCS ErrorHere - 1384 282B 88 DEY - 1385 282C D0 F6 BNE DoubleACK - 1386 - 1387 ;ldy #0 - 1388 282E 84 30 STY CheckSum - 1389 2830 ReadSectorLoop - 1390 2830 20 8F 28 xjsr8 JSR GetSIOByte - 1391 2833 91 32 STA (SecBuffer),y - 1392 2835 20 87 28 xjsr9 JSR AddCheckSum - 1393 2838 C8 INY - 1394 2839 C4 31 CPY SecLenUS - 1395 283B D0 F3 BNE ReadSectorLoop - 1396 - 1397 283D 20 8F 28 xjsrA JSR GetSIOByte - 1398 2840 C5 30 CMP CheckSum - 1399 2842 F0 0B BEQ EndOfTransmission - 1400 ;error!!! - 1401 2844 ErrorHere - 1402 2844 A0 90 LDY #$90 - 1403 2846 84 35 STY TransmitError - 1404 2848 A6 37 LDX StackCopy - 1405 284A 9A TXS - 1406 284B C6 34 DEC CRETRYZ - 1407 284D D0 84 BNE CommandLoop - 1408 - 1409 284F EndOfTransmission - 1410 284F A9 00 LDA #0 - 1411 2851 8D 07 D2 STA AUDC4 - 1412 2854 A5 10 LDA IRQENS - 1413 2856 8D 0E D2 STA IRQEN - 1414 2859 58 CLI - 1415 285A A4 35 LDY TransmitError - 1416 285C 60 RTS - 1417 - 1418 285D SecTransReg - 1419 285D 8D 0F D2 STA SKCTL - 1420 2860 8D 0A D2 STA SKSTRES - 1421 2863 A9 38 LDA #$38 - 1422 2865 8D 0E D2 STA IRQEN - 1423 2868 A9 28 LDA #$28 - 1424 286A 8D 08 D2 STA AUDCTL - 1425 286D A9 A8 LDA #$A8 - 1426 286F 8D 07 D2 STA AUDC4 - 1427 2872 60 RTS - 1428 - 1429 2873 PutSIOByte - 1430 2873 AA TAX - 1431 2874 waitforSerial - 1432 2874 AD 0E D2 LDA IRQST - 1433 2877 29 10 AND #$10 - 1434 2879 D0 F9 BNE waitforSerial - 1435 - 1436 287B 8D 0E D2 STA IRQEN - 1437 287E A9 10 LDA #$10 - 1438 2880 8D 0E D2 STA IRQEN - 1439 - 1440 2883 8A TXA - 1441 2884 8D 0D D2 STA SEROUT - 1442 - 1443 2887 AddCheckSum - 1444 2887 18 CLC - 1445 2888 65 30 ADC CheckSum - 1446 288A 69 00 ADC #0 - 1447 288C 85 30 STA CheckSum - 1448 288E 60 RTS - 1449 - 1450 288F GetSIOByte - 1451 288F A2 0A LDX #10 ;acktimeout - 1452 2891 ExternalLoop - 1453 2891 A9 00 LDA #0 - 1454 2893 85 36 STA looperka - 1455 2895 InternalLoop - 1456 2895 AD 0E D2 LDA IRQST - 1457 2898 29 20 AND #$20 - 1458 289A F0 09 BEQ ACKReceive - 1459 289C C6 36 DEC looperka - 1460 289E D0 F5 BNE InternalLoop - 1461 28A0 CA DEX - 1462 28A1 D0 EE BNE ExternalLoop - 1463 28A3 F0 9F BEQ ErrorHere - 1464 28A5 ACKReceive - 1465 ; zero we have now - 1466 28A5 8D 0E D2 STA IRQST - 1467 28A8 A9 20 LDA #$20 - 1468 28AA 8D 0E D2 STA IRQST - 1469 28AD AD 0F D2 LDA SKSTAT - 1470 28B0 8D 0A D2 STA SKSTRES - 1471 28B3 29 20 AND #$20 - 1472 28B5 F0 8D BEQ ErrorHere - 1473 ; - 1474 28B7 AD 0D D2 LDA SERIN - 1475 28BA 60 RTS - 1476 28BB EndHappyUSProc - 1477 - 1478 - 1479 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler - 1480 28BB blokDanychIO_GetUSSpeed - 1481 28BB 31 01 3F 40 .BY $31,$01,"?",$40 - 1482 28BF D4 27 .WO HappySpeed - 1483 28C1 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A - 1484 28C7 DirMapEnd - 1485 28C7 4C 93 29 JMP label75 - 1486 28CA label39 - 1487 28CA 85 DA STA $DA - 1488 28CC A5 D0 LDA CurrentFileInfoBuff - 1489 28CE 85 DB STA $DB - 1490 28D0 A5 D1 LDA CurrentFileInfoBuff+1 - 1491 28D2 85 DC STA $DC - 1492 28D4 20 47 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka - 1493 28D7 F0 05 BEQ DiscNotChanged2 - 1494 28D9 68 PLA - 1495 28DA 68 PLA - 1496 28DB 4C D4 21 JMP ReadMainDir - 1497 28DE DiscNotChanged2 - 1498 ; odczyt sektora mapy wskazywanego przez DirMapSec - 1499 28DE A5 D2 LDA DirMapSect - 1500 28E0 8D 43 2A STA blokDanychIO+10 - 1501 28E3 A5 D3 LDA DirMapSect+1 - 1502 28E5 8D 44 2A STA blokDanychIO+11 - 1503 28E8 0D 43 2A ORA blokDanychIO+10 - 1504 28EB F0 DA BEQ DirMapEnd - 1505 28ED A2 2D LDX #>DirMapSectorBuff - 1506 28EF A0 80 LDY #DirMapSectorBuff ; -- - 1532 291B 65 E3 ADC InMapPointer+1 ; -- - 1533 291D 85 E5 STA TempZP+1 ; -- - 1534 291F B1 E4 LDA (TempZP),Y - 1535 2921 8D 43 2A STA blokDanychIO+10 - 1536 2924 C8 INY - 1537 2925 B1 E4 LDA (TempZP),Y - 1538 2927 8D 44 2A STA blokDanychIO+11 - 1539 292A 0D 43 2A ORA blokDanychIO+10 - 1540 292D F0 64 BEQ label75 - 1541 ; i zwiekszenie wskaznika mapy o 2 - 1542 292F C8 INY - 1543 2930 84 E2 STY InMapPointer - 1544 2932 D0 02 BNE NoIncH ; -- - 1545 2934 E6 E3 INC InMapPointer+1 ; -- - 1546 2936 NoIncH - 1547 2936 AD E5 02 LDA MEMTOP - 1548 2939 38 SEC - 1549 293A E5 D0 SBC CurrentFileInfoBuff - 1550 293C AD E6 02 LDA MEMTOP+1 - 1551 293F E5 D1 SBC CurrentFileInfoBuff+1 - 1552 2941 F0 50 BEQ label75 - 1553 2943 A4 D0 LDY CurrentFileInfoBuff - 1554 2945 A6 D1 LDX CurrentFileInfoBuff+1 - 1555 2947 20 0B 2A JSR ReadSector - 1556 294A A5 D4 LDA $D4 - 1557 294C 05 D5 ORA $D5 - 1558 294E D0 16 BNE label79 - 1559 2950 A0 03 LDY #$03 - 1560 2952 B1 D0 LDA (CurrentFileInfoBuff),Y - 1561 2954 85 D4 STA $D4 - 1562 2956 C8 INY - 1563 2957 B1 D0 LDA (CurrentFileInfoBuff),Y - 1564 2959 85 D5 STA $D5 - 1565 295B C8 INY - 1566 295C B1 D0 LDA (CurrentFileInfoBuff),Y - 1567 295E F0 06 BEQ label79 - 1568 2960 A9 FF LDA #$FF - 1569 2962 85 D4 STA $D4 - 1570 2964 85 D5 STA $D5 - 1571 2966 label79 - 1572 2966 A5 D0 LDA CurrentFileInfoBuff - 1573 2968 18 CLC - 1574 2969 6D A2 20 ADC .adr loader.SecLen ; przed przepisaniem - 1575 296C 85 D0 STA CurrentFileInfoBuff - 1576 296E A5 D1 LDA CurrentFileInfoBuff+1 - 1577 2970 6D A3 20 ADC .adr loader.SecLen+1 ; przed przepisaniem - 1578 2973 85 D1 STA CurrentFileInfoBuff+1 - 1579 2975 A5 D4 LDA $D4 - 1580 2977 38 SEC - 1581 2978 ED A2 20 SBC .adr loader.SecLen ; przed przepisaniem - 1582 297B 85 D4 STA $D4 - 1583 297D A5 D5 LDA $D5 - 1584 297F ED A3 20 SBC .adr loader.SecLen+1 ; przed przepisaniem - 1585 2982 85 D5 STA $D5 - 1586 2984 B0 80 BCS label80 - 1587 2986 A5 D0 LDA CurrentFileInfoBuff - 1588 2988 18 CLC - 1589 2989 65 D4 ADC $D4 - 1590 298B 85 D0 STA CurrentFileInfoBuff - 1591 298D A5 D1 LDA CurrentFileInfoBuff+1 - 1592 298F 65 D5 ADC $D5 - 1593 2991 85 D1 STA CurrentFileInfoBuff+1 - 1594 2993 label75 - 1595 2993 A5 DC LDA $DC - 1596 2995 C5 D1 CMP CurrentFileInfoBuff+1 - 1597 2997 90 0B BCC label81 - 1598 2999 D0 17 BNE label82 - 1599 299B A5 DB LDA $DB - 1600 299D C5 D0 CMP CurrentFileInfoBuff - 1601 299F 90 03 BCC label81 - 1602 29A1 D0 0F BNE label82 - 1603 29A3 60 RTS - 1604 29A4 label81 - 1605 29A4 A5 DB LDA $DB - 1606 29A6 18 CLC - 1607 29A7 65 DA ADC $DA - 1608 29A9 85 DB STA $DB - 1609 29AB 90 E6 BCC label75 - 1610 29AD E6 DC INC $DC - 1611 29AF 4C 93 29 JMP label75 - 1612 29B2 label82 - 1613 29B2 A5 DB LDA $DB - 1614 29B4 38 SEC - 1615 29B5 E5 DA SBC $DA - 1616 29B7 85 D0 STA CurrentFileInfoBuff - 1617 29B9 A5 DC LDA $DC - 1618 29BB E9 00 SBC #$00 - 1619 29BD 85 D1 STA CurrentFileInfoBuff+1 - 1620 29BF 60 RTS - 1621 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora - 1622 29C0 ReadPERCOM - 1623 29C0 A9 04 LDA #$04 - 1624 29C2 8D 45 2A STA DiskRetryCount - 1625 29C5 ReadPERCOMretry - 1626 29C5 A0 E9 LDY #blokDanychIO_PERCOM - 1628 29C9 20 E1 2A JSR Table2DCB - 1629 29CC 20 D6 2A JSR GoSIO - 1630 29CF 30 08 BMI PercomError - 1631 ; blok odczytany - ustawmy dlugosc 1 sektora - 1632 29D1 AD 2A 2C LDA PERCOMdata+6 - 1633 29D4 C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 - 1634 29D6 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest - 1635 29D8 60 RTS - 1636 29D9 PercomError - 1637 29D9 CE 45 2A DEC DiskRetryCount - 1638 29DC D0 E7 BNE ReadPERCOMretry - 1639 ; blok nieodczytany - dlugosc 1 sektora na $80 - 1640 29DE Set1Sect128 - 1641 29DE A9 00 LDA #$00 - 1642 29E0 8D 2A 2C STA PERCOMdata+6 - 1643 29E3 A9 80 LDA #$80 - 1644 29E5 8D 2B 2C STA PERCOMdata+7 - 1645 29E8 60 RTS - 1646 29E9 blokDanychIO_PERCOM - 1647 29E9 31 01 4E 40 .BY $31,$01,$4E,$40 - 1648 29ED 24 2C .WO PERCOMdata - 1649 29EF 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 - 1650 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) - 1651 29F5 ReadFirstSect - 1652 29F5 A9 01 LDA #$01 - 1653 29F7 8D 43 2A STA blokDanychIO+10 - 1654 29FA A9 00 LDA #$00 - 1655 29FC 8D 44 2A STA blokDanychIO+11 - 1656 29FF AD 2A 2C LDA PERCOMdata+6 - 1657 2A02 8D 42 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b - 1658 2A05 AD 2B 2C LDA PERCOMdata+7 - 1659 2A08 4C 14 2A JMP ReadSector1 - 1660 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) - 1661 ; reszta danych jak nizej (A nie wazne) - 1662 2A0B ReadSector - 1663 2A0B AD A3 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b - 1664 2A0E 8D 42 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b - 1665 2A11 AD A2 20 LDA .adr loader.SecLen ; przed przepisaniem - 1666 2A14 ReadSector1 - 1667 2A14 8D 41 2A STA blokDanychIO+8 - 1668 2A17 8E 3E 2A STX blokDanychIO+5 - 1669 2A1A 8C 3D 2A STY blokDanychIO+4 - 1670 2A1D A9 04 LDA #$04 - 1671 2A1F 8D 45 2A STA DiskRetryCount - 1672 2A22 DiskReadRetry - 1673 2A22 A0 39 LDY #blokDanychIO - 1675 2A26 20 E1 2A JSR Table2DCB - 1676 2A29 20 D6 2A JSR GoSIO - 1677 2A2C 30 01 BMI label85 - 1678 2A2E 60 RTS - 1679 2A2F label85 - 1680 2A2F CE 45 2A DEC DiskRetryCount - 1681 2A32 D0 EE BNE DiskReadRetry - 1682 2A34 68 PLA - 1683 2A35 68 PLA - 1684 2A36 4C 93 21 JMP ErrorDisplay - 1685 2A39 blokDanychIO - 1686 2A39 31 01 52 40 .BY $31,$01,$52,$40 - 1687 2A3D 80 2D .WO DirMapSectorBuff - 1688 2A3F 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 - 1689 2A45 DiskRetryCount - 1690 2A45 00 .BY $00 - 1691 2A46 PrintXY - 1692 2A46 68 PLA - 1693 2A47 85 C8 STA $C8 - 1694 2A49 68 PLA - 1695 2A4A 85 C9 STA $C9 - 1696 2A4C A9 00 LDA #$00 - 1697 2A4E 85 DF STA $DF - 1698 2A50 20 C8 2A JSR label87 - 1699 2A53 48 PHA - 1700 2A54 20 C8 2A JSR label87 - 1701 2A57 85 DE STA $DE - 1702 2A59 0A ASL - 1703 2A5A 0A ASL - 1704 2A5B 18 CLC - 1705 2A5C 65 DE ADC $DE - 1706 2A5E 0A ASL - 1707 2A5F 0A ASL - 1708 2A60 26 DF ROL $DF - 1709 2A62 0A ASL - 1710 2A63 26 DF ROL $DF - 1711 2A65 18 CLC - 1712 2A66 65 58 ADC SAVMSC - 1713 2A68 85 DE STA $DE - 1714 2A6A A5 DF LDA $DF - 1715 2A6C 65 59 ADC SAVMSC+1 - 1716 2A6E 85 DF STA $DF - 1717 2A70 68 PLA - 1718 2A71 A8 TAY - 1719 2A72 label92 - 1720 2A72 20 C8 2A JSR label87 - 1721 2A75 C9 00 CMP #$00 - 1722 2A77 F0 48 BEQ label88 - 1723 2A79 C9 7D CMP #$7D - 1724 2A7B F0 21 BEQ label89 - 1725 2A7D A2 00 LDX #$00 - 1726 2A7F 86 E0 STX $E0 - 1727 2A81 C9 80 CMP #$80 - 1728 2A83 66 E0 ROR $E0 - 1729 2A85 29 7F AND #$7F - 1730 2A87 C9 20 CMP #$20 - 1731 2A89 B0 04 BCS label90 - 1732 2A8B 09 40 ORA #$40 - 1733 2A8D D0 07 BNE label91 - 1734 2A8F label90 - 1735 2A8F C9 60 CMP #$60 - 1736 2A91 B0 03 BCS label91 - 1737 2A93 38 SEC - 1738 2A94 E9 20 SBC #$20 - 1739 2A96 label91 - 1740 2A96 05 E0 ORA $E0 - 1741 2A98 91 DE STA ($DE),Y - 1742 2A9A C8 INY - 1743 2A9B 4C 72 2A JMP label92 - 1744 2A9E label89 - 1745 2A9E 98 TYA - 1746 2A9F 48 PHA - 1747 2AA0 A5 58 LDA SAVMSC - 1748 2AA2 85 E0 STA $E0 - 1749 2AA4 A9 03 LDA #$03 - 1750 2AA6 AA TAX - 1751 2AA7 18 CLC - 1752 2AA8 65 59 ADC SAVMSC+1 - 1753 2AAA 85 E1 STA $E1 - 1754 2AAC A0 BF LDY #$BF - 1755 2AAE A9 00 LDA #$00 - 1756 2AB0 label93 - 1757 2AB0 91 E0 STA ($E0),Y - 1758 2AB2 88 DEY - 1759 2AB3 C0 FF CPY #$FF - 1760 2AB5 D0 F9 BNE label93 - 1761 2AB7 C6 E1 DEC $E1 - 1762 2AB9 CA DEX - 1763 2ABA 10 F4 BPL label93 - 1764 2ABC 68 PLA - 1765 2ABD A8 TAY - 1766 2ABE 4C 72 2A JMP label92 - 1767 2AC1 label88 - 1768 2AC1 A5 C9 LDA $C9 - 1769 2AC3 48 PHA - 1770 2AC4 A5 C8 LDA $C8 - 1771 2AC6 48 PHA - 1772 2AC7 60 RTS - 1773 2AC8 label87 - 1774 2AC8 E6 C8 INC $C8 - 1775 2ACA D0 02 BNE label94 - 1776 2ACC E6 C9 INC $C9 - 1777 2ACE label94 - 1778 2ACE A2 00 LDX #$00 - 1779 2AD0 A1 C8 LDA ($C8,X) - 1780 2AD2 60 RTS - 1781 2AD3 GoErrorDisp - 1782 2AD3 4C 93 21 JMP ErrorDisplay - 1783 ; Skok do Sio lub procedury Turbo - 1784 2AD6 GoSIO - 1785 2AD6 AC 22 21 LDY USmode - 1786 2AD9 F0 03 BEQ StandardSpeed - 1787 2ADB 4C BC 27 JMP HappyUSMovedProc ; mozna skakac do tej procki - 1788 2ADE StandardSpeed - 1789 2ADE 4C 59 E4 JMP JSIOINT - 1790 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) - 1791 ; do bloku kontroli transmisji szeregowej DCB - 1792 2AE1 Table2DCB - 1793 2AE1 8C EA 2A STY IOtableAddr+1 - 1794 2AE4 8E EB 2A STX IOtableAddr+2 - 1795 2AE7 A2 0B LDX #$0B - 1796 2AE9 IOtableAddr - 1797 2AE9 BD FF FF LDA $FFFF,X - 1798 2AEC 9D 00 03 STA DDEVIC,X - 1799 2AEF CA DEX - 1800 2AF0 10 F7 BPL IOtableAddr - 1801 2AF2 60 RTS - 1802 2AF3 Close1 - 1803 2AF3 A2 10 LDX #$10 - 1804 2AF5 CloseX - 1805 2AF5 A9 0C LDA #$0C - 1806 2AF7 9D 42 03 STA ICCMD,X - 1807 2AFA 4C 56 E4 JMP JCIOMAIN - 1808 2AFD GetKey - 1809 2AFD A2 10 LDX #$10 - 1810 2AFF A9 03 LDA #$03 - 1811 2B01 9D 42 03 STA ICCMD,X - 1812 2B04 A9 04 LDA #$04 - 1813 2B06 9D 4A 03 STA ICAX1,X - 1814 2B09 A9 00 LDA #$00 - 1815 2B0B 9D 4B 03 STA ICAX2,X - 1816 2B0E 9D 49 03 STA ICBUFL+1,X - 1817 2B11 A9 FF LDA #$FF - 1818 2B13 9D 48 03 STA ICBUFL,X - 1819 2B16 A9 44 LDA #Kdriver - 1822 2B1D 9D 45 03 STA ICBUFA+1,X - 1823 2B20 20 56 E4 JSR JCIOMAIN - 1824 2B23 30 1C BMI GKeyError - 1825 2B25 A2 10 LDX #$10 - 1826 2B27 A9 00 LDA #$00 - 1827 2B29 9D 48 03 STA ICBUFL,X - 1828 2B2C 9D 49 03 STA ICBUFL+1,X - 1829 2B2F A9 07 LDA #$07 - 1830 2B31 9D 42 03 STA ICCMD,X - 1831 2B34 20 56 E4 JSR JCIOMAIN - 1832 2B37 30 08 BMI GKeyError - 1833 2B39 48 PHA - 1834 2B3A 20 F3 2A JSR Close1 - 1835 2B3D 30 02 BMI GKeyError - 1836 2B3F 68 PLA - 1837 2B40 60 RTS - 1838 2B41 GKeyError - 1839 2B41 4C D3 2A JMP GoErrorDisp - 1840 2B44 Kdriver - 1841 2B44 4B 3A 9B .BY "K:",$9B - 1842 2B47 DiscChangeCheck - 1843 2B47 A0 80 LDY #DirMapSectorBuff - 1845 2B4B 20 F5 29 JSR ReadFirstSect - 1846 2B4E A2 7F LDX #$7F - 1847 2B50 label98 - 1848 2B50 BD 00 2D LDA FirstSectorBuff,X - 1849 2B53 DD 80 2D CMP DirMapSectorBuff,X - 1850 2B56 D0 05 BNE ChangedD - 1851 2B58 CA DEX - 1852 2B59 10 F5 BPL label98 - 1853 2B5B A9 00 LDA #$00 - 1854 2B5D ChangedD - 1855 2B5D 60 RTS - 1856 ; obsluga gwiazdki - 1857 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * - 1858 ; w Y jest ) - X moze lepiej nie ruszac :) - 1859 2B5E Asteriks - 1860 2B5E A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) - 1861 2B60 20 7C 2B JSR GetHexNumber - 1862 2B63 8D C5 02 STA COLPF1S ; literki - 1863 2B66 C8 INY - 1864 2B67 20 7C 2B JSR GetHexNumber - 1865 2B6A 8D C6 02 STA COLPF2S ; tlo - 1866 2B6D C8 INY - 1867 2B6E 20 7C 2B JSR GetHexNumber - 1868 2B71 8D C8 02 STA COLBAKS ; ramka - 1869 2B74 C8 INY - 1870 2B75 20 7C 2B JSR GetHexNumber - 1871 2B78 8D 26 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) - 1872 2B7B 60 RTS - 1873 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX - 1874 ; i zamienia na bajt w A - 1875 2B7C GetHexNumber - 1876 2B7C 20 8C 2B JSR GetHEX4bits - 1877 2B7F 0A ASL - 1878 2B80 0A ASL - 1879 2B81 0A ASL - 1880 2B82 0A ASL - 1881 2B83 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. - 1882 2B85 C8 INY - 1883 2B86 20 8C 2B JSR GetHEX4bits - 1884 2B89 05 E4 ORA TempZP - 1885 2B8B 60 RTS - 1886 2B8C GetHEX4bits - 1887 2B8C B1 D4 LDA ($D4),Y - 1888 2B8E 38 SEC - 1889 2B8F E9 30 SBC #'0' - 1890 2B91 C9 0A CMP #$0A ; sprawdzmy czy cyfra - 1891 2B93 90 02 BCC IsNumber - 1892 2B95 E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow - 1893 2B97 IsNumber - 1894 2B97 60 RTS - 1895 ; Ustawia numer satcji wg A - 1896 2B98 SeTDriveNR - 1897 2B98 C9 09 CMP #$09 - 1898 2B9A B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry - 1899 2B9C 20 BA 2B JSR SeTblokDanychDrive - 1900 2B9F 18 CLC - 1901 2BA0 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 - 1902 2BA2 8D D5 22 STA DriveDisp1 - 1903 2BA5 A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu - 1904 2BA7 8D D4 22 STA DriveDisp1-1 - 1905 2BAA 60 RTS - 1906 2BAB SeTDriveLetter - 1907 2BAB 20 BA 2B JSR SeTblokDanychDrive - 1908 2BAE 18 CLC - 1909 2BAF 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu - 1910 2BB1 8D D5 22 STA DriveDisp1 - 1911 2BB4 A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja - 1912 2BB6 8D D4 22 STA DriveDisp1-1 - 1913 2BB9 60 RTS - 1914 2BBA SeTblokDanychDrive - 1915 2BBA 8D 9B 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem - 1916 2BBD 8D 3A 2A STA blokDanychIO+1 - 1917 2BC0 8D BC 28 STA blokDanychIO_GetUSSpeed+1 - 1918 2BC3 8D EA 29 STA blokDanychIO_PERCOM+1 - 1919 2BC6 60 RTS - 1920 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku - 1921 2BC7 MEMLOprint - 1922 2BC7 AD E7 02 LDA MEMLO - 1923 2BCA 48 PHA - 1924 2BCB 4A LSR - 1925 2BCC 4A LSR - 1926 2BCD 4A LSR - 1927 2BCE 4A LSR - 1928 2BCF 20 28 21 JSR bin2AsciiHex - 1929 2BD2 8D 00 2C STA MEMLOvalue+2 - 1930 2BD5 68 PLA - 1931 2BD6 20 28 21 JSR bin2AsciiHex - 1932 2BD9 8D 01 2C STA MEMLOvalue+3 - 1933 2BDC AD E8 02 LDA MEMLO+1 - 1934 2BDF 48 PHA - 1935 2BE0 4A LSR - 1936 2BE1 4A LSR - 1937 2BE2 4A LSR - 1938 2BE3 4A LSR - 1939 2BE4 20 28 21 JSR bin2AsciiHex - 1940 2BE7 8D FE 2B STA MEMLOvalue - 1941 2BEA 68 PLA - 1942 2BEB 20 28 21 JSR bin2AsciiHex - 1943 2BEE 8D FF 2B STA MEMLOvalue+1 - 1944 2BF1 20 46 2A JSR PrintXY - 1945 2BF4 1C 17 .BY 28,23 - 1946 2BF6 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" - 1947 2BFE MEMLOvalue - 1948 2BFE 30 30 30 30 .BY "0000" - 1949 2C02 00 .BY $00 - 1950 2C03 60 RTS - 1951 - 1952 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo - 1953 - 1954 2C04 xjsrTableL - 1955 2C04 EA FE 04 .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] - 1956 2C07 0A 0F .BY <[xjsr4+1],<[xjsr5+1] - 1957 2C09 1B 25 31 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] - 1958 2C0C 36 3E .BY <[xjsr9+1],<[xjsrA+1] - 1959 2C0E xjsrTableH - 1960 2C0E 27 27 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] - 1961 2C11 28 28 .BY >[xjsr4+1],>[xjsr5+1] - 1962 2C13 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] - 1963 2C16 28 28 .BY >[xjsr9+1],>[xjsrA+1] - 1964 ; miejsce na wyliczony offset o jaki przesuwamy procedure - 1965 2C18 HappyOffset - 1966 2C18 00 00 .WO $0000 - 1967 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) - 1968 2C1A DensityCodes - 1969 2C1A F3 E4 F1 .by +$80,"sdq" - 1970 ;.by "SDQ" - 1971 ;.by $0e,$15,$a0 - 1972 2C1D ONtext - 1973 2C1D CF CE A0 .BY +$80,"ON " - 1974 2C20 OFFtext - 1975 2C20 CF C6 C6 .BY +$80,"OFF" - 1976 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) - 1977 2C23 PDVMASKtemp - 1978 2C23 00 .BY $00 - 1979 ; miejsce na blok PERCOM - 1980 2C24 PERCOMdata - 1981 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie - 1982 = 2C30 FirstSectorsTable=*+12 ; omijamy 12b na percom - 1983 ; zostawiamy $30 bajtow wolnego - 1984 - 1985 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow - 1986 = 2D00 ProgramEnd=FirstSectorBuff - 1987 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu - 1988 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu - 1989 2C24 FirstRun - 1990 ; odnotowujemy stan Shift z Bootowania - 1991 2C24 AD 0F D2 LDA SKSTAT - 1992 2C27 29 08 and #$08 - 1993 2C29 D0 03 BNE NoSHIFTboot - 1994 2C2B 8D 25 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 - 1995 2C2E NoSHIFTboot - 1996 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie - 1997 2C2E AD 01 D3 LDA PORTB - 1998 2C31 29 02 AND #$02 - 1999 2C33 D0 0B BNE BrakBasica - 2000 ; jest Basic - 2001 2C35 A0 02 LDY #$2 - 2002 2C37 BASstatprint - 2003 2C37 B9 1D 2C LDA ONtext,y - 2004 2C3A 99 F0 22 STA BASstatus,y - 2005 2C3D 88 DEY - 2006 2C3E 10 F7 bpl BASstatprint - 2007 2C40 BrakBasica - 2008 ; Sprawdzamy istnienie QMEGa - 2009 2C40 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy - 2010 2C42 testQMEGloop - 2011 2C42 B9 01 C0 LDA $C001,y - 2012 2C45 D9 75 2C CMP QMEGstring,y - 2013 2C48 D0 13 bne brakQMEGa - 2014 2C4A 88 dey - 2015 2C4B 10 F5 bpl testQMEGloop - 2016 ; jest QMEG - 2017 2C4D A9 00 LDA #0 - 2018 2C4F 8D 23 21 STA QMEG - 2019 2C52 A0 02 LDY #$2 - 2020 2C54 Qstatprint - 2021 2C54 B9 1D 2C LDA ONtext,y - 2022 2C57 99 E8 22 STA QMEGstatus,y - 2023 2C5A 88 DEY - 2024 2C5B 10 F7 bpl Qstatprint - 2025 2C5D brakQMEGa - 2026 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi - 2027 2C5D AD 00 03 LDA DDEVIC - 2028 2C60 18 clc - 2029 2C61 6D 01 03 ADC DUNIT - 2030 2C64 38 sec - 2031 2C65 E9 01 SBC #$01 - 2032 2C67 29 0F AND #$0F ; zapamietanie numeru urzadzenia - 2033 2C69 8D 24 21 STA BootDrive - 2034 2C6C 20 98 2B JSR SeTDriveNR - 2035 2C6F 20 37 21 JSR EditorOpen - 2036 2C72 4C 65 21 JMP mainprog - 2037 2C75 QMEGstring - 2038 2C75 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 - 2039 2C7D 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" - 2040 ;.OPT List - 2041 - 2042 - 2043 = 0080 MAPCOUNTER - 2043 = 0082 COMPRESSEDMAPCOUNTER - 2043 = 0084 MAPCOUNTERMEM - 2043 = 0086 PREVFILESECTOR - 2043 = 0088 MAPPOSITIONMEM - 2043 = 008A SECTOROFFSET - 2043 = 008C SECTORSCOUNTER - 2043 org $02e0 - 2044 02E0-02E1> 99 26 .WO LoaderGo - 2045 ; .WO START - 2046 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) - 2047 ; OPT h- - 2048 ; org $0000 - 2049 ; .WO $0000 - 2050 + 1314 27B2 78 SEI + 1315 27B3 BA TSX + 1316 27B4 86 37 STX StackCopy + 1317 27B6 A9 0D LDA #$0D + 1318 27B8 85 34 STA CRETRYZ + 1319 ;command retry on zero page + 1320 27BA CommandLoop + 1321 = 27BB HappySpeed = *+1 + 1322 27BA A9 28 LDA #$28 ;here goes speed from "?" + 1323 27BC 8D 04 D2 STA AUDF3 + 1324 27BF A9 34 LDA #$34 + 1325 27C1 8D 03 D3 STA PBCTL ;ustawienie linii command + 1326 27C4 A2 80 LDX #$80 + 1327 27C6 DelayLoopCmd + 1328 27C6 CA DEX + 1329 27C7 D0 FD BNE DelayLoopCmd + 1330 27C9 8E 06 D2 STX AUDF4 ; zero + 1331 27CC 86 35 STX TransmitError + 1332 ; pokey init + 1333 27CE A9 23 LDA #$23 + 1334 27D0 20 44 28 xjsr1 JSR SecTransReg + 1335 ; + 1336 + 1337 27D3 18 CLC + 1338 27D4 AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno) + 1339 27D7 6D 01 03 ADC DUNIT ; dodajemy numer stacji + 1340 27DA 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari) + 1341 27DC 85 30 STA CheckSum + 1342 27DE 8D 0D D2 STA SEROUT + 1343 27E1 AD 02 03 LDA DCOMND + 1344 27E4 20 5A 28 xjsr2 JSR PutSIOByte + 1345 27E7 AD 0A 03 LDA DAUX1 + 1346 27EA 20 5A 28 xjsr3 JSR PutSIOByte + 1347 27ED AD 0B 03 LDA DAUX2 + 1348 27F0 20 5A 28 xjsr4 JSR PutSIOByte + 1349 27F3 A5 30 LDA CheckSum + 1350 27F5 20 5A 28 xjsr5 JSR PutSIOByte + 1351 + 1352 27F8 waitforEndOftransmission + 1353 27F8 AD 0E D2 LDA IRQST + 1354 27FB 29 08 AND #$08 + 1355 27FD D0 F9 BNE waitforEndOftransmission + 1356 + 1357 27FF A9 13 LDA #$13 + 1358 2801 20 44 28 xjsr6 JSR SecTransReg + 1359 + 1360 2804 A9 3C LDA #$3c + 1361 2806 8D 03 D3 STA PBCTL ;command line off + 1362 ; two ACK's + 1363 2809 A0 02 LDY #2 + 1364 280B DoubleACK + 1365 280B 20 76 28 xjsr7 JSR GetSIOByte + 1366 280E C9 44 CMP #$44 + 1367 2810 B0 19 BCS ErrorHere + 1368 2812 88 DEY + 1369 2813 D0 F6 BNE DoubleACK + 1370 + 1371 ;ldy #0 + 1372 2815 84 30 STY CheckSum + 1373 2817 ReadSectorLoop + 1374 2817 20 76 28 xjsr8 JSR GetSIOByte + 1375 281A 91 32 STA (SecBuffer),y + 1376 281C 20 6E 28 xjsr9 JSR AddCheckSum + 1377 281F C8 INY + 1378 2820 C4 31 CPY SecLenUS + 1379 2822 D0 F3 BNE ReadSectorLoop + 1380 + 1381 2824 20 76 28 xjsrA JSR GetSIOByte + 1382 2827 C5 30 CMP CheckSum + 1383 2829 F0 0B BEQ EndOfTransmission + 1384 ;error!!! + 1385 282B ErrorHere + 1386 282B A0 90 LDY #$90 + 1387 282D 84 35 STY TransmitError + 1388 282F A6 37 LDX StackCopy + 1389 2831 9A TXS + 1390 2832 C6 34 DEC CRETRYZ + 1391 2834 D0 84 BNE CommandLoop + 1392 + 1393 2836 EndOfTransmission + 1394 2836 A9 00 LDA #0 + 1395 2838 8D 07 D2 STA AUDC4 + 1396 283B A5 10 LDA IRQENS + 1397 283D 8D 0E D2 STA IRQEN + 1398 2840 58 CLI + 1399 2841 A4 35 LDY TransmitError + 1400 2843 60 RTS + 1401 + 1402 2844 SecTransReg + 1403 2844 8D 0F D2 STA SKCTL + 1404 2847 8D 0A D2 STA SKSTRES + 1405 284A A9 38 LDA #$38 + 1406 284C 8D 0E D2 STA IRQEN + 1407 284F A9 28 LDA #$28 + 1408 2851 8D 08 D2 STA AUDCTL + 1409 2854 A9 A8 LDA #$A8 + 1410 2856 8D 07 D2 STA AUDC4 + 1411 2859 60 RTS + 1412 + 1413 285A PutSIOByte + 1414 285A AA TAX + 1415 285B waitforSerial + 1416 285B AD 0E D2 LDA IRQST + 1417 285E 29 10 AND #$10 + 1418 2860 D0 F9 BNE waitforSerial + 1419 + 1420 2862 8D 0E D2 STA IRQEN + 1421 2865 A9 10 LDA #$10 + 1422 2867 8D 0E D2 STA IRQEN + 1423 + 1424 286A 8A TXA + 1425 286B 8D 0D D2 STA SEROUT + 1426 + 1427 286E AddCheckSum + 1428 286E 18 CLC + 1429 286F 65 30 ADC CheckSum + 1430 2871 69 00 ADC #0 + 1431 2873 85 30 STA CheckSum + 1432 2875 60 RTS + 1433 + 1434 2876 GetSIOByte + 1435 2876 A2 0A LDX #10 ;acktimeout + 1436 2878 ExternalLoop + 1437 2878 A9 00 LDA #0 + 1438 287A 85 36 STA looperka + 1439 287C InternalLoop + 1440 287C AD 0E D2 LDA IRQST + 1441 287F 29 20 AND #$20 + 1442 2881 F0 09 BEQ ACKReceive + 1443 2883 C6 36 DEC looperka + 1444 2885 D0 F5 BNE InternalLoop + 1445 2887 CA DEX + 1446 2888 D0 EE BNE ExternalLoop + 1447 288A F0 9F BEQ ErrorHere + 1448 288C ACKReceive + 1449 ; zero we have now + 1450 288C 8D 0E D2 STA IRQST + 1451 288F A9 20 LDA #$20 + 1452 2891 8D 0E D2 STA IRQST + 1453 2894 AD 0F D2 LDA SKSTAT + 1454 2897 8D 0A D2 STA SKSTRES + 1455 289A 29 20 AND #$20 + 1456 289C F0 8D BEQ ErrorHere + 1457 ; + 1458 289E AD 0D D2 LDA SERIN + 1459 28A1 60 RTS + 1460 28A2 EndHappyUSProc + 1461 + 1462 + 1463 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler + 1464 28A2 blokDanychIO_GetUSSpeed + 1465 28A2 31 01 3F 40 .BY $31,$01,"?",$40 + 1466 28A6 BB 27 .WO HappySpeed + 1467 28A8 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A + 1468 28AE DirMapEnd + 1469 28AE 4C 7A 29 JMP label75 + 1470 28B1 label39 + 1471 28B1 85 DA STA $DA + 1472 28B3 A5 D0 LDA CurrentFileInfoBuff + 1473 28B5 85 DB STA $DB + 1474 28B7 A5 D1 LDA CurrentFileInfoBuff+1 + 1475 28B9 85 DC STA $DC + 1476 28BB 20 2E 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + 1477 28BE F0 05 BEQ DiscNotChanged2 + 1478 28C0 68 PLA + 1479 28C1 68 PLA + 1480 28C2 4C BB 21 JMP ReadMainDir + 1481 28C5 DiscNotChanged2 + 1482 ; odczyt sektora mapy wskazywanego przez DirMapSec + 1483 28C5 A5 D2 LDA DirMapSect + 1484 28C7 8D 2A 2A STA blokDanychIO+10 + 1485 28CA A5 D3 LDA DirMapSect+1 + 1486 28CC 8D 2B 2A STA blokDanychIO+11 + 1487 28CF 0D 2A 2A ORA blokDanychIO+10 + 1488 28D2 F0 DA BEQ DirMapEnd + 1489 28D4 A2 2D LDX #>DirMapSectorBuff + 1490 28D6 A0 80 LDY #DirMapSectorBuff ; -- + 1516 2902 65 E3 ADC InMapPointer+1 ; -- + 1517 2904 85 E5 STA TempZP+1 ; -- + 1518 2906 B1 E4 LDA (TempZP),Y + 1519 2908 8D 2A 2A STA blokDanychIO+10 + 1520 290B C8 INY + 1521 290C B1 E4 LDA (TempZP),Y + 1522 290E 8D 2B 2A STA blokDanychIO+11 + 1523 2911 0D 2A 2A ORA blokDanychIO+10 + 1524 2914 F0 64 BEQ label75 + 1525 ; i zwiekszenie wskaznika mapy o 2 + 1526 2916 C8 INY + 1527 2917 84 E2 STY InMapPointer + 1528 2919 D0 02 BNE NoIncH ; -- + 1529 291B E6 E3 INC InMapPointer+1 ; -- + 1530 291D NoIncH + 1531 291D AD E5 02 LDA MEMTOP + 1532 2920 38 SEC + 1533 2921 E5 D0 SBC CurrentFileInfoBuff + 1534 2923 AD E6 02 LDA MEMTOP+1 + 1535 2926 E5 D1 SBC CurrentFileInfoBuff+1 + 1536 2928 F0 50 BEQ label75 + 1537 292A A4 D0 LDY CurrentFileInfoBuff + 1538 292C A6 D1 LDX CurrentFileInfoBuff+1 + 1539 292E 20 F2 29 JSR ReadSector + 1540 2931 A5 D4 LDA $D4 + 1541 2933 05 D5 ORA $D5 + 1542 2935 D0 16 BNE label79 + 1543 2937 A0 03 LDY #$03 + 1544 2939 B1 D0 LDA (CurrentFileInfoBuff),Y + 1545 293B 85 D4 STA $D4 + 1546 293D C8 INY + 1547 293E B1 D0 LDA (CurrentFileInfoBuff),Y + 1548 2940 85 D5 STA $D5 + 1549 2942 C8 INY + 1550 2943 B1 D0 LDA (CurrentFileInfoBuff),Y + 1551 2945 F0 06 BEQ label79 + 1552 2947 A9 FF LDA #$FF + 1553 2949 85 D4 STA $D4 + 1554 294B 85 D5 STA $D5 + 1555 294D label79 + 1556 294D A5 D0 LDA CurrentFileInfoBuff + 1557 294F 18 CLC + 1558 2950 6D 89 20 ADC .adr loader.SecLen ; przed przepisaniem + 1559 2953 85 D0 STA CurrentFileInfoBuff + 1560 2955 A5 D1 LDA CurrentFileInfoBuff+1 + 1561 2957 6D 8A 20 ADC .adr loader.SecLen+1 ; przed przepisaniem + 1562 295A 85 D1 STA CurrentFileInfoBuff+1 + 1563 295C A5 D4 LDA $D4 + 1564 295E 38 SEC + 1565 295F ED 89 20 SBC .adr loader.SecLen ; przed przepisaniem + 1566 2962 85 D4 STA $D4 + 1567 2964 A5 D5 LDA $D5 + 1568 2966 ED 8A 20 SBC .adr loader.SecLen+1 ; przed przepisaniem + 1569 2969 85 D5 STA $D5 + 1570 296B B0 80 BCS label80 + 1571 296D A5 D0 LDA CurrentFileInfoBuff + 1572 296F 18 CLC + 1573 2970 65 D4 ADC $D4 + 1574 2972 85 D0 STA CurrentFileInfoBuff + 1575 2974 A5 D1 LDA CurrentFileInfoBuff+1 + 1576 2976 65 D5 ADC $D5 + 1577 2978 85 D1 STA CurrentFileInfoBuff+1 + 1578 297A label75 + 1579 297A A5 DC LDA $DC + 1580 297C C5 D1 CMP CurrentFileInfoBuff+1 + 1581 297E 90 0B BCC label81 + 1582 2980 D0 17 BNE label82 + 1583 2982 A5 DB LDA $DB + 1584 2984 C5 D0 CMP CurrentFileInfoBuff + 1585 2986 90 03 BCC label81 + 1586 2988 D0 0F BNE label82 + 1587 298A 60 RTS + 1588 298B label81 + 1589 298B A5 DB LDA $DB + 1590 298D 18 CLC + 1591 298E 65 DA ADC $DA + 1592 2990 85 DB STA $DB + 1593 2992 90 E6 BCC label75 + 1594 2994 E6 DC INC $DC + 1595 2996 4C 7A 29 JMP label75 + 1596 2999 label82 + 1597 2999 A5 DB LDA $DB + 1598 299B 38 SEC + 1599 299C E5 DA SBC $DA + 1600 299E 85 D0 STA CurrentFileInfoBuff + 1601 29A0 A5 DC LDA $DC + 1602 29A2 E9 00 SBC #$00 + 1603 29A4 85 D1 STA CurrentFileInfoBuff+1 + 1604 29A6 60 RTS + 1605 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora + 1606 29A7 ReadPERCOM + 1607 29A7 A9 04 LDA #$04 + 1608 29A9 8D 2C 2A STA DiskRetryCount + 1609 29AC ReadPERCOMretry + 1610 29AC A0 D0 LDY #blokDanychIO_PERCOM + 1612 29B0 20 C8 2A JSR Table2DCB + 1613 29B3 20 BD 2A JSR GoSIO + 1614 29B6 30 08 BMI PercomError + 1615 ; blok odczytany - ustawmy dlugosc 1 sektora + 1616 29B8 AD 11 2C LDA PERCOMdata+6 + 1617 29BB C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128 + 1618 29BD F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest + 1619 29BF 60 RTS + 1620 29C0 PercomError + 1621 29C0 CE 2C 2A DEC DiskRetryCount + 1622 29C3 D0 E7 BNE ReadPERCOMretry + 1623 ; blok nieodczytany - dlugosc 1 sektora na $80 + 1624 29C5 Set1Sect128 + 1625 29C5 A9 00 LDA #$00 + 1626 29C7 8D 11 2C STA PERCOMdata+6 + 1627 29CA A9 80 LDA #$80 + 1628 29CC 8D 12 2C STA PERCOMdata+7 + 1629 29CF 60 RTS + 1630 29D0 blokDanychIO_PERCOM + 1631 29D0 31 01 4E 40 .BY $31,$01,$4E,$40 + 1632 29D4 0B 2C .WO PERCOMdata + 1633 29D6 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00 + 1634 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) + 1635 29DC ReadFirstSect + 1636 29DC A9 01 LDA #$01 + 1637 29DE 8D 2A 2A STA blokDanychIO+10 + 1638 29E1 A9 00 LDA #$00 + 1639 29E3 8D 2B 2A STA blokDanychIO+11 + 1640 29E6 AD 11 2C LDA PERCOMdata+6 + 1641 29E9 8D 29 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1642 29EC AD 12 2C LDA PERCOMdata+7 + 1643 29EF 4C FB 29 JMP ReadSector1 + 1644 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen) + 1645 ; reszta danych jak nizej (A nie wazne) + 1646 29F2 ReadSector + 1647 29F2 AD 8A 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + 1648 29F5 8D 29 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b + 1649 29F8 AD 89 20 LDA .adr loader.SecLen ; przed przepisaniem + 1650 29FB ReadSector1 + 1651 29FB 8D 28 2A STA blokDanychIO+8 + 1652 29FE 8E 25 2A STX blokDanychIO+5 + 1653 2A01 8C 24 2A STY blokDanychIO+4 + 1654 2A04 A9 04 LDA #$04 + 1655 2A06 8D 2C 2A STA DiskRetryCount + 1656 2A09 DiskReadRetry + 1657 2A09 A0 20 LDY #blokDanychIO + 1659 2A0D 20 C8 2A JSR Table2DCB + 1660 2A10 20 BD 2A JSR GoSIO + 1661 2A13 30 01 BMI label85 + 1662 2A15 60 RTS + 1663 2A16 label85 + 1664 2A16 CE 2C 2A DEC DiskRetryCount + 1665 2A19 D0 EE BNE DiskReadRetry + 1666 2A1B 68 PLA + 1667 2A1C 68 PLA + 1668 2A1D 4C 7A 21 JMP ErrorDisplay + 1669 2A20 blokDanychIO + 1670 2A20 31 01 52 40 .BY $31,$01,$52,$40 + 1671 2A24 80 2D .WO DirMapSectorBuff + 1672 2A26 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00 + 1673 2A2C DiskRetryCount + 1674 2A2C 00 .BY $00 + 1675 2A2D PrintXY + 1676 2A2D 68 PLA + 1677 2A2E 85 C8 STA $C8 + 1678 2A30 68 PLA + 1679 2A31 85 C9 STA $C9 + 1680 2A33 A9 00 LDA #$00 + 1681 2A35 85 DF STA $DF + 1682 2A37 20 AF 2A JSR label87 + 1683 2A3A 48 PHA + 1684 2A3B 20 AF 2A JSR label87 + 1685 2A3E 85 DE STA $DE + 1686 2A40 0A ASL + 1687 2A41 0A ASL + 1688 2A42 18 CLC + 1689 2A43 65 DE ADC $DE + 1690 2A45 0A ASL + 1691 2A46 0A ASL + 1692 2A47 26 DF ROL $DF + 1693 2A49 0A ASL + 1694 2A4A 26 DF ROL $DF + 1695 2A4C 18 CLC + 1696 2A4D 65 58 ADC SAVMSC + 1697 2A4F 85 DE STA $DE + 1698 2A51 A5 DF LDA $DF + 1699 2A53 65 59 ADC SAVMSC+1 + 1700 2A55 85 DF STA $DF + 1701 2A57 68 PLA + 1702 2A58 A8 TAY + 1703 2A59 label92 + 1704 2A59 20 AF 2A JSR label87 + 1705 2A5C C9 00 CMP #$00 + 1706 2A5E F0 48 BEQ label88 + 1707 2A60 C9 7D CMP #$7D + 1708 2A62 F0 21 BEQ label89 + 1709 2A64 A2 00 LDX #$00 + 1710 2A66 86 E0 STX $E0 + 1711 2A68 C9 80 CMP #$80 + 1712 2A6A 66 E0 ROR $E0 + 1713 2A6C 29 7F AND #$7F + 1714 2A6E C9 20 CMP #$20 + 1715 2A70 B0 04 BCS label90 + 1716 2A72 09 40 ORA #$40 + 1717 2A74 D0 07 BNE label91 + 1718 2A76 label90 + 1719 2A76 C9 60 CMP #$60 + 1720 2A78 B0 03 BCS label91 + 1721 2A7A 38 SEC + 1722 2A7B E9 20 SBC #$20 + 1723 2A7D label91 + 1724 2A7D 05 E0 ORA $E0 + 1725 2A7F 91 DE STA ($DE),Y + 1726 2A81 C8 INY + 1727 2A82 4C 59 2A JMP label92 + 1728 2A85 label89 + 1729 2A85 98 TYA + 1730 2A86 48 PHA + 1731 2A87 A5 58 LDA SAVMSC + 1732 2A89 85 E0 STA $E0 + 1733 2A8B A9 03 LDA #$03 + 1734 2A8D AA TAX + 1735 2A8E 18 CLC + 1736 2A8F 65 59 ADC SAVMSC+1 + 1737 2A91 85 E1 STA $E1 + 1738 2A93 A0 BF LDY #$BF + 1739 2A95 A9 00 LDA #$00 + 1740 2A97 label93 + 1741 2A97 91 E0 STA ($E0),Y + 1742 2A99 88 DEY + 1743 2A9A C0 FF CPY #$FF + 1744 2A9C D0 F9 BNE label93 + 1745 2A9E C6 E1 DEC $E1 + 1746 2AA0 CA DEX + 1747 2AA1 10 F4 BPL label93 + 1748 2AA3 68 PLA + 1749 2AA4 A8 TAY + 1750 2AA5 4C 59 2A JMP label92 + 1751 2AA8 label88 + 1752 2AA8 A5 C9 LDA $C9 + 1753 2AAA 48 PHA + 1754 2AAB A5 C8 LDA $C8 + 1755 2AAD 48 PHA + 1756 2AAE 60 RTS + 1757 2AAF label87 + 1758 2AAF E6 C8 INC $C8 + 1759 2AB1 D0 02 BNE label94 + 1760 2AB3 E6 C9 INC $C9 + 1761 2AB5 label94 + 1762 2AB5 A2 00 LDX #$00 + 1763 2AB7 A1 C8 LDA ($C8,X) + 1764 2AB9 60 RTS + 1765 2ABA GoErrorDisp + 1766 2ABA 4C 7A 21 JMP ErrorDisplay + 1767 ; Skok do Sio lub procedury Turbo + 1768 2ABD GoSIO + 1769 2ABD AC 09 21 LDY USmode + 1770 2AC0 F0 03 BEQ StandardSpeed + 1771 2AC2 4C A3 27 JMP HappyUSMovedProc ; mozna skakac do tej procki + 1772 2AC5 StandardSpeed + 1773 2AC5 4C 59 E4 JMP JSIOINT + 1774 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) + 1775 ; do bloku kontroli transmisji szeregowej DCB + 1776 2AC8 Table2DCB + 1777 2AC8 8C D1 2A STY IOtableAddr+1 + 1778 2ACB 8E D2 2A STX IOtableAddr+2 + 1779 2ACE A2 0B LDX #$0B + 1780 2AD0 IOtableAddr + 1781 2AD0 BD FF FF LDA $FFFF,X + 1782 2AD3 9D 00 03 STA DDEVIC,X + 1783 2AD6 CA DEX + 1784 2AD7 10 F7 BPL IOtableAddr + 1785 2AD9 60 RTS + 1786 2ADA Close1 + 1787 2ADA A2 10 LDX #$10 + 1788 2ADC CloseX + 1789 2ADC A9 0C LDA #$0C + 1790 2ADE 9D 42 03 STA ICCMD,X + 1791 2AE1 4C 56 E4 JMP JCIOMAIN + 1792 2AE4 GetKey + 1793 2AE4 A2 10 LDX #$10 + 1794 2AE6 A9 03 LDA #$03 + 1795 2AE8 9D 42 03 STA ICCMD,X + 1796 2AEB A9 04 LDA #$04 + 1797 2AED 9D 4A 03 STA ICAX1,X + 1798 2AF0 A9 00 LDA #$00 + 1799 2AF2 9D 4B 03 STA ICAX2,X + 1800 2AF5 9D 49 03 STA ICBUFL+1,X + 1801 2AF8 A9 FF LDA #$FF + 1802 2AFA 9D 48 03 STA ICBUFL,X + 1803 2AFD A9 2B LDA #Kdriver + 1806 2B04 9D 45 03 STA ICBUFA+1,X + 1807 2B07 20 56 E4 JSR JCIOMAIN + 1808 2B0A 30 1C BMI GKeyError + 1809 2B0C A2 10 LDX #$10 + 1810 2B0E A9 00 LDA #$00 + 1811 2B10 9D 48 03 STA ICBUFL,X + 1812 2B13 9D 49 03 STA ICBUFL+1,X + 1813 2B16 A9 07 LDA #$07 + 1814 2B18 9D 42 03 STA ICCMD,X + 1815 2B1B 20 56 E4 JSR JCIOMAIN + 1816 2B1E 30 08 BMI GKeyError + 1817 2B20 48 PHA + 1818 2B21 20 DA 2A JSR Close1 + 1819 2B24 30 02 BMI GKeyError + 1820 2B26 68 PLA + 1821 2B27 60 RTS + 1822 2B28 GKeyError + 1823 2B28 4C BA 2A JMP GoErrorDisp + 1824 2B2B Kdriver + 1825 2B2B 4B 3A 9B .BY "K:",$9B + 1826 2B2E DiscChangeCheck + 1827 2B2E A0 80 LDY #DirMapSectorBuff + 1829 2B32 20 DC 29 JSR ReadFirstSect + 1830 2B35 A2 7F LDX #$7F + 1831 2B37 label98 + 1832 2B37 BD 00 2D LDA FirstSectorBuff,X + 1833 2B3A DD 80 2D CMP DirMapSectorBuff,X + 1834 2B3D D0 05 BNE ChangedD + 1835 2B3F CA DEX + 1836 2B40 10 F5 BPL label98 + 1837 2B42 A9 00 LDA #$00 + 1838 2B44 ChangedD + 1839 2B44 60 RTS + 1840 ; obsluga gwiazdki + 1841 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od * + 1842 ; w Y jest ) - X moze lepiej nie ruszac :) + 1843 2B45 Asteriks + 1844 2B45 A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy) + 1845 2B47 20 63 2B JSR GetHexNumber + 1846 2B4A 8D C5 02 STA COLPF1S ; literki + 1847 2B4D C8 INY + 1848 2B4E 20 63 2B JSR GetHexNumber + 1849 2B51 8D C6 02 STA COLPF2S ; tlo + 1850 2B54 C8 INY + 1851 2B55 20 63 2B JSR GetHexNumber + 1852 2B58 8D C8 02 STA COLBAKS ; ramka + 1853 2B5B C8 INY + 1854 2B5C 20 63 2B JSR GetHexNumber + 1855 2B5F 8D 0D 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo) + 1856 2B62 60 RTS + 1857 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX + 1858 ; i zamienia na bajt w A + 1859 2B63 GetHexNumber + 1860 2B63 20 73 2B JSR GetHEX4bits + 1861 2B66 0A ASL + 1862 2B67 0A ASL + 1863 2B68 0A ASL + 1864 2B69 0A ASL + 1865 2B6A 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda. + 1866 2B6C C8 INY + 1867 2B6D 20 73 2B JSR GetHEX4bits + 1868 2B70 05 E4 ORA TempZP + 1869 2B72 60 RTS + 1870 2B73 GetHEX4bits + 1871 2B73 B1 D4 LDA ($D4),Y + 1872 2B75 38 SEC + 1873 2B76 E9 30 SBC #'0' + 1874 2B78 C9 0A CMP #$0A ; sprawdzmy czy cyfra + 1875 2B7A 90 02 BCC IsNumber + 1876 2B7C E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow + 1877 2B7E IsNumber + 1878 2B7E 60 RTS + 1879 ; Ustawia numer satcji wg A + 1880 2B7F SeTDriveNR + 1881 2B7F C9 09 CMP #$09 + 1882 2B81 B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry + 1883 2B83 20 A1 2B JSR SeTblokDanychDrive + 1884 2B86 18 CLC + 1885 2B87 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0 + 1886 2B89 8D BC 22 STA DriveDisp1 + 1887 2B8C A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu + 1888 2B8E 8D BB 22 STA DriveDisp1-1 + 1889 2B91 60 RTS + 1890 2B92 SeTDriveLetter + 1891 2B92 20 A1 2B JSR SeTblokDanychDrive + 1892 2B95 18 CLC + 1893 2B96 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + 1894 2B98 8D BC 22 STA DriveDisp1 + 1895 2B9B A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja + 1896 2B9D 8D BB 22 STA DriveDisp1-1 + 1897 2BA0 60 RTS + 1898 2BA1 SeTblokDanychDrive + 1899 2BA1 8D 82 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem + 1900 2BA4 8D 21 2A STA blokDanychIO+1 + 1901 2BA7 8D A3 28 STA blokDanychIO_GetUSSpeed+1 + 1902 2BAA 8D D1 29 STA blokDanychIO_PERCOM+1 + 1903 2BAD 60 RTS + 1904 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku + 1905 2BAE MEMLOprint + 1906 2BAE AD E7 02 LDA MEMLO + 1907 2BB1 48 PHA + 1908 2BB2 4A LSR + 1909 2BB3 4A LSR + 1910 2BB4 4A LSR + 1911 2BB5 4A LSR + 1912 2BB6 20 0F 21 JSR bin2AsciiHex + 1913 2BB9 8D E7 2B STA MEMLOvalue+2 + 1914 2BBC 68 PLA + 1915 2BBD 20 0F 21 JSR bin2AsciiHex + 1916 2BC0 8D E8 2B STA MEMLOvalue+3 + 1917 2BC3 AD E8 02 LDA MEMLO+1 + 1918 2BC6 48 PHA + 1919 2BC7 4A LSR + 1920 2BC8 4A LSR + 1921 2BC9 4A LSR + 1922 2BCA 4A LSR + 1923 2BCB 20 0F 21 JSR bin2AsciiHex + 1924 2BCE 8D E5 2B STA MEMLOvalue + 1925 2BD1 68 PLA + 1926 2BD2 20 0F 21 JSR bin2AsciiHex + 1927 2BD5 8D E6 2B STA MEMLOvalue+1 + 1928 2BD8 20 2D 2A JSR PrintXY + 1929 2BDB 1C 17 .BY 28,23 + 1930 2BDD 4D 45 4D 4C 4F 3A + .BY "MEMLO: $" + 1931 2BE5 MEMLOvalue + 1932 2BE5 30 30 30 30 .BY "0000" + 1933 2BE9 00 .BY $00 + 1934 2BEA 60 RTS + 1935 + 1936 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo + 1937 + 1938 2BEB xjsrTableL + 1939 2BEB D1 E5 EB .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1] + 1940 2BEE F1 F6 .BY <[xjsr4+1],<[xjsr5+1] + 1941 2BF0 02 0C 18 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1] + 1942 2BF3 1D 25 .BY <[xjsr9+1],<[xjsrA+1] + 1943 2BF5 xjsrTableH + 1944 2BF5 27 27 27 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1] + 1945 2BF8 27 27 .BY >[xjsr4+1],>[xjsr5+1] + 1946 2BFA 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1] + 1947 2BFD 28 28 .BY >[xjsr9+1],>[xjsrA+1] + 1948 ; miejsce na wyliczony offset o jaki przesuwamy procedure + 1949 2BFF HappyOffset + 1950 2BFF 00 00 .WO $0000 + 1951 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :) + 1952 2C01 DensityCodes + 1953 2C01 F3 E4 F1 .by +$80,"sdq" + 1954 ;.by "SDQ" + 1955 ;.by $0e,$15,$a0 + 1956 2C04 ONtext + 1957 2C04 CF CE A0 .BY +$80,"ON " + 1958 2C07 OFFtext + 1959 2C07 CF C6 C6 .BY +$80,"OFF" + 1960 ; miejsce na przechowanie stanu urzadzen PBI (przez reset) + 1961 2C0A PDVMASKtemp + 1962 2C0A 00 .BY $00 + 1963 ; miejsce na blok PERCOM + 1964 2C0B PERCOMdata + 1965 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie + 1966 = 2C17 FirstSectorsTable=*+12 ; omijamy 12b na percom + 1967 ; zostawiamy $30 bajtow wolnego + 1968 + 1969 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow + 1970 = 2D00 ProgramEnd=FirstSectorBuff + 1971 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu + 1972 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu + 1973 2C0B FirstRun + 1974 ; odnotowujemy stan Shift z Bootowania + 1975 2C0B AD 0F D2 LDA SKSTAT + 1976 2C0E 29 08 and #$08 + 1977 2C10 D0 03 BNE NoSHIFTboot + 1978 2C12 8D 0C 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0 + 1979 2C15 NoSHIFTboot + 1980 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie + 1981 2C15 AD 01 D3 LDA PORTB + 1982 2C18 29 02 AND #$02 + 1983 2C1A D0 0B BNE BrakBasica + 1984 ; jest Basic + 1985 2C1C A0 02 LDY #$2 + 1986 2C1E BASstatprint + 1987 2C1E B9 04 2C LDA ONtext,y + 1988 2C21 99 D7 22 STA BASstatus,y + 1989 2C24 88 DEY + 1990 2C25 10 F7 bpl BASstatprint + 1991 2C27 BrakBasica + 1992 ; Sprawdzamy istnienie QMEGa + 1993 2C27 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy + 1994 2C29 testQMEGloop + 1995 2C29 B9 01 C0 LDA $C001,y + 1996 2C2C D9 5C 2C CMP QMEGstring,y + 1997 2C2F D0 13 bne brakQMEGa + 1998 2C31 88 dey + 1999 2C32 10 F5 bpl testQMEGloop + 2000 ; jest QMEG + 2001 2C34 A9 00 LDA #0 + 2002 2C36 8D 0A 21 STA QMEG + 2003 2C39 A0 02 LDY #$2 + 2004 2C3B Qstatprint + 2005 2C3B B9 04 2C LDA ONtext,y + 2006 2C3E 99 CF 22 STA QMEGstatus,y + 2007 2C41 88 DEY + 2008 2C42 10 F7 bpl Qstatprint + 2009 2C44 brakQMEGa + 2010 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi + 2011 2C44 AD 00 03 LDA DDEVIC + 2012 2C47 18 clc + 2013 2C48 6D 01 03 ADC DUNIT + 2014 2C4B 38 sec + 2015 2C4C E9 01 SBC #$01 + 2016 2C4E 29 0F AND #$0F ; zapamietanie numeru urzadzenia + 2017 2C50 8D 0B 21 STA BootDrive + 2018 2C53 20 7F 2B JSR SeTDriveNR + 2019 2C56 20 1E 21 JSR EditorOpen + 2020 2C59 4C 4C 21 JMP mainprog + 2021 2C5C QMEGstring + 2022 2C5C 51 4D 45 47 2D 4F + .BY "QMEG-OS",0 + 2023 2C64 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26" + 2024 ;.OPT List + 2025 + 2026 + 2027 = 0080 MAPCOUNTER + 2027 = 0082 COMPRESSEDMAPCOUNTER + 2027 = 0084 MAPCOUNTERMEM + 2027 = 0086 PREVFILESECTOR + 2027 = 0088 MAPPOSITIONMEM + 2027 = 008A SECTOROFFSET + 2027 = 008C SECTORSCOUNTER + 2027 org $02e0 + 2028 02E0-02E1> 80 26 .WO LoaderGo + 2029 ; .WO START + 2030 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera) + 2031 ; OPT h- + 2032 ; org $0000 + 2033 ; .WO $0000 + 2034 diff --git a/loaderFN.xex b/loaderFN.xex index 5821f5120a1cc89a40f93e2ac487c2da80ee2fa4..be137e1cab6579a46edfead789ebc2d27acc3b2b 100644 GIT binary patch delta 2177 zcmYjSe{2)i9lv{*DD7ru^^}Iif!bS?Rog+;xsa55FO!l<}_20Hov$#!W$#} zNCEZF83jaV`HNG?K8yAa70rJd<>kbyM~d{{=Kg`#KYQjspn#697vW02bb!53CFs4neLGXoX-s z8BZj#DAs*Iz{CDQ4S>Uv%Hp>kD-|Kw*ud|T`ZJ_`dc66hJB$0i8@%j$30 z6`@K2NBoK+;J17UISxR429`55R(S?nB^kjymtc$)a-igb&dku`_+%eWu@b#fcd0ZFw$a%4TZNtQKd*?lj;>z%gX8p zsJT`aYnCMC-{F^D#*_c}^l$z@4h-DH?JtM-cQF93p7Vp;X6{?d>l=n$U&LJrN79Vd zH}np>9%|$6@H&ds0S>!b8|g|Ac&IFHP_8y8KTtp7#HXqS+~JQqlDYBv2D7Hu^&noE z%$;^Oq=%aO9}HG&Id{03f4jihPmGeo7kX=kt*4U1zf$fA#-dSQxmkvv6m~n91as_znPcxOXX~{0 z%+HnI)L~gdC?cKrZa1;H#4iPUuIsl zex7;4IuAa%oN*17;n!@JWm@{3nQshMw9N(ZVK+Rp~P3CNvtG8}jFSl>pvKBY{Ee`HsI0cKh!Q*n1gIJ2Q$sE0gsVJsl z@dr%(_F`j^ma8XAmp=Zf4^rnaIfA!08AoMu%%(&pKgQeDYo+VO?M-le!m7u6o3y@) zD4Z%4O~B|3ECEliO<0?#V%g*0?ZalN79BZ`0m@sAMpSkllC2J)VBR<+gY9@UA>(1*xE0I~Avfb@K^ zO+PyaN{fEoGY4uJDb6G++ESnRNo(r9pL{jhI#=|cYE1)Wq*JXB>Jy3orp~Ir;AYw<)wsx=EV7NUj7cPVz(;OtCizgyk~?;o zl=k#MplGAu6zvxH#3_o_Z73U2a18j0jDoAkEpX2Sy!_<3iFb};lh-Ck`mi+&wIT1; z<*rFGmCVlvRsNBN&h*g<@Yq)BpVn8skT z%JiaLUmz91dBoJR;5m}ja&2?K=CrZ7KDDo6W#oWQ`><{5HVE9AWk@!pmrzNJn+cy? zGgD%q+^CTC|fm>9;J^-&@R6Hbfx5As^A%*#EBxD`9+YXKGAqgQvT&L zAXH!tq2m=#Hi{=2#0BLzAwE*hhAM2ecj3tnsOucdOD~B*d`W%LQOjOZ4?4W;PW8N_ z&a+e0GC?gJ3>DJw2AKqNCLK}^2p1t(IOVKI*_l6)6;F<;e|NO7epRTf-*j6Hpq`L& zMSO168}mtV$Crqt82K+z*(@D)-Pf5=yb^!kPp_l2O>QiZ^a61TA-vD;fI;$UyiYw< zxg>JN?+y>r-`7D6x>^^)Haldqahs)wF%?95)=RU#5G2Hxon+cS-$`ctkRM-ePAzN} z{7~S&vTRewCS~&~+z^1lgtAkg+VDCc% zdl)af%npseAeoDM?Q2m7)LOf{-LwxO_T3QtZL_Rz5uNX1P;nJSJy^9LMVtNykb-kG delta 2187 zcmYjSeQZMSS)qyJBuqh`P@t^_-gyb@ zdS#z;@45G$bKX7Y{LY=~)#_-m_~eBJNp?sKb1|fPLTXb;Z4P0Di;(6BX^Id}WC-_g zqdkU2{u8GuT?Wd#RS$8f zUg8WUD{sC9_vk&OI_cL)`!k)3B8{W-2>->rTvM>fh|?VF3gsksat`6+xo|yuWZx~0 zXJQP)Xt|JfI&|_L3TueCz_2?}rEvqT7S%D(Zc&{B9TwF!5VEN5frA$LwH#czx`^~8 zMDv`+^fT79@!f+wr{}pFdDOS!)ANX;@~aET+>G^%7L9Lop`3WMBK;3~@D_J1!Rdn> zo#Eu|N)@|}T~&PS_Sb(5wlo23;n#A3y0Bg&_?-f^3x!?rPZJ*ewFqukfjv`H5l0{I zl=>grd#WDGSt0(rDfjt8KM2MK|QvvT+2G|!iI|O{iCwB^X)SK|f8N908 zV0XNjz?TN`$To>i*{@pt*Lc6iQkQUk^1_r>M<&SMwHPr-1}wS-k|opHR-93GpxyS9 zc4Ko-rfM}%eduWW;iDMi_LiTihOKKWG5Sz`LT*#uMiQG*{(yF}`<1_TWg;K8)KRAXvGH0Z$lMHaPqmHLuh z%D$2^<#0)PG$5%H1NG7mT+Yv`v*TNmt@7!bA4p+kzAj2-hI%$<3NNKHAIiL4-!$nh zH_Gr!!bzSCiK`zpuxB(1^az9=kO_)e%?>1{_EORU!z?%q+uLcg(S zBV+^MN2PuM(Hf~iemkevNb~@*X}7u)m@XpHq;cJYm@XmGtTq{Fta+@-rY|CT*=?5e z`^ufNoh7fk@!ymuWwp_l&8l>-SEW45h4vn8JA9-qRC}!B7^6caz8TbpSKzWu(%dU> zy;_Ph32ShqL?R6%8zu5$s$s<@z1NTiUJV=)eJ=5IWY|5x@R@r>V>Mn(Fjs8dpkfhS z>;?@>NWbi+zvuM#-Smnw#06e`!(-DKOE+ujDv|)LoYav8pZ4hd8m%y?8ZZSL&Aj|p z+k)TlXpPh|6-W48&v<*Xy2p5QJ^=Ig8t^-w^k?m*oVyF`k7&4(| zgDbGis?#fj$}g>TQN^o%8CyQQBl<>ny#_TtXQ4`gj;5mxftsE}Y5& zzKrvLEL?cpn%smx@!7hPblMKUl(mP~mZRn}ZZ4zr15Eddbl5}hd&5v2-?tV Date: Tue, 14 May 2024 10:04:10 +0200 Subject: [PATCH 8/9] 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 From 9e25a1fe89ee1b5ab0997b8f01d973c1c8a075df Mon Sep 17 00:00:00 2001 From: Pecusx Date: Tue, 14 May 2024 10:04:41 +0200 Subject: [PATCH 9/9] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5b9bd87..1d4272d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.bak +*.bak