diff --git a/msdos47.as8 b/msdos47.as8 new file mode 100755 index 0000000..26fc217 --- /dev/null +++ b/msdos47.as8 @@ -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/msdos47.obx b/msdos47.obx new file mode 100755 index 0000000..f543a7d Binary files /dev/null and b/msdos47.obx differ diff --git a/msdos_work.atr b/msdos_work.atr new file mode 100755 index 0000000..acd096f Binary files /dev/null and b/msdos_work.atr differ diff --git a/msini4-prx.as8 b/msini4-prx.as8 new file mode 100755 index 0000000..9653a3d --- /dev/null +++ b/msini4-prx.as8 @@ -0,0 +1,465 @@ +; Uwaga!!! +; Zapis dotyczacy jednego pliku w pamieci trzymany jest inaczej niz w basicowych wersjach MSINI +; a takze inaczej niz w pliku na dysku +; Ma on o jeden bajt wiecej, czyli zajmuje 47 bajtow +; 11b nazwa pliku i rozszerzenie +; 35b dluga nazwa pliku +; 1b znacznik ze to katalog - " " plik, ">" katalog + + icl '../lib/atari.hea' + icl '../lib/system.hea' + +; stale systemowe +;MEMTOP = $02e5 +;MEMLO = $02e7 + +; Symbole SDX uzyte w programie - skoki do nich loader SpartyX podmienia po wczytaniu +comtab smb 'comtab' +u_getpar smb 'u_getpar' +u_gepath smb 'u_gepath' +printf smb 'printf' +getcwd smb 'getcwd' +file_p smb 'file_p' +ffirst smb 'ffirst' +fnext smb 'fnext' +fclose smb 'fclose' +fopen smb 'fopen' +fread smb 'fread' +fwrite smb 'fwrite' + +; offsety do comtab +lbuf equ $3f +bufoff equ $0a +comfnam equ $21 +trails equ $1a + +; Stale adresy SDX +path equ $07a0 +device equ $0761 +fmode equ $0778 +fatr1 equ $0779 +fatr2 equ $077a +faux1 equ $0782 +faux2 equ $0783 +faux3 equ $0784 +faux4 equ $0785 +faux5 equ $0786 + +; Stale adresy - pojedynczy zapis katalogu +dirbuf equ $0789 +dirfatr equ dirbuf +dirf1sec equ dirbuf+1 +dirflen equ dirbuf+3 +dirfname equ dirbuf+6 +dirfdate equ dirbuf+17 +dirftime equ dirbuf+20 + +; zmienne na stronie zerowej +edited_file_addr equ $80 ;adres w pamieci RAM obecnie edytowanego zapisu, obliczony z buffer o edited_file +print_addr equ edited_file_addr+2 ;adres w pamieci ekranu, do ktorego zapisujemy. +tempA equ edited_file_addr+4 +tempB equ edited_file_addr+6 + +; Poczatek kodu relokowalnego + blk reloc main +; Tutaj kod relokowalny, Sparta zaladuje go powyzej swojego MEMLO +; i po zaladowaniu oraz relokacji adresow, podniesie MEMLO za ten blok +; czyli w programie mozna jako bufora roboczy zajac obszar od MEMLO do HIMEM + +start + jsr printf + .BYTE 125,'MSINI Lite4 (c) 2010-08-31',$9b,0 + jsr u_getpar ; pobranie kolejnego parametru + jsr getcwd ; jesli parametrem byl podkatalog to go obrobi a jesli go nie bylo to poda bierzacy + ; co wazne SPARWDZA czy ten katalog jest i jesli nie wychodzi z odpowiednim bledem ! + lda device + tax + and #%11110000 ; sprawdzamy czy podana (lub nie) sciezka dotyczy napedu dyskow + bne not_disc_drive + dex + txa + clc + adc #'A' + sta ourpath + ; robimy sciezke + ldx #$00 + ; przepisujemy z pobranej do naszej +path_loop1 + lda path,x + sta ourpath+2,x + beq end_of_path + inx + bne path_loop1 +end_of_path + ; na koniec uzupelniamy o '\', znak konca linii o 0 (dla pewnosci dla printf) + lda #'\' + sta ourpath+2,x + inx + lda #$9b + sta ourpath+2,x + inx + lda #$00 + sta ourpath+2,x + inx + stx ourpath_end ; zapamietajmy gdzie konczy sie sciezka - tu bedzie dopisywana nazwa pliku +not_disc_drive +; wyliczmy na ile zapisow mamy miejsce w pamieci + ; od memtopa odjac memlona + sbw MEMTOP MEMLO buffer ; tymczasowo w max_flies, bo trzeba to podzielic przez dlugosc wpisu - 47 + ; no i jak to podzielic.... ??? + ; a wezmy poprostu poodejmujmy w petli .... :) + mwa #0 max_files ; zerujmy licznik plikow +count_free_files + sbw buffer #47 buffer + bcc end_memory + inw max_files + jmp count_free_files +end_memory + jsr printf + .BYTE 'MEMLO: $%4x , MEMTOP: $%4x',$9b,'FREE MEMORY FOR $%4x FILES.',$9b,0 + .WORD MEMLO,MEMTOP,max_files + jsr printf + .BYTE 'Reading directory: ' + .BYTE '%s',$9b,0 + .WORD ourpath + ; parametry '*' na standardowe + jsr set_default_params + +; ----- czytamy katalog zliczajac pliki i umieszczajac ich nazwy w pamieci ----- + +; to przeczytajmy katalog procedurami SDX + ; najpierw dopiszmy maske + ldx ourpath_end + ldy #$00 +make_search_patch + lda searchmask,y + sta ourpath,x + beq spath_ready + inx + iny + bne make_search_patch +spath_ready + mwa Pourpath file_p + ; maska artybutów - tylko nieukryte ($20) + lda #$20 + sta fatr1 + ; licznik plikow na 00 + mwa #0 num_of_files + ; czytamy pierwszy wpis + jsr ffirst + bmi directory_end + bpl dir_entry_in_buf ; od razu obrabiamy +get_next_dir_entry + ; czytamy kolejne wpisy + jsr fnext + bmi directory_end +dir_entry_in_buf + ; tu mamy w 'dirbuf' pojedynczy zapis - trzeba cos z nim zrobic + ; sprawdzmy czy to nie MSDOS + ldx #$07 +check_next1 + lda dirfname,x + cmp MSDOSname,x + bne not_msdos + dex + bpl check_next1 + bmi get_next_dir_entry +not_msdos + ; tu wiemy juz ze plik nie nazywa sie MSDOS.* + ; printujemy kropke.... + jsr printf + .BYTE '.',0 + ; wyznaczamy adres w buforze + mwa num_of_files edited_file_nr + jsr set_edit_addr + ; mamy adres przepisujemy wiec nazwe pliku + ldy #0 +name_to_mem_loop + lda dirfname,y + sta (edited_file_addr),y + iny + cpy #11 + bne name_to_mem_loop + ; reszte dopelnamy spacjami + lda #' ' +spaces_fill + sta (edited_file_addr),y + iny + cpy #47 + bne spaces_fill + ; sprawdzmy czy to przypadkiem nie katalog i jesli tak dopiszmy na koncu + lda dirfatr + and #$20 + beq not_DIR + ; dopisujemy na koncu tekstu + ldy #46 + ldx #5 +DIRmark_set + lda DIRmark,x + sta (edited_file_addr),y + dey + dex + bpl DIRmark_set +not_DIR + inw num_of_files ; zwiekszamy licznik plikow + jmp get_next_dir_entry +directory_end + jsr fclose + jsr printf + .BYTE $9b,'FILES IN DIR: $%4x.',$9b,0 + .WORD num_of_files + +; ----- sprawdzamy czy jest plik MSDOS.DAT ----- + + ; najpierw dopiszmy nazwe do sciezki + ldx ourpath_end + ldy #$00 +make_dat_patch + lda datname,y + sta ourpath,x + beq dat_path_ready + inx + iny + bne make_dat_patch +dat_path_ready + mwa Pourpath file_p + ; maska artybutów - tylko nieukryte ($20) + lda #$20 + sta fatr1 + ; czytamy pierwszy wpis + jsr ffirst + bpl dat_file_found + jsr fclose + jmp start_edit + +; ----- jest plik MSDOS.DAT - czytamy go ----- + +dat_file_found + jsr fclose ; zamykamy czytanie katalogu + jsr printf + .BYTE 'MSDOS.DAT found.',$9b,'Reading descriptions',$9b,$0 + ; czyli przygotowujemy otwarcie pliku do odczytu + mwa Pourpath file_p + ; tryb otwarcia - odczyt + lda #$04 + sta fmode + ; maska artybutów - tylko nieukryte ($20) i niekatalogi ($80) + lda #$A0 + sta fatr1 + ; i otwieramy plik + jsr fopen + + ; plik otwarty - petla czytajaca dane tu sie zaczyna +read_block + mwa Pone_buffer faux1 ; adres bufora + mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu) + jsr fread + bmi end_dat_file + ; printujemy kropke.... + jsr printf + .BYTE '.',0 + ; sprawdzmy czy nie gwiazdka + lda one_buffer + cmp #'*' + beq asterix_found + ; jesli nie gwiazdka to rozpoczynamy petle szukania + mwa #0 edited_file_nr +search_names1 + jsr set_edit_addr + ; porownajmy filenama + ldy #10 +compare_names1 + lda (edited_file_addr),y + cmp one_buffer,y + bne check_next_name1 + dey + bpl compare_names1 + ; nazwy takie same - przepiszmy calosc (poza znacznikiem katalogu, bo on juz jest) + ldy #45 +long_name_from_DAT + lda one_buffer,y + sta (edited_file_addr),y + dey + bpl long_name_from_DAT +check_next_name1 + inw edited_file_nr + cpw num_of_files edited_file_nr + bne search_names1 ; jesli edited jest mniejszy lub rowny num_files + beq read_block +asterix_found + ; jesli gwiazdka to przepisujemy 'opis' do specjalnego bufora + ldy #34 +get_asterix_params + lda one_buffer+11,y + sta current_params,y + dey + bpl get_asterix_params + bmi read_block ; i czytamy dalej... +end_dat_file + jsr fclose +; ----- przygotowujemy ekran edycji ----- + +start_edit + ;jsr screenStart + ;jsr DAT_file_write +stop + jmp stop + rts + +; procedura zapisu pliku DAT +DAT_file_write + ; przygotowujemy otwarcie pliku do zapisu + mwa Pourpath file_p + ; tryb otwarcia - zapis + lda #$08 + sta fmode + ; maska artybutów - tylko nieukryte ($20) i niekatalogi ($80) + lda #$A0 + sta fatr1 + lda #$00 + sta fatr2 + ; i otwieramy plik + jsr fopen + ; plik otwarty do zapisu + ; na poczatek sprawdzamy czy trzeba zapisac parametry kolorow itp.... + ldy#34 +check_standard_params + lda current_params,y + cmp standard_params,y + bne asterix_write + dey + bpl check_standard_params + bmi asterix_standard +asterix_write + mwa Pasterix_data faux1 ; adres bufora + mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu - bo go nie zapisujemy) + jsr fwrite +asterix_standard + mwa #0 edited_file_nr + ; petla zapisujaca dane tu sie zaczyna +write_block + ; sprawdzmy czy nazwa nie jest pusta + jsr set_edit_addr + ; porownajmy filenama ze spacjemi + ldy #11 +compare_names2 + lda (edited_file_addr),y + cmp #' ' + bne name_not_empty1 + iny + cpy #46 + bne compare_names2 + beq next_name_to_write +name_not_empty1 + ; nazwa nie jest pusta wyprintowujemy ja wiec do pliku, ale nie tak latwo + ; najpierw przepiszmy do podrecznego bufora (bez znacznika katalogu) + ldy #45 +name_to_buff + lda (edited_file_addr),y + sta one_buffer,y + dey + bpl name_to_buff + ; i zapisujemy tem buforek + mwa Pone_buffer faux1 ; adres bufora + mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu) + jsr fwrite +next_name_to_write + inw edited_file_nr + cpw num_of_files edited_file_nr + bne write_block ; jesli edited jest mniejszy +end_dat_write + jsr fclose + rts + + +; procedura obliczajaca na podstawie numeru zapisu +; jego adres w pamieci RAM +set_edit_addr + ; trzeba pomnozyc edited_file_nr przez dlugosc zapisu (46) i dodac adres bufora + ; od razu robimy dodawanie, czyli do wyniku nie zero tylko adres bufora!!! + mwa Pbuffer edited_file_addr + mwa edited_file_nr word1 ; w word1 mnozna (2 bajty) + lda #47 + sta word2 ; w word2 mnoznik (1 bajt) + ldy #8 ; mnozymy przez 8 bitow - word2 (choc wlasciwie mniej mozna) + clc +mulloop1 + lsr word2 + bcc mull_no_c + adw edited_file_addr word1 +mull_no_c + asl word1 + rol word1+1 + dey + bne mulloop1 + rts + +; ustawienie parametrow dodatkowych folderu (gwiazdka) na standardowe +set_default_params + ldy #34 +setting_def_par + lda standard_params,y + sta current_params,y + dey + bpl setting_def_par + rts + +; procedura zmiany znaku w akumulatorze z ATASCII na EKRANOWY (uwzglednia inwers wiec jest dziwna) +atascii2internal + asl @ + php + cmp #$c0 + bcs internal_OK + sbc #$3f + bcs internal_OK + adc #$c0 +internal_OK + plp + ror @ + rts + +; zmienne programu +standard_params + .BYTE 'CAC4C401 ' ; standardowe parametry dla '*' +Pasterix_data DTA V(asterix_data) +asterix_data + .BYTE '* ' +current_params + .BYTE ' ' ; miejsce na edytowane parametry +DIRmark + .BYTE '>',$00 ; koncowka dlugiej nazwy i znacznik katalogu za nia (jesli to katalog) +searchmask + .BYTE '*.*',$9b,$00 +datname + .BYTE 'MSDOS.DAT',$9b,$00 +MSDOSname + .BYTE 'MSDOS ',$00 +Pourpath DTA V(ourpath) ; wskaznik na ourpath (potrzebne by wiedziec gdzie bedzie po relokacji) +ourpath + .BYTE 'A:\ ' +ourpath_end + .BYTE $00 ; offset konca sciezki wskazuje na pierwszy znak po '\' +edited_file_nr + .WORD $0000 ; numer aktualnie edytowanego zapisu (do obliczenia offsetu) +max_files + .WORD $0000 +num_of_files + .WORD $0000 +first_on_screen + .WORD $0000 ; numer pierwszego zapisu wyswietlanego na ekranie (offset) +word1 + .WORD $0000 ; zmienna pomocnicza do mnozenia itp... +word2 + .WORD $0000 ; druga zmienna pomocnicza +Pone_buffer DTA V(one_buffer) +one_buffer + .BYTE ' ' +Pbuffer DTA V(buffer) +buffer + .BYTE $0000 ; adres bufora + + ICL "screen_proc.as8" + +; na koncu automatyczne wygenerowanie bloku zawierajacego adresy do relokacji + blk update address + blk update symbol diff --git a/msini4-prx.obx b/msini4-prx.obx new file mode 100755 index 0000000..497deb6 Binary files /dev/null and b/msini4-prx.obx differ diff --git a/msini4.as8 b/msini4.as8 new file mode 100755 index 0000000..27e1967 --- /dev/null +++ b/msini4.as8 @@ -0,0 +1,458 @@ +; Uwaga!!! +; Zapis dotyczacy jednego pliku w pamieci trzymany jest inaczej niz w basicowych wersjach MSINI +; a takze inaczej niz w pliku na dysku +; Ma on o jeden bajt wiecej, czyli zajmuje 47 bajtow +; 11b nazwa pliku i rozszerzenie +; 35b dluga nazwa pliku +; 1b znacznik ze to katalog - " " plik, ">" katalog + +; stale systemowe +MEMTOP = $02e5 +MEMLO = $02e7 + +; Symbole SDX uzyte w programie - skoki do nich loader SpartyX podmienia po wczytaniu +comtab smb 'comtab' +u_getpar smb 'u_getpar' +u_gepath smb 'u_gepath' +printf smb 'printf' +getcwd smb 'getcwd' +file_p smb 'file_p' +ffirst smb 'ffirst' +fnext smb 'fnext' +fclose smb 'fclose' +fopen smb 'fopen' +fread smb 'fread' +fwrite smb 'fwrite' + +; offsety do comtab +lbuf equ $3f +bufoff equ $0a +comfnam equ $21 +trails equ $1a + +; Stale adresy SDX +path equ $07a0 +device equ $0761 +fmode equ $0778 +fatr1 equ $0779 +fatr2 equ $077a +faux1 equ $0782 +faux2 equ $0783 +faux3 equ $0784 +faux4 equ $0785 +faux5 equ $0786 + +; Stale adresy - pojedynczy zapis katalogu +dirbuf equ $0789 +dirfatr equ dirbuf +dirf1sec equ dirbuf+1 +dirflen equ dirbuf+3 +dirfname equ dirbuf+6 +dirfdate equ dirbuf+17 +dirftime equ dirbuf+20 + +; zmienne na stronie zerowej +edited_file_addr equ $80 ; adres w pamieci RAM obecnie edytowanego zapisu, obliczony z buffer o edited_file +print_addr equ $82 ; adres w pamieci ekranu, do ktorego zapisujemy. + + +; Poczatek kodu relokowalnego + blk reloc main +; Tutaj kod relokowalny, Sparta zaladuje go powyzej swojego MEMLO +; i po zaladowaniu oraz relokacji adresow, podniesie MEMLO za ten blok +; czyli w programie mozna jako bufora roboczy zajac obszar od MEMLO do HIMEM + +start + jsr printf + .BYTE 125,'MSINI Lite4 (c) 2010-08-31',$9b,0 + jsr u_getpar ; pobranie kolejnego parametru + jsr getcwd ; jesli parametrem byl podkatalog to go obrobi a jesli go nie bylo to poda bierzacy + ; co wazne SPARWDZA czy ten katalog jest i jesli nie wychodzi z odpowiednim bledem ! + lda device + tax + and #%11110000 ; sprawdzamy czy podana (lub nie) sciezka dotyczy napedu dyskow + bne not_disc_drive + dex + txa + clc + adc #'A' + sta ourpath + ; robimy sciezke + ldx #$00 + ; przepisujemy z pobranej do naszej +path_loop1 + lda path,x + sta ourpath+2,x + beq end_of_path + inx + bne path_loop1 +end_of_path + ; na koniec uzupelniamy o '\', znak konca linii o 0 (dla pewnosci dla printf) + lda #'\' + sta ourpath+2,x + inx + lda #$9b + sta ourpath+2,x + inx + lda #$00 + sta ourpath+2,x + inx + stx ourpath_end ; zapamietajmy gdzie konczy sie sciezka - tu bedzie dopisywana nazwa pliku +not_disc_drive +; wyliczmy na ile zapisow mamy miejsce w pamieci + ; od memtopa odjac memlona + sbw MEMTOP MEMLO buffer ; tymczasowo w max_flies, bo trzeba to podzielic przez dlugosc wpisu - 47 + ; no i jak to podzielic.... ??? + ; a wezmy poprostu poodejmujmy w petli .... :) + mwa #0 max_files ; zerujmy licznik plikow +count_free_files + sbw buffer #47 buffer + bcc end_memory + inw max_files + jmp count_free_files +end_memory + jsr printf + .BYTE 'MEMLO: $%4x , MEMTOP: $%4x',$9b,'FREE MEMORY FOR $%4x FILES.',$9b,0 + .WORD MEMLO,MEMTOP,max_files + jsr printf + .BYTE 'Reading directory: ' + .BYTE '%s',$9b,0 + .WORD ourpath + ; parametry '*' na standardowe + jsr set_default_params + +; ----- czytamy katalog zliczajac pliki i umieszczajac ich nazwy w pamieci ----- + +; to przeczytajmy katalog procedurami SDX + ; najpierw dopiszmy maske + ldx ourpath_end + ldy #$00 +make_search_patch + lda searchmask,y + sta ourpath,x + beq spath_ready + inx + iny + bne make_search_patch +spath_ready + mwa Pourpath file_p + ; maska artybutów - tylko nieukryte ($20) + lda #$20 + sta fatr1 + ; licznik plikow na 00 + mwa #0 num_of_files + ; czytamy pierwszy wpis + jsr ffirst + bmi directory_end + bpl dir_entry_in_buf ; od razu obrabiamy +get_next_dir_entry + ; czytamy kolejne wpisy + jsr fnext + bmi directory_end +dir_entry_in_buf + ; tu mamy w 'dirbuf' pojedynczy zapis - trzeba cos z nim zrobic + ; sprawdzmy czy to nie MSDOS + ldx #$07 +check_next1 + lda dirfname,x + cmp MSDOSname,x + bne not_msdos + dex + bpl check_next1 + bmi get_next_dir_entry +not_msdos + ; tu wiemy juz ze plik nie nazywa sie MSDOS.* + ; printujemy kropke.... + jsr printf + .BYTE '.',0 + ; wyznaczamy adres w buforze + mwa num_of_files edited_file_nr + jsr set_edit_addr + ; mamy adres przepisujemy wiec nazwe pliku + ldy #0 +name_to_mem_loop + lda dirfname,y + sta (edited_file_addr),y + iny + cpy #11 + bne name_to_mem_loop + ; reszte dopelnamy spacjami + lda #' ' +spaces_fill + sta (edited_file_addr),y + iny + cpy #47 + bne spaces_fill + ; sprawdzmy czy to przypadkiem nie katalog i jesli tak dopiszmy na koncu + lda dirfatr + and #$20 + beq not_DIR + ; dopisujemy na koncu tekstu + ldy #46 + ldx #5 +DIRmark_set + lda DIRmark,x + sta (edited_file_addr),y + dey + dex + bpl DIRmark_set +not_DIR + inw num_of_files ; zwiekszamy licznik plikow + jmp get_next_dir_entry +directory_end + jsr fclose + jsr printf + .BYTE $9b,'FILES IN DIR: $%4x.',$9b,0 + .WORD num_of_files + +; ----- sprawdzamy czy jest plik MSDOS.DAT ----- + + ; najpierw dopiszmy nazwe do sciezki + ldx ourpath_end + ldy #$00 +make_dat_patch + lda datname,y + sta ourpath,x + beq dat_path_ready + inx + iny + bne make_dat_patch +dat_path_ready + mwa Pourpath file_p + ; maska artybutów - tylko nieukryte ($20) + lda #$20 + sta fatr1 + ; czytamy pierwszy wpis + jsr ffirst + bpl dat_file_found + jsr fclose + jmp start_edit + +; ----- jest plik MSDOS.DAT - czytamy go ----- + +dat_file_found + jsr fclose ; zamykamy czytanie katalogu + jsr printf + .BYTE 'MSDOS.DAT found.',$9b,'Reading descriptions',$9b,$0 + ; czyli przygotowujemy otwarcie pliku do odczytu + mwa Pourpath file_p + ; tryb otwarcia - odczyt + lda #$04 + sta fmode + ; maska artybutów - tylko nieukryte ($20) i niekatalogi ($80) + lda #$A0 + sta fatr1 + ; i otwieramy plik + jsr fopen + + ; plik otwarty - petla czytajaca dane tu sie zaczyna +read_block + mwa Pone_buffer faux1 ; adres bufora + mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu) + jsr fread + bmi end_dat_file + ; printujemy kropke.... + jsr printf + .BYTE '.',0 + ; sprawdzmy czy nie gwiazdka + lda one_buffer + cmp #'*' + beq asterix_found + ; jesli nie gwiazdka to rozpoczynamy petle szukania + mwa #0 edited_file_nr +search_names1 + jsr set_edit_addr + ; porownajmy filenama + ldy #10 +compare_names1 + lda (edited_file_addr),y + cmp one_buffer,y + bne check_next_name1 + dey + bpl compare_names1 + ; nazwy takie same - przepiszmy calosc (poza znacznikiem katalogu, bo on juz jest) + ldy #45 +long_name_from_DAT + lda one_buffer,y + sta (edited_file_addr),y + dey + bpl long_name_from_DAT +check_next_name1 + inw edited_file_nr + cpw num_of_files edited_file_nr + bne search_names1 ; jesli edited jest mniejszy lub rowny num_files + beq read_block +asterix_found + ; jesli gwiazdka to przepisujemy 'opis' do specjalnego bufora + ldy #34 +get_asterix_params + lda one_buffer+11,y + sta current_params,y + dey + bpl get_asterix_params + bmi read_block ; i czytamy dalej... +end_dat_file + jsr fclose +; ----- przygotowujemy ekran edycji ----- + +start_edit + jsr DAT_file_write +stop + jmp stop + rts + +; procedura zapisu pliku DAT +DAT_file_write + ; przygotowujemy otwarcie pliku do zapisu + mwa Pourpath file_p + ; tryb otwarcia - zapis + lda #$08 + sta fmode + ; maska artybutów - tylko nieukryte ($20) i niekatalogi ($80) + lda #$A0 + sta fatr1 + lda #$00 + sta fatr2 + ; i otwieramy plik + jsr fopen + ; plik otwarty do zapisu + ; na poczatek sprawdzamy czy trzeba zapisac parametry kolorow itp.... + ldy#34 +check_standard_params + lda current_params,y + cmp standard_params,y + bne asterix_write + dey + bpl check_standard_params + bmi asterix_standard +asterix_write + mwa Pasterix_data faux1 ; adres bufora + mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu - bo go nie zapisujemy) + jsr fwrite +asterix_standard + mwa #0 edited_file_nr + ; petla zapisujaca dane tu sie zaczyna +write_block + ; sprawdzmy czy nazwa nie jest pusta + jsr set_edit_addr + ; porownajmy filenama ze spacjemi + ldy #11 +compare_names2 + lda (edited_file_addr),y + cmp #' ' + bne name_not_empty1 + iny + cpy #46 + bne compare_names2 + beq next_name_to_write +name_not_empty1 + ; nazwa nie jest pusta wyprintowujemy ja wiec do pliku, ale nie tak latwo + ; najpierw przepiszmy do podrecznego bufora (bez znacznika katalogu) + ldy #45 +name_to_buff + lda (edited_file_addr),y + sta one_buffer,y + dey + bpl name_to_buff + ; i zapisujemy tem buforek + mwa Pone_buffer faux1 ; adres bufora + mwa #46 faux4 ; dlugosc bufora (bez znacznika katalogu) + jsr fwrite +next_name_to_write + inw edited_file_nr + cpw num_of_files edited_file_nr + bne write_block ; jesli edited jest mniejszy +end_dat_write + jsr fclose + rts + + +; procedura obliczajaca na podstawie numeru zapisu +; jego adres w pamieci RAM +set_edit_addr + ; trzeba pomnozyc edited_file_nr przez dlugosc zapisu (46) i dodac adres bufora + ; od razu robimy dodawanie, czyli do wyniku nie zero tylko adres bufora!!! + mwa Pbuffer edited_file_addr + mwa edited_file_nr word1 ; w word1 mnozna (2 bajty) + lda #47 + sta word2 ; w word2 mnoznik (1 bajt) + ldy #8 ; mnozymy przez 8 bitow - word2 (choc wlasciwie mniej mozna) + clc +mulloop1 + lsr word2 + bcc mull_no_c + adw edited_file_addr word1 +mull_no_c + asl word1 + rol word1+1 + dey + bne mulloop1 + rts + +; ustawienie parametrow dodatkowych folderu (gwiazdka) na standardowe +set_default_params + ldy #34 +setting_def_par + lda standard_params,y + sta current_params,y + dey + bpl setting_def_par + rts + +; procedura zmiany znaku w akumulatorze z ATASCII na EKRANOWY (uwzglednia inwers wiec jest dziwna) +atascii2internal + asl @ + php + cmp #$c0 + bcs internal_OK + sbc #$3f + bcs internal_OK + adc #$c0 +internal_OK + plp + ror @ + rts + +; zmienne programu +standard_params + .BYTE 'CAC4C401 ' ; standardowe parametry dla '*' +Pasterix_data DTA V(asterix_data) +asterix_data + .BYTE '* ' +current_params + .BYTE ' ' ; miejsce na edytowane parametry +DIRmark + .BYTE '>',$00 ; koncowka dlugiej nazwy i znacznik katalogu za nia (jesli to katalog) +searchmask + .BYTE '*.*',$9b,$00 +datname + .BYTE 'MSDOS.DAT',$9b,$00 +MSDOSname + .BYTE 'MSDOS ',$00 +Pourpath DTA V(ourpath) ; wskaznik na ourpath (potrzebne by wiedziec gdzie bedzie po relokacji) +ourpath + .BYTE 'A:\ ' +ourpath_end + .BYTE $00 ; offset konca sciezki wskazuje na pierwszy znak po '\' +edited_file_nr + .WORD $0000 ; numer aktualnie edytowanego zapisu (do obliczenia offsetu) +max_files + .WORD $0000 +num_of_files + .WORD $0000 +first_on_screen + .WORD $0000 ; numer pierwszego zapisu wyswietlanego na ekranie (offset) +word1 + .WORD $0000 ; zmienna pomocnicza do mnozenia itp... +word2 + .WORD $0000 ; druga zmienna pomocnicza +Pone_buffer DTA V(one_buffer) +one_buffer + .BYTE ' ' +Pbuffer DTA V(buffer) +buffer + .BYTE $0000 ; adres bufora + +; na koncu automatyczne wygenerowanie bloku zawierajacego adresy do relokacji + blk update address + blk update symbol diff --git a/msini4.obx b/msini4.obx new file mode 100755 index 0000000..bdb7145 Binary files /dev/null and b/msini4.obx differ diff --git a/old_versions/msdos30.s65 b/old_versions/msdos30.s65 new file mode 100644 index 0000000..3b56ddd --- /dev/null +++ b/old_versions/msdos30.s65 @@ -0,0 +1,1566 @@ + ;MICRO SPARTA DOS 3.0s + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + *=$1FFD + .OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +BOOT = $09 +DOSVEC = $0a +DOSINI = $0c +APPMHI = $0e + +IRQENS = $10 + +ICBALZ = $24 +ICBAHZ = $25 +ICPTLZ = $26 +ICPTHZ = $27 +ICBLLZ = $28 +ICBLHZ = $29 + + +CheckSUM = $30 +SecLen = $31 +SecBuffer = $32 +CRETRYZ = $34 +TransmitError =$35 +Looperka = $36 +StackCopy = $37 + + +SAVMSC = $58 + +; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego +; katalog +CurrentDirBuf = $CA +; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +VSERIN = $020a + +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 + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + +offset1 = movedproc-$0700 +offset2 = TopDriveMovedProc-$0a00 +START + JMP mainprog ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) +movedproc +data00 + .WORD $0000 ;2000 00 00 +label17 + TXA ;2002 8A + PHA ;2003 48 + LDA ICBLHZ ;2004 A5 29 + PHA ;2006 48 + JSR [label08-offset1] ;2007 20 82 07 + PLA ;200A 68 + STA ICBLHZ ;200B 85 29 + PLA ;200D 68 + TAX ;200E AA +label31 + LDA [blokDanychIO1-offset1]+8 ;200F AD B4 07 + STA ICBLLZ ;2012 85 28 + JSR [label09-offset1] ;2014 20 77 07 + AND ICBALZ ;2017 25 24 + CMP #$FF ;2019 C9 FF + BNE label10 ;201B D0 03 + JSR [label09-offset1] ;201D 20 77 07 +label10 + JSR [label11-offset1] ;2020 20 C9 07 + SBC ICBALZ ;2023 E5 24 + EOR #$FF ;2025 49 FF + STA ICPTLZ ;2027 85 26 + PHP ;2029 08 + JSR [label11-offset1] ;202A 20 C9 07 + PLP ;202D 28 + SBC ICBAHZ ;202E E5 25 + EOR #$FF ;2030 49 FF + STA ICPTHZ ;2032 85 27 + SEC ;2034 38 +WhatIsIt + BCS label12 ;2035 B0 0D ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y ktory tylko wylacza skok !!! + DEC [WhatIsIt-offset1] ;2037 CE 35 07 ; Przywraca poprzednia postac BCS z poprzedniego wiersza!! + LDA ICBALZ ;203A A5 24 ; Czyli TO wykona sie tylko RAZ + STA $02E0 ;203C 8D E0 02 ; Wpisujac adres startu programu jako adres pierwszego bloku + LDA ICBAHZ ;203F A5 25 ; na wypadek gdyby plik nie konczyl sie blokiem + STA $02E1 ;2041 8D E1 02 ; z adresem startu (bywa i tak). +label12 + LDA #<[Jrts-offset1] ;2044 A9 D6 + STA $02E2 ;2046 8D E2 02 + LDA #>[Jrts-offset1] ;2049 A9 07 + STA $02E3 ;204B 8D E3 02 + LDY #$00 ;204E A0 00 +label16 + INC ICBLHZ ;2050 E6 29 + BEQ label13 ;2052 F0 19 + CPX ICBLLZ ;2054 E4 28 + BEQ label14 ;2056 F0 1A + LDA [data01-offset1],X ;2058 BD 00 08 + INX ;205B E8 +label19 + STA (ICBALZ),Y ;205C 91 24 + INY ;205E C8 + BNE label15 ;205F D0 02 + INC ICBAHZ ;2061 E6 25 +label15 + INC ICPTLZ ;2063 E6 26 + BNE label16 ;2065 D0 E9 + INC ICPTHZ ;2067 E6 27 + BNE label16 ;2069 D0 E5 + BEQ label17 ;206B F0 95 +label13 + JSR [label18-offset1] ;206D 20 B6 07 + BCS label19 ;2070 B0 EA +label14 + JSR [label20-offset1] ;2072 20 D7 07 + BCS label19 ;2075 B0 E5 +label09 + JSR [label11-offset1] ;2077 20 C9 07 + STA ICBALZ ;207A 85 24 + JSR [label11-offset1] ;207C 20 C9 07 + STA ICBAHZ ;207F 85 25 + RTS ;2081 60 +label08 + JMP ($02E2) ;2082 6C E2 02 +label21 + JMP JTESTROM ;2085 4C 71 E4 +label25 + LDX #$09 ;2088 A2 09 + .BYTE $2c ; rozkaz BIT powodujacy ominiecie nastepnyc dwoch bajtow ... +label26 + LDX #$08 ;208B A2 08 + STX [blokDanychIO1-offset1]+5 ;208D 8E B1 07 + STY DAUX1 ;2090 8C 0A 03 + STA DAUX2 ;2093 8D 0B 03 + ORA DAUX1 ;2096 0D 0A 03 + BEQ label21 ;2099 F0 EA +label99 + LDX #$09 ;209B A2 09 +label22 + LDA [blokDanychIO1-offset1],X ;209D BD AC 07 + STA DDEVIC,X ;20A0 9D 00 03 + DEX ;20A3 CA + BPL label22 ;20A4 10 F7 +SioJMP + JSR JSIOINT ;20A6 20 59 E4 + BMI label99 ;20A9 30 F0 + RTS ;20AB 60 +blokDanychIO1 ;20AC + .BYTE $31,$01,$52,$40,$00,$08,$0A,$00,$80,$00 +label18 + INC [data00-offset1] ;20B6 EE 00 07 + BNE label23 ;20B9 D0 12 + INC [data00-offset1]+1 ;20BB EE 01 07 + BNE label23 ;20BE D0 0D + LDA #>[JTESTROM-1] ;20C0 A9 E4 + PHA ;20C2 48 + LDA #<[JTESTROM-1] ;20C3 A9 70 + PHA ;20C5 48 + JMP ($02E0) ;20C6 6C E0 02 +label11 + INC ICBLHZ ;20C9 E6 29 + BEQ label18 ;20CB F0 E9 +label23 + CPX ICBLLZ ;20CD E4 28 + BEQ label20 ;20CF F0 06 +label27 + LDA [data01-offset1],X ;20D1 BD 00 08 + INX ;20D4 E8 + SEC ;20D5 38 +Jrts + RTS ;20D6 60 +label20 + TYA ;20D7 98 + PHA ;20D8 48 + LDX $0902 ;20D9 AE 02 09 + CPX ICBLLZ ;20DC E4 28 + BNE label24 ;20DE D0 0B + LDY $0900 ;20E0 AC 00 09 + LDA $0901 ;20E3 AD 01 09 + JSR [label25-offset1] ;20E6 20 88 07 + LDX #$04 ;20E9 A2 04 +label24 + LDA $0900,X ;20EB BD 00 09 + TAY ;20EE A8 + LDA $0901,X ;20EF BD 01 09 + INX ;20F2 E8 + INX ;20F3 E8 + STX $0902 ;20F4 8E 02 09 + JSR [label26-offset1] ;20F7 20 8B 07 + PLA ;20FA 68 + TAY ;20FB A8 + LDX #$00 ;20FC A2 00 + BEQ label27 ;20FE F0 D1 +data01 + .WORD $0000 ;2100 00 00 +LoadStart + LDY MEMLO ;2102 AC E7 02 + LDA MEMLO+1 ;2105 AD E8 02 + STA [label28-offset1]+2 ;2108 8D 0F 08 +label29 + LDA #$00 ;210B A9 00 +label28 + STA $0900,Y ;210D 99 00 09 + INY ;2110 C8 + BNE label28 ;2111 D0 FA + INC [label28-offset1]+2 ;2113 EE 0F 08 + LDA [label28-offset1]+2 ;2116 AD 0F 08 + CMP MEMTOP+1 ;2119 CD E6 02 + BCC label29 ;211C 90 ED + LDA MEMTOP+1 ;211E AD E6 02 + STA [label30-offset1]+2 ;2121 8D 2B 08 + LDY MEMTOP ;2124 AC E5 02 + LDA #$00 ;2127 A9 00 +label30 + STA $8000,Y ;2129 99 00 80 + DEY ;212C 88 + CPY #$FF ;212D C0 FF + BNE label30 ;212F D0 F8 + LDA [data01-offset1]+1 ;2131 AD 01 08 + LDY [data01-offset1] ;2134 AC 00 08 + JSR [label25-offset1] ;2137 20 88 07 + LDA #$04 ;213A A9 04 + STA $0902 ;213C 8D 02 09 + LDA [data02-offset1] ;213F AD 52 08 + STA ICBLHZ ;2142 85 29 + LDA #$FF ;2144 A9 FF + STA KBCODES ;2146 8D FC 02 + INC [WhatIsIt-offset1] ;2149 EE 35 07 !!!!!!!!! Miejmy nadzieje ze to sie nie wykonuje, ale chyba jednak tak! + LDX [blokDanychIO1-offset1]+8 ;214C AE B4 07 + JMP [label31-offset1] ;214F 4C 0F 07 +data02 + .BYTE $00 ;2152 00 +CzyTopDrive + .BYTE $00 ; Jesli >0 to transmisja w trybie TopDrive ;2153 00 00 +;CzySpeedy +; .byte $00 ; To samo dla trybu Speedy/HDI +CzyHappyUS + .BYTE $00 ; To samo dla Happy i US-Doubler +; Rozkaz DCB odczytujacy blok PERCOM (12b) pod $2900 +blokDanychIO2 + .BYTE $31,$01,$4E,$40 + .WORD FirstSectorBuff + .BYTE$07,$00,$0C,$00 ;2155 31 01 + ORA ($00,X) ;215F 01 00 +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F ;2161 29 0F + ORA #$30 ;2163 09 30 + CMP #$3A ;2165 C9 3A + BCC labelka ;2167 90 03 + CLC ;2169 18 + ADC #$07 ;216A 69 07 +labelka + RTS ;216C 60 + +Edriver + .BYTE "E:",$9b ;216D 45 3A +mainprog + LDX #$00 ;2170 A2 00 + JSR CloseX ;2172 20 61 28 + BMI ErrorDisplay ;2175 30 5A + LDX #$00 ;2177 A2 00 + LDA #$03 ;2179 A9 03 + STA ICCMD,X ;217B 9D 42 03 + LDA #$0C ;217E A9 0C + STA ICAX1,X ;2180 9D 4A 03 + STA ICBUFL,X ;2183 9D 48 03 + LDA #$00 ;2186 A9 00 + STA ICAX2,X ;2188 9D 4B 03 + STA ICBUFL+1,X ;218B 9D 49 03 + LDA #Edriver ;2193 A9 21 + STA ICBUFA+1,X ;2195 9D 45 03 + JSR JCIOMAIN ;2198 20 56 E4 + BMI ErrorDisplay ;219B 30 34 + LDA #$C4 ;219D A9 C4 + STA COLPF2S ;219F 8D C6 02 + STA COLBAKS ;21A2 8D C8 02 + LDA #$01 ;21A5 A9 01 + STA CzyTopDrive ;21A7 8D 53 21 +; STA CzySpeedy ;21AA 8D 54 21 + STA CzyHappyUS + LDA SKSTAT ;21AD AD 0F D2 + AND #$08 ;21B0 29 08 + BNE NoRunShift ; czy SHIFT w czasie bootowania ? ;21B2 D0 08 + ; tu jest 0 w A +; STA CzySpeedy ; jesli tak to wylaczamy przyspieszacze. ;21B4 8D 54 21 + STA CzyTopDrive ;21B7 8D 53 21 + STA CzyHappyUS + BEQ ReadMainDir ;21BA F0 52 +; Odczyt bloku PERCOM procedura przeznaczona dla Top Drive (bo znacznik ustawiony) +NoRunShift + LDY #blokDanychIO2 ;21BE A2 21 + JSR Table2DCB ;21C0 20 4D 28 + JSR GoSIO ;21C3 20 18 28 + BPL ReadMainDir ;21C6 10 46 +; jesli PERCOM sie nie odczytal to nie mamy TopDrive + LDA #$00 ;21C8 A9 00 + STA CzyTopDrive ;21CA 8D 53 21 + ;sprawdzamy jeszcze Happy/US-Doubler + LDY #blokDanychIO6 + JSR Table2DCB + JSR JSIOINT + BPL ReadMainDir + ; jezeli predkosc sie nie odczytala to brak Happy/US + ; ustawienie standardowej predkosci + LDA #$28 + STA HappySpeed + LDA #$00 + STA CzyHappyUS + BEQ ReadMainDir ;21CD F0 3F +Error148 + LDY #$94 ;21CF A0 94 +ErrorDisplay + TYA ;21D1 98 + PHA ;21D2 48 + JSR Close1 ;21D3 20 5F 28 + PLA ;21D6 68 + PHA ;21D7 48 + LSR A ;21D8 4A + LSR A ;21D9 4A + LSR A ;21DA 4A + LSR A ;21DB 4A + JSR bin2AsciiHex ;21DC 20 61 21 + STA ErrorNumHex ;21DF 8D F8 21 + PLA ;21E2 68 + JSR bin2AsciiHex ;21E3 20 61 21 + STA ErrorNumHex+1 ;21E6 8D F9 21 + JSR PrintXY ;21E9 20 88 27 + .BYTE $00,$00 ;21EC 00 + ;21ED 00 + .BYTE $7d ;21EE 7D 45 52 + .BYTE "ERROR - $" +ErrorNumHex + .BYTE "00",$00 ;21F8 30 + ;21F9 30 00 + LDA #$FF ;21FB A9 FF + STA KBCODES ;21FD 8D FC 02 +WaitKloop + LDX KBCODES ;2200 AE FC 02 + INX ;2203 E8 + BEQ WaitKloop ;2204 F0 FA + LDA #$FF ;2206 A9 FF + STA KBCODES ;2208 8D FC 02 + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie prechodzimy na D1 + LDA #$01 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ;220B 4C 70 21 +ReadMainDir + LDX #>FirstSectorBuff ;220E A2 29 + LDY #DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BYTE ":Main Dir. " + .BYTE +$80,"<" + .BYTE ":UP-DIR." + .BYTE $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesni nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA [GameName+12] ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BYTE $01 ;242F 01 +YposGameName + .BYTE $02 +GameKeySymbol + .BYTE "A) " ;2431 41 29 20 +GameName + .BYTE " " ;2434 20 20 20 + .BYTE $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL A ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA data03,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA data03+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS label67 ;2477 B0 35 + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP label02 ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP label71 ;24AB 4C EF 22 +label67 + JSR PrintXY ;24AE 20 88 27 + .BYTE $01,$15 ;24B1 01 15 + .BYTE $1D + .BYTE $00 ;24B3 1D 00 + JSR PrintXY ;24B5 20 88 27 + .BYTE $0E,$15 ;24B8 0E 15 + .BYTE $1D + .BYTE $00 ;24BA 1D 00 + JMP KeyboardProc ;24BC 4C C1 24 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey ;24C1 20 69 28 + PHA ;24C4 48 + LDA SKSTAT ;24C5 AD 0F D2 + AND #$08 ;24C8 29 08 + BNE NoSHIFT ;24CA D0 08 + LDA #$00 ;24CC A9 00 + STA CzyTopDrive ;24CE 8D 53 21 +; STA CzySpeedy ;24D1 8D 54 21 + STA CzyHappyUS +NoSHIFT + PLA ;24D4 68 + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1 + BCC NoNumber + CMP #'9 + BCS NoNumber + SEC + SBC #'0 + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #$41 ; "A" ;24E6 E9 41 + CMP $D9 ;24E8 C5 D9 + BCS KeyboardProc ;24EA B0 D5 + ASL A ;24EC 0A + TAX ;24ED AA + LDA data03,X ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA data03+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + AND #$20 ;24FC 29 20 + BEQ label01 ;24FE F0 15 + LDY #$02 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP label02 ;2509 4C 34 22 +SubDirText + .BYTE "" ;250C 3C +label01 + JSR DiscChangeCheck ;2515 20 B3 28 + BEQ label04 ;2518 F0 03 + JMP ReadMainDir ;251A 4C 0E 22 +label04 + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA data01 ;2521 8D 00 21 + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA data01+1 ;2527 8D 01 21 + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA data02 ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA data00 ;2537 8D 00 20 + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 FF + STA data00+1 ;253F 8D 01 20 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #label06 ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + LDA #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 + LDX #$00 ;2597 A2 00 + LDA #$00 ;2599 A9 00 +ClearLoop1 + STA $0100,X ;259B 9D 00 01 + STA $0400,X ;259E 9D 00 04 + STA $0500,X ;25A1 9D 00 05 + STA $0600,X ;25A4 9D 00 06 + CPX #$80 ;25A7 E0 80 + BCC NoZpage ;25A9 90 02 + STA $00,X ;25AB 95 00 +NoZpage + INX ;25AD E8 + BNE ClearLoop1 ;25AE D0 EB + LDX #$FF ;25B0 A2 FF + TXS ;25B2 9A + JSR label07 ;25B3 20 B9 25 + JMP [LoadStart-offset1] ;25B6 4C 02 08 +label07 + LDA CzyTopDrive ;25B9 AD 53 21 + BEQ NoTopDriveLoader ;25BC F0 11 + LDX #[EndTopDriveProc-TopDriveMovedProc]-1 ;25BE A2 34 +label72 + LDA TopDriveMovedProc,X ;25C0 BD 0C 26 + STA $0A00,X ;25C3 9D 00 0A + DEX ;25C6 CA + BPL label72 ;25C7 10 F7 + LDY #[EndTopDriveProc-TopDriveMovedProc] ;25C9 A0 35 + LDX #$00 ;25CB A2 00 + BEQ label73 ;25CD F0 23 +NoTopDriveLoader +; LDA CzySpeedy ;25CF AD 54 21 +; BEQ NoSpeedyLoader ;25D2 F0 37 +;; Pytanie stacji o dlugosc procedury szybkiej transmisji +; LDY #blokDanychIO3 ;25D6 A2 26 +; JSR Table2DCB ;25D8 20 4D 28 +; JSR JSIOINT ;25DB 20 59 E4 +; BMI NoSpeedyLoader ;25DE 30 2B +;; Wczytanie procedury szybkiej transmisji pod $0a00 +; LDY #blokDanychIO4 ;25E2 A2 26 +; JSR Table2DCB ;25E4 20 4D 28 +; JSR JSIOINT ;25E7 20 59 E4 +; BMI NoSpeedyLoader ;25EA 30 1F +;; Dlugosc procedury szybkiej transmisji do X i Y +; LDY blokDanychIO4+8 ;25EC AC 55 26 +; LDX blokDanychIO4+9 ;25EF AE 56 26 +; jmp label73 +NoSpeedyLoader + LDA CzyHappyUS + BEQ NoHappyLoader + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler +; ldy #blokDanychIO6 +; jsr Table2DCB +; jsr JSIOINT ; "?" +; bmi NoHappyLoader + + LDY #0 + LDX #[$A-1] ;xjsrA - the last +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC #HappyOffset + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + + + + + + + LDX #[EndHappyUSProc-HappyUSMovedProc] +label72x + LDA HappyUSMovedProc-1,X + STA $0A00-1,X + DEX + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA #<[TopDriveMovedProc-offset2] ;2601 A9 00 + STA [SioJMP-offset1]+1 ;2603 8D A7 07 + LDA #>[TopDriveMovedProc-offset2] ;2606 A9 0A + STA [SioJMP-offset1]+2 ;2608 8D A8 07 +NoHappyLoader + RTS ;260B 60 + + +HappyUSMovedProc ; +HappyOffset=[HappyUSMovedProc-$a00] + + LDA DBUFA + STA SecBuffer + LDA DBUFA+1 + STA SecBuffer+1 + + LDA DBYT + STA SecLen + + 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 CheckSum ; ------------------- nie potrzebne !!!!! + STX TransmitError +; pokey init + LDA #$23 +xjsr1 JSR SecTransReg + ; + + + LDA DDEVIC + 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 SecLen + 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 + LDX #4 + +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 +TopDriveMovedProc + LDA VSERIN ;260C AD 0A 02 + STA [OldSerInJmp-offset2]+1 ;260F 8D 33 0A + PHA ;2612 48 + LDA VSERIN+1 ;2613 AD 0B 02 + STA [OldSerInJmp-offset2]+2 ;2616 8D 34 0A + PHA ;2619 48 + LDA DCOMND ;261A AD 02 03 + ORA #$80 ;261D 09 80 + STA DCOMND ;261F 8D 02 03 + LDA #<[NewSerInInterrupt-offset2] ;2622 A9 2D + STA VSERIN ;2624 8D 0A 02 + LDA #>[NewSerInInterrupt-offset2] ;2627 A9 0A + STA VSERIN+1 ;2629 8D 0B 02 + JSR JSIOINT ;262C 20 59 E4 + PLA ;262F 68 + STA VSERIN+1 ;2630 8D 0B 02 + PLA ;2633 68 + STA VSERIN ;2634 8D 0A 02 + TYA ;2637 98 + RTS ;2638 60 +NewSerInInterrupt + LDA #$10 ;2639 A9 10 + STA AUDF3 ;263B 8D 04 D2 +OldSerInJmp + JMP $FFFF ;263E 4C FF FF +EndTopDriveProc +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 +; Rozkazy DCB do wszytania procedury turbo dla Speedy/HDI + .BYTE $31,$01,$3f,$40 + .WORD HappySpeed + .BYTE $07,$00,$01,$00,$00,$0A +;blokDanychIO3 +; .byte $31,$01,$68,$40 ;2641 31 01 +; .word [blokDanychIO4+8] +; .byte $07,$00,$02,$00,$00,$0A +;blokDanychIO4 +; .byte $31,$01,$69,$40,$00,$0A,$07,$00,$01,$00,$00,$0A ;264D 31 01 +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ;2666 20 B3 28 + BEQ label76 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +label76 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BYTE $31,$01,$52,$40 + .WORD DirMapSectorBuff + .BYTE $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BYTE $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL A ;279B 0A + ASL A ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL A ;27A0 0A + ASL A ;27A1 0A + ROL $DF ;27A2 26 DF + ASL A ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio ze sprawdzeniem czy nie TopDrive i odpowiedna modyfikacja +; procedury +GoSIO + LDA CzyTopDrive ;2818 AD 53 21 + BNE label95 ;281B D0 03 + LDA CzyHappyUS + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +label95 +; Obsluga trybu TopDrive (XF)... + LDA VSERIN ;2820 AD 0A 02 + STA OldSerInJmp+1 ;2823 8D 3F 26 + PHA ;2826 48 + LDA VSERIN+1 ;2827 AD 0B 02 + STA OldSerInJmp+2 ;282A 8D 40 26 + PHA ;282D 48 + LDA DCOMND ;282E AD 02 03 + ORA #$80 ;2831 09 80 + STA DCOMND ;2833 8D 02 03 + LDA #NewSerInInterrupt ;283B A9 26 + STA VSERIN+1 ;283D 8D 0B 02 + JSR JSIOINT ;2840 20 59 E4 + PLA ;2843 68 + STA VSERIN+1 ;2844 8D 0B 02 + PLA ;2847 68 + STA VSERIN ;2848 8D 0A 02 + TYA ;284B 98 + RTS ;284C 60 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BYTE "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 +; Ustawia numer satcji wg A +SeTDriveNR + CLC + ADC #$30 + STA blokDanychIO1 + STA blokDanychIO2 +; sta blokDanychIO3 +; sta blokDanychIO4 + STA blokDanychIO5 + STA blokDanychIO6 + CLC + ADC #['0+$80-$30] + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BYTE $08,$00 +DriveDisp2 + .BYTE +$80,"1" + .BYTE $00 + RTS + +xjsrTableL + .BYTE <[xjsr1+1],<[xjsr2+1],<[xjsr3+1],<[xjsr4+1],<[xjsr5+1] + .BYTE <[xjsr6+1],<[xjsr7+1],<[xjsr8+1],<[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BYTE >[xjsr1+1],>[xjsr2+1],>[xjsr3+1],>[xjsr4+1],>[xjsr5+1] + .BYTE >[xjsr6+1],>[xjsr7+1],>[xjsr8+1],>[xjsr9+1],>[xjsrA+1] + + +data03 + *=*+$30 +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; tutaj sektor katalogu + .BYTE "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + *=$02e0 + .WORD START ;02E0 FD 1F + + .OPT List \ No newline at end of file diff --git a/old_versions/msdos31.s65 b/old_versions/msdos31.s65 new file mode 100644 index 0000000..731a80e --- /dev/null +++ b/old_versions/msdos31.s65 @@ -0,0 +1,1570 @@ + ;MICRO SPARTA DOS 3.0s + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + *=$1FFD + .OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +BOOT = $09 +DOSVEC = $0a +DOSINI = $0c +APPMHI = $0e + +IRQENS = $10 + +ICBALZ = $24 +ICBAHZ = $25 +ICPTLZ = $26 +ICPTHZ = $27 +ICBLLZ = $28 +ICBLHZ = $29 + + +CheckSUM = $30 +SecLen = $31 +SecBuffer = $32 +CRETRYZ = $34 +TransmitError =$35 +Looperka = $36 +StackCopy = $37 + + +SAVMSC = $58 + +; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego +; katalog +CurrentDirBuf = $CA +; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +VSERIN = $020a + +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 + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + +offset1 = movedproc-$0700 +offset2 = TopDriveMovedProc-$0a00 +START + JMP mainprog ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) +movedproc +data00 + .WORD $0000 ;2000 00 00 +label17 + TXA ;2002 8A + PHA ;2003 48 + LDA ICBLHZ ;2004 A5 29 + PHA ;2006 48 + JSR [label08-offset1] ;2007 20 82 07 + PLA ;200A 68 + STA ICBLHZ ;200B 85 29 + PLA ;200D 68 + TAX ;200E AA +label31 + LDA [blokDanychIO1-offset1]+8 ;200F AD B4 07 + STA ICBLLZ ;2012 85 28 + JSR [label09-offset1] ;2014 20 77 07 + AND ICBALZ ;2017 25 24 + CMP #$FF ;2019 C9 FF + BNE label10 ;201B D0 03 + JSR [label09-offset1] ;201D 20 77 07 +label10 + JSR [label11-offset1] ;2020 20 C9 07 + SBC ICBALZ ;2023 E5 24 + EOR #$FF ;2025 49 FF + STA ICPTLZ ;2027 85 26 + PHP ;2029 08 + JSR [label11-offset1] ;202A 20 C9 07 + PLP ;202D 28 + SBC ICBAHZ ;202E E5 25 + EOR #$FF ;2030 49 FF + STA ICPTHZ ;2032 85 27 + SEC ;2034 38 +WhatIsIt + BCS label12 ;2035 B0 0D ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y ktory tylko wylacza skok !!! + DEC [WhatIsIt-offset1] ;2037 CE 35 07 ; Przywraca poprzednia postac BCS z poprzedniego wiersza!! + LDA ICBALZ ;203A A5 24 ; Czyli TO wykona sie tylko RAZ + STA $02E0 ;203C 8D E0 02 ; Wpisujac adres startu programu jako adres pierwszego bloku + LDA ICBAHZ ;203F A5 25 ; na wypadek gdyby plik nie konczyl sie blokiem + STA $02E1 ;2041 8D E1 02 ; z adresem startu (bywa i tak). +label12 + LDA #<[Jrts-offset1] ;2044 A9 D6 + STA $02E2 ;2046 8D E2 02 + LDA #>[Jrts-offset1] ;2049 A9 07 + STA $02E3 ;204B 8D E3 02 + LDY #$00 ;204E A0 00 +label16 + INC ICBLHZ ;2050 E6 29 + BEQ label13 ;2052 F0 19 + CPX ICBLLZ ;2054 E4 28 + BEQ label14 ;2056 F0 1A + LDA [data01-offset1],X ;2058 BD 00 08 + INX ;205B E8 +label19 + STA (ICBALZ),Y ;205C 91 24 + INY ;205E C8 + BNE label15 ;205F D0 02 + INC ICBAHZ ;2061 E6 25 +label15 + INC ICPTLZ ;2063 E6 26 + BNE label16 ;2065 D0 E9 + INC ICPTHZ ;2067 E6 27 + BNE label16 ;2069 D0 E5 + BEQ label17 ;206B F0 95 +label13 + JSR [label18-offset1] ;206D 20 B6 07 + BCS label19 ;2070 B0 EA +label14 + JSR [label20-offset1] ;2072 20 D7 07 + BCS label19 ;2075 B0 E5 +label09 + JSR [label11-offset1] ;2077 20 C9 07 + STA ICBALZ ;207A 85 24 + JSR [label11-offset1] ;207C 20 C9 07 + STA ICBAHZ ;207F 85 25 + RTS ;2081 60 +label08 + JMP ($02E2) ;2082 6C E2 02 +label21 + JMP JTESTROM ;2085 4C 71 E4 +label25 + LDX #$09 ;2088 A2 09 + .BYTE $2c ; rozkaz BIT powodujacy ominiecie nastepnyc dwoch bajtow ... +label26 + LDX #$08 ;208B A2 08 + STX [blokDanychIO1-offset1]+5 ;208D 8E B1 07 + STY DAUX1 ;2090 8C 0A 03 + STA DAUX2 ;2093 8D 0B 03 + ORA DAUX1 ;2096 0D 0A 03 + BEQ label21 ;2099 F0 EA +label99 + LDX #$09 ;209B A2 09 +label22 + LDA [blokDanychIO1-offset1],X ;209D BD AC 07 + STA DDEVIC,X ;20A0 9D 00 03 + DEX ;20A3 CA + BPL label22 ;20A4 10 F7 +SioJMP + JSR JSIOINT ;20A6 20 59 E4 + BMI label99 ;20A9 30 F0 + RTS ;20AB 60 +blokDanychIO1 ;20AC + .BYTE $31,$01,$52,$40,$00,$08,$0A,$00,$80,$00 +label18 + INC [data00-offset1] ;20B6 EE 00 07 + BNE label23 ;20B9 D0 12 + INC [data00-offset1]+1 ;20BB EE 01 07 + BNE label23 ;20BE D0 0D + LDA #>[JTESTROM-1] ;20C0 A9 E4 + PHA ;20C2 48 + LDA #<[JTESTROM-1] ;20C3 A9 70 + PHA ;20C5 48 + JMP ($02E0) ;20C6 6C E0 02 +label11 + INC ICBLHZ ;20C9 E6 29 + BEQ label18 ;20CB F0 E9 +label23 + CPX ICBLLZ ;20CD E4 28 + BEQ label20 ;20CF F0 06 +label27 + LDA [data01-offset1],X ;20D1 BD 00 08 + INX ;20D4 E8 + SEC ;20D5 38 +Jrts + RTS ;20D6 60 +label20 + TYA ;20D7 98 + PHA ;20D8 48 + LDX $0902 ;20D9 AE 02 09 + CPX ICBLLZ ;20DC E4 28 + BNE label24 ;20DE D0 0B + LDY $0900 ;20E0 AC 00 09 + LDA $0901 ;20E3 AD 01 09 + JSR [label25-offset1] ;20E6 20 88 07 + LDX #$04 ;20E9 A2 04 +label24 + LDA $0900,X ;20EB BD 00 09 + TAY ;20EE A8 + LDA $0901,X ;20EF BD 01 09 + INX ;20F2 E8 + INX ;20F3 E8 + STX $0902 ;20F4 8E 02 09 + JSR [label26-offset1] ;20F7 20 8B 07 + PLA ;20FA 68 + TAY ;20FB A8 + LDX #$00 ;20FC A2 00 + BEQ label27 ;20FE F0 D1 +data01 + .WORD $0000 ;2100 00 00 +LoadStart + LDY MEMLO ;2102 AC E7 02 + LDA MEMLO+1 ;2105 AD E8 02 + STA [label28-offset1]+2 ;2108 8D 0F 08 +label29 + LDA #$00 ;210B A9 00 +label28 + STA $0900,Y ;210D 99 00 09 + INY ;2110 C8 + BNE label28 ;2111 D0 FA + INC [label28-offset1]+2 ;2113 EE 0F 08 + LDA [label28-offset1]+2 ;2116 AD 0F 08 + CMP MEMTOP+1 ;2119 CD E6 02 + BCC label29 ;211C 90 ED + LDA MEMTOP+1 ;211E AD E6 02 + STA [label30-offset1]+2 ;2121 8D 2B 08 + LDY MEMTOP ;2124 AC E5 02 + LDA #$00 ;2127 A9 00 +label30 + STA $8000,Y ;2129 99 00 80 + DEY ;212C 88 + CPY #$FF ;212D C0 FF + BNE label30 ;212F D0 F8 + LDA [data01-offset1]+1 ;2131 AD 01 08 + LDY [data01-offset1] ;2134 AC 00 08 + JSR [label25-offset1] ;2137 20 88 07 + LDA #$04 ;213A A9 04 + STA $0902 ;213C 8D 02 09 + LDA [data02-offset1] ;213F AD 52 08 + STA ICBLHZ ;2142 85 29 + LDA #$FF ;2144 A9 FF + STA KBCODES ;2146 8D FC 02 + INC [WhatIsIt-offset1] ;2149 EE 35 07 !!!!!!!!! Miejmy nadzieje ze to sie nie wykonuje, ale chyba jednak tak! + LDX [blokDanychIO1-offset1]+8 ;214C AE B4 07 + JMP [label31-offset1] ;214F 4C 0F 07 +data02 + .BYTE $00 ;2152 00 +CzyTopDrive + .BYTE $00 ; Jesli >0 to transmisja w trybie TopDrive ;2153 00 00 +;CzySpeedy +; .byte $00 ; To samo dla trybu Speedy/HDI +CzyHappyUS + .BYTE $00 ; To samo dla Happy i US-Doubler +; Rozkaz DCB odczytujacy blok PERCOM (12b) pod $2900 +blokDanychIO2 + .BYTE $31,$01,$4E,$40 + .WORD FirstSectorBuff + .BYTE$07,$00,$0C,$00 ;2155 31 01 + ORA ($00,X) ;215F 01 00 +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F ;2161 29 0F + ORA #$30 ;2163 09 30 + CMP #$3A ;2165 C9 3A + BCC labelka ;2167 90 03 + CLC ;2169 18 + ADC #$07 ;216A 69 07 +labelka + RTS ;216C 60 + +Edriver + .BYTE "E:",$9b ;216D 45 3A +mainprog + LDX #$00 ;2170 A2 00 + JSR CloseX ;2172 20 61 28 + BMI ErrorDisplay ;2175 30 5A + LDX #$00 ;2177 A2 00 + LDA #$03 ;2179 A9 03 + STA ICCMD,X ;217B 9D 42 03 + LDA #$0C ;217E A9 0C + STA ICAX1,X ;2180 9D 4A 03 + STA ICBUFL,X ;2183 9D 48 03 + LDA #$00 ;2186 A9 00 + STA ICAX2,X ;2188 9D 4B 03 + STA ICBUFL+1,X ;218B 9D 49 03 + LDA #Edriver ;2193 A9 21 + STA ICBUFA+1,X ;2195 9D 45 03 + JSR JCIOMAIN ;2198 20 56 E4 + BMI ErrorDisplay ;219B 30 34 + LDA #$C4 ;219D A9 C4 + STA COLPF2S ;219F 8D C6 02 + STA COLBAKS ;21A2 8D C8 02 + LDA #$01 ;21A5 A9 01 + STA CzyTopDrive ;21A7 8D 53 21 +; STA CzySpeedy ;21AA 8D 54 21 + STA CzyHappyUS + LDA SKSTAT ;21AD AD 0F D2 + AND #$08 ;21B0 29 08 + BNE NoRunShift ; czy SHIFT w czasie bootowania ? ;21B2 D0 08 + ; tu jest 0 w A +; STA CzySpeedy ; jesli tak to wylaczamy przyspieszacze. ;21B4 8D 54 21 + STA CzyTopDrive ;21B7 8D 53 21 + STA CzyHappyUS + BEQ ReadMainDir ;21BA F0 52 +; Odczyt bloku PERCOM procedura przeznaczona dla Top Drive (bo znacznik ustawiony) +NoRunShift + LDY #blokDanychIO2 ;21BE A2 21 + JSR Table2DCB ;21C0 20 4D 28 + JSR GoSIO ;21C3 20 18 28 + BPL ReadMainDir ;21C6 10 46 +; jesli PERCOM sie nie odczytal to nie mamy TopDrive + LDA #$00 ;21C8 A9 00 + STA CzyTopDrive ;21CA 8D 53 21 + ;sprawdzamy jeszcze Happy/US-Doubler + LDY #blokDanychIO6 + JSR Table2DCB + JSR JSIOINT + BPL ReadMainDir + ; jezeli predkosc sie nie odczytala to brak Happy/US + ; ustawienie standardowej predkosci + LDA #$28 + STA HappySpeed + LDA #$00 + STA CzyHappyUS + BEQ ReadMainDir ;21CD F0 3F +Error148 + LDY #$94 ;21CF A0 94 +ErrorDisplay + TYA ;21D1 98 + PHA ;21D2 48 + JSR Close1 ;21D3 20 5F 28 + PLA ;21D6 68 + PHA ;21D7 48 + LSR A ;21D8 4A + LSR A ;21D9 4A + LSR A ;21DA 4A + LSR A ;21DB 4A + JSR bin2AsciiHex ;21DC 20 61 21 + STA ErrorNumHex ;21DF 8D F8 21 + PLA ;21E2 68 + JSR bin2AsciiHex ;21E3 20 61 21 + STA ErrorNumHex+1 ;21E6 8D F9 21 + JSR PrintXY ;21E9 20 88 27 + .BYTE $00,$00 ;21EC 00 + ;21ED 00 + .BYTE $7d ;21EE 7D 45 52 + .BYTE "ERROR - $" +ErrorNumHex + .BYTE "00",$00 ;21F8 30 + ;21F9 30 00 + LDA #$FF ;21FB A9 FF + STA KBCODES ;21FD 8D FC 02 +WaitKloop + LDX KBCODES ;2200 AE FC 02 + INX ;2203 E8 + BEQ WaitKloop ;2204 F0 FA + LDA #$FF ;2206 A9 FF + STA KBCODES ;2208 8D FC 02 + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie prechodzimy na D1 + LDA #$01 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ;220B 4C 70 21 +ReadMainDir + LDX #>FirstSectorBuff ;220E A2 29 + LDY #DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BYTE ":Main Dir. " + .BYTE +$80,"<" + .BYTE ":UP-DIR." + .BYTE $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesni nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA [GameName+12] ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BYTE $01 ;242F 01 +YposGameName + .BYTE $02 +GameKeySymbol + .BYTE "A) " ;2431 41 29 20 +GameName + .BYTE " " ;2434 20 20 20 + .BYTE $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL A ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA data03,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA data03+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS label67 ;2477 B0 35 + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP label02 ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP label71 ;24AB 4C EF 22 +label67 + JSR PrintXY ;24AE 20 88 27 + .BYTE $01,$15 ;24B1 01 15 + .BYTE $1D + .BYTE $00 ;24B3 1D 00 + JSR PrintXY ;24B5 20 88 27 + .BYTE $0E,$15 ;24B8 0E 15 + .BYTE $1D + .BYTE $00 ;24BA 1D 00 + JMP KeyboardProc ;24BC 4C C1 24 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey ;24C1 20 69 28 + PHA ;24C4 48 + LDA SKSTAT ;24C5 AD 0F D2 + AND #$08 ;24C8 29 08 + BNE NoSHIFT ;24CA D0 08 + LDA #$00 ;24CC A9 00 + STA CzyTopDrive ;24CE 8D 53 21 +; STA CzySpeedy ;24D1 8D 54 21 + STA CzyHappyUS +NoSHIFT + PLA ;24D4 68 + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1 + BCC NoNumber + CMP #'9 + BCS NoNumber + SEC + SBC #'0 + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #$41 ; "A" ;24E6 E9 41 + CMP $D9 ;24E8 C5 D9 + BCS KeyboardProc ;24EA B0 D5 + ASL A ;24EC 0A + TAX ;24ED AA + LDA data03,X ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA data03+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + AND #$20 ;24FC 29 20 + BEQ label01 ;24FE F0 15 + LDY #$02 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP label02 ;2509 4C 34 22 +SubDirText + .BYTE "" ;250C 3C +label01 + JSR DiscChangeCheck ;2515 20 B3 28 + BEQ label04 ;2518 F0 03 + JMP ReadMainDir ;251A 4C 0E 22 +label04 + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA data01 ;2521 8D 00 21 + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA data01+1 ;2527 8D 01 21 + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA data02 ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA data00 ;2537 8D 00 20 + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 FF + STA data00+1 ;253F 8D 01 20 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #label06 ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + LDA #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 + LDX #$00 ;2597 A2 00 + LDA #$00 ;2599 A9 00 +ClearLoop1 + STA $0100,X ;259B 9D 00 01 + STA $0400,X ;259E 9D 00 04 + STA $0500,X ;25A1 9D 00 05 + STA $0600,X ;25A4 9D 00 06 + CPX #$80 ;25A7 E0 80 + BCC NoZpage ;25A9 90 02 + STA $00,X ;25AB 95 00 +NoZpage + INX ;25AD E8 + BNE ClearLoop1 ;25AE D0 EB + LDX #$FF ;25B0 A2 FF + TXS ;25B2 9A + JSR label07 ;25B3 20 B9 25 + JMP [LoadStart-offset1] ;25B6 4C 02 08 +label07 + LDA CzyTopDrive ;25B9 AD 53 21 + BEQ NoTopDriveLoader ;25BC F0 11 + LDX #[EndTopDriveProc-TopDriveMovedProc]-1 ;25BE A2 34 +label72 + LDA TopDriveMovedProc,X ;25C0 BD 0C 26 + STA $0A00,X ;25C3 9D 00 0A + DEX ;25C6 CA + BPL label72 ;25C7 10 F7 + LDY #[EndTopDriveProc-TopDriveMovedProc] ;25C9 A0 35 + LDX #$00 ;25CB A2 00 + BEQ label73 ;25CD F0 23 +NoTopDriveLoader +; LDA CzySpeedy ;25CF AD 54 21 +; BEQ NoSpeedyLoader ;25D2 F0 37 +;; Pytanie stacji o dlugosc procedury szybkiej transmisji +; LDY #blokDanychIO3 ;25D6 A2 26 +; JSR Table2DCB ;25D8 20 4D 28 +; JSR JSIOINT ;25DB 20 59 E4 +; BMI NoSpeedyLoader ;25DE 30 2B +;; Wczytanie procedury szybkiej transmisji pod $0a00 +; LDY #blokDanychIO4 ;25E2 A2 26 +; JSR Table2DCB ;25E4 20 4D 28 +; JSR JSIOINT ;25E7 20 59 E4 +; BMI NoSpeedyLoader ;25EA 30 1F +;; Dlugosc procedury szybkiej transmisji do X i Y +; LDY blokDanychIO4+8 ;25EC AC 55 26 +; LDX blokDanychIO4+9 ;25EF AE 56 26 +; jmp label73 +NoSpeedyLoader + LDA CzyHappyUS + BEQ NoHappyLoader + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler +; ldy #blokDanychIO6 +; jsr Table2DCB +; jsr JSIOINT ; "?" +; bmi NoHappyLoader + + LDY #0 + LDX #[$A-1] ;xjsrA - the last +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC #HappyOffset + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + + + + + + + LDX #[EndHappyUSProc-HappyUSMovedProc] +label72x + LDA HappyUSMovedProc-1,X + STA $0A00-1,X + DEX + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA #<[TopDriveMovedProc-offset2] ;2601 A9 00 + STA [SioJMP-offset1]+1 ;2603 8D A7 07 + LDA #>[TopDriveMovedProc-offset2] ;2606 A9 0A + STA [SioJMP-offset1]+2 ;2608 8D A8 07 +NoHappyLoader + RTS ;260B 60 + + + +; 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 ; +HappyOffset=[HappyUSMovedProc-$a00] + + LDA DBUFA + STA SecBuffer + LDA DBUFA+1 + STA SecBuffer+1 + + LDA DBYT + STA SecLen + + 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 SecLen + 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 +TopDriveMovedProc + LDA VSERIN ;260C AD 0A 02 + STA [OldSerInJmp-offset2]+1 ;260F 8D 33 0A + PHA ;2612 48 + LDA VSERIN+1 ;2613 AD 0B 02 + STA [OldSerInJmp-offset2]+2 ;2616 8D 34 0A + PHA ;2619 48 + LDA DCOMND ;261A AD 02 03 + ORA #$80 ;261D 09 80 + STA DCOMND ;261F 8D 02 03 + LDA #<[NewSerInInterrupt-offset2] ;2622 A9 2D + STA VSERIN ;2624 8D 0A 02 + LDA #>[NewSerInInterrupt-offset2] ;2627 A9 0A + STA VSERIN+1 ;2629 8D 0B 02 + JSR JSIOINT ;262C 20 59 E4 + PLA ;262F 68 + STA VSERIN+1 ;2630 8D 0B 02 + PLA ;2633 68 + STA VSERIN ;2634 8D 0A 02 + TYA ;2637 98 + RTS ;2638 60 +NewSerInInterrupt + LDA #$10 ;2639 A9 10 + STA AUDF3 ;263B 8D 04 D2 +OldSerInJmp + JMP $FFFF ;263E 4C FF FF +EndTopDriveProc +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 +; Rozkazy DCB do wszytania procedury turbo dla Speedy/HDI + .BYTE $31,$01,$3f,$40 + .WORD HappySpeed + .BYTE $07,$00,$01,$00,$00,$0A +;blokDanychIO3 +; .byte $31,$01,$68,$40 ;2641 31 01 +; .word [blokDanychIO4+8] +; .byte $07,$00,$02,$00,$00,$0A +;blokDanychIO4 +; .byte $31,$01,$69,$40,$00,$0A,$07,$00,$01,$00,$00,$0A ;264D 31 01 +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ;2666 20 B3 28 + BEQ label76 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +label76 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BYTE $31,$01,$52,$40 + .WORD DirMapSectorBuff + .BYTE $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BYTE $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL A ;279B 0A + ASL A ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL A ;27A0 0A + ASL A ;27A1 0A + ROL $DF ;27A2 26 DF + ASL A ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio ze sprawdzeniem czy nie TopDrive i odpowiedna modyfikacja +; procedury +GoSIO + LDA CzyTopDrive ;2818 AD 53 21 + BNE label95 ;281B D0 03 + LDA CzyHappyUS + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +label95 +; Obsluga trybu TopDrive (XF)... + LDA VSERIN ;2820 AD 0A 02 + STA OldSerInJmp+1 ;2823 8D 3F 26 + PHA ;2826 48 + LDA VSERIN+1 ;2827 AD 0B 02 + STA OldSerInJmp+2 ;282A 8D 40 26 + PHA ;282D 48 + LDA DCOMND ;282E AD 02 03 + ORA #$80 ;2831 09 80 + STA DCOMND ;2833 8D 02 03 + LDA #NewSerInInterrupt ;283B A9 26 + STA VSERIN+1 ;283D 8D 0B 02 + JSR JSIOINT ;2840 20 59 E4 + PLA ;2843 68 + STA VSERIN+1 ;2844 8D 0B 02 + PLA ;2847 68 + STA VSERIN ;2848 8D 0A 02 + TYA ;284B 98 + RTS ;284C 60 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BYTE "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 +; Ustawia numer satcji wg A +SeTDriveNR + STA blokDanychIO1+1 + STA blokDanychIO2+1 +; sta blokDanychIO3 +; sta blokDanychIO4 + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #['0+$80] + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BYTE $08,$00 +DriveDisp2 + .BYTE +$80,"1" + .BYTE $00 + RTS + +xjsrTableL + .BYTE <[xjsr1+1],<[xjsr2+1],<[xjsr3+1],<[xjsr4+1],<[xjsr5+1] + .BYTE <[xjsr6+1],<[xjsr7+1],<[xjsr8+1],<[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BYTE >[xjsr1+1],>[xjsr2+1],>[xjsr3+1],>[xjsr4+1],>[xjsr5+1] + .BYTE >[xjsr6+1],>[xjsr7+1],>[xjsr8+1],>[xjsr9+1],>[xjsrA+1] + + +data03 + *=*+$30 +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; tutaj sektor katalogu + .BYTE "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + *=$02e0 + .WORD START ;02E0 FD 1F + + .OPT List \ No newline at end of file diff --git a/old_versions/msdos33.s65 b/old_versions/msdos33.s65 new file mode 100644 index 0000000..a2c9b4f --- /dev/null +++ b/old_versions/msdos33.s65 @@ -0,0 +1,1635 @@ + ;MICRO SPARTA DOS 3.0s + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + *=$1FFD + .OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 + + +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) +BootSHIFT = START-1 + +VSERIN = $020a + +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 + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = TopDriveMovedProc-$0a00 +; 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 = FirstMapSectorNr - offset1 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) +movedproc +; 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 + .WORD $0000 +FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + TXA + PHA + LDA ToFileEndL + PHA + JSR [GoInitAddr-offset1] + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA [SecLen-offset1] + STA SecLenZ + JSR [FileGetBlockStart-offset1] ; pobranie dwoch bajtow (adres poczatku bloku) + AND InBlockAddr + CMP #$FF ; jesli oba sa $FF to..... + BNE FileNoFFFFHead + JSR [FileGetBlockStart-offset1] ; pobranie jeszcze raz +FileNoFFFFHead + JSR [FileGetByte-offset1] ; 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-offset1] ; 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-offset1] ; 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-offset1] ; do adresu inicjacji wpisanie adresu rozkazu RTS + STA $02E2 ; bo po kazdym bloku odbywa sie tam skok + LDA #>[Jrts-offset1] ; 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 SecLenZ ; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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-offset1] ; 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-offset1] + BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +FileGetBlockStart + JSR [FileGetByte-offset1] + STA InBlockAddr + JSR [FileGetByte-offset1] + STA InBlockAddr+1 + RTS +GoInitAddr + JMP ($02E2) +GoSelfTest + JMP JTESTROM +GetMapSector + LDX #>FileMapBuff + .BYTE $2c ; rozkaz BIT powodujacy ominiecie nastepnyc dwoch bajtow ... +GetDataSector + LDX #>FileSecBuff + STX [blokDanychIO1-offset1]+5 + STY DAUX1 + STA DAUX2 + ORA DAUX1 + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$09 +SetDCB + LDA [blokDanychIO1-offset1],X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BYTE $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+8 +CheckEOF + INC [ToFileEndH-offset1] + BNE NotEOF + INC [ToFileEndH-offset1]+1 + BNE NotEOF +EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + LDA #>[JTESTROM-1] + PHA + LDA #<[JTESTROM-1] + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ; pobranie bajtu z pliku do A + INX + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + TYA + PHA + LDX PointInMap + CPX SecLenZ ; jesli koniec mapy to trzeba pobrac jej nastepny sektor + BNE NotMapEnd + LDY FileMapBuff ; pobranie numeru nastepnego sektora mapy + LDA FileMapBuff+$01 ; (dwa pierwsze bajty sektora mapy) + JSR [GetMapSector-offset1] ; zaladowanie sektora mapy do bufora + LDX #$04 +NotMapEnd + LDA FileMapBuff,X ; pobranie z mapy numeru kolejnego sektora pliku + TAY + LDA FileMapBuff+1,X + INX + INX ; zwiekszenie wskaznika pozycji w mapie + STX PointInMap ; i zapisanie go + JSR [GetDataSector-offset1] ; wczytanie kolejnego sektora pliku do bufora + PLA + TAY + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + BEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i koncie procedury +; 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 + .WORD $0000 +LoadStart + ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + LDY MEMLO + LDA MEMLO+1 + STA [InMemClearLoop-offset1]+2 +OutMemClearLoop + LDA #$00 +InMemClearLoop + STA $0900,Y + INY + BNE InMemClearLoop + INC [InMemClearLoop-offset1]+2 + LDA [InMemClearLoop-offset1]+2 + CMP MEMTOP+1 + BCC OutMemClearLoop + LDA MEMTOP+1 + STA [LastMemPageClear-offset1]+2 + LDY MEMTOP + LDA #$00 +LastMemPageClear + STA $8000,Y + DEY + CPY #$FF + BNE LastMemPageClear + ; wyczyszczona, wiec .... + LDA [FirstMapSectorNr-offset1]+1 + LDY [FirstMapSectorNr-offset1] + JSR [GetMapSector-offset1] ; ladowanie pierwszego sektora mapy do bufora + LDA #$04 + STA PointInMap + LDA [tempToFileEndL-offset1] + STA ToFileEndL + LDA #$FF + STA KBCODES + INC [WhatIsIt-offset1] ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) + LDX [SecLen-offset1] ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora + JMP [FileNextBlock-offset1] +; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku +; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera +tempToFileEndL + .BYTE $00 ;2152 00 +CzyTopDrive + .BYTE $00 ; Jesli >0 to transmisja w trybie TopDrive ;2153 00 00 +;CzySpeedy +; .byte $00 ; To samo dla trybu Speedy/HDI +CzyHappyUS + .BYTE $00 ; To samo dla Happy i US-Doubler +; Rozkaz DCB odczytujacy blok PERCOM (12b) pod $2900 +blokDanychIO2 + .BYTE $31,$01,$4E,$40 + .WORD FirstSectorBuff + .BYTE $07,$00,$0C,$00 ;2155 31 01 +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F ;2161 29 0F + ORA #$30 ;2163 09 30 + CMP #$3A ;2165 C9 3A + BCC labelka ;2167 90 03 + CLC ;2169 18 + ADC #$07 ;216A 69 07 +labelka + RTS ;216C 60 + +Edriver + .BYTE "E:",$9b ;216D 45 3A +FirstRun + LDA SKSTAT ; uruchamia sie tylko raz na starcie loadera + AND #$08 + STA BootSHIFT ; zapamietanie stanu Shift z bootowania +mainprog + LDX #$00 ;2170 A2 00 + JSR CloseX ;2172 20 61 28 + BMI ErrorDisplay ;2175 30 5A + LDX #$00 ;2177 A2 00 + LDA #$03 ;2179 A9 03 + STA ICCMD,X ;217B 9D 42 03 + LDA #$0C ;217E A9 0C + STA ICAX1,X ;2180 9D 4A 03 + STA ICBUFL,X ;2183 9D 48 03 + LDA #$00 ;2186 A9 00 + STA ICAX2,X ;2188 9D 4B 03 + STA ICBUFL+1,X ;218B 9D 49 03 + LDA #Edriver ;2193 A9 21 + STA ICBUFA+1,X ;2195 9D 45 03 + JSR JCIOMAIN ;2198 20 56 E4 + BMI ErrorDisplay ;219B 30 34 + LDA #$C4 ;219D A9 C4 + STA COLPF2S ;219F 8D C6 02 + STA COLBAKS ;21A2 8D C8 02 + LDA #$01 ;21A5 A9 01 + STA CzyTopDrive ;21A7 8D 53 21 +; STA CzySpeedy ;21AA 8D 54 21 + STA CzyHappyUS + LDA SKSTAT ;21AD AD 0F D2 + AND BootSHIFT ; sprawdzenie czy byl Shift przy starcie, wtedy obecny nie ma znaczenia + AND #$08 ;21B0 29 08 + BNE NoRunShift ; czy SHIFT w czasie odczytu glownego katalogu ;21B2 D0 08 + ; tu jest 0 w A +; STA CzySpeedy ; jesli tak to wylaczamy przyspieszacze. ;21B4 8D 54 21 + STA CzyTopDrive ;21B7 8D 53 21 + STA CzyHappyUS + BEQ ReadMainDir ;21BA F0 52 +; Odczyt bloku PERCOM procedura przeznaczona dla Top Drive (bo znacznik ustawiony) +NoRunShift + LDY #blokDanychIO2 ;21BE A2 21 + JSR Table2DCB ;21C0 20 4D 28 + JSR GoSIO ;21C3 20 18 28 + BPL ReadMainDir ;21C6 10 46 +; jesli PERCOM sie nie odczytal to nie mamy TopDrive + LDA #$00 ;21C8 A9 00 + STA CzyTopDrive ;21CA 8D 53 21 + ;sprawdzamy jeszcze Happy/US-Doubler + LDY #blokDanychIO6 + JSR Table2DCB + JSR JSIOINT + BPL ReadMainDir + ; jezeli predkosc sie nie odczytala to brak Happy/US + ; ustawienie standardowej predkosci + LDA #$28 + STA HappySpeed + LDA #$00 + STA CzyHappyUS + BEQ ReadMainDir ;21CD F0 3F +Error148 + LDY #$94 ;21CF A0 94 +ErrorDisplay + TYA ;21D1 98 + PHA ;21D2 48 + JSR Close1 ;21D3 20 5F 28 + PLA ;21D6 68 + PHA ;21D7 48 + LSR A ;21D8 4A + LSR A ;21D9 4A + LSR A ;21DA 4A + LSR A ;21DB 4A + JSR bin2AsciiHex ;21DC 20 61 21 + STA ErrorNumHex ;21DF 8D F8 21 + PLA ;21E2 68 + JSR bin2AsciiHex ;21E3 20 61 21 + STA ErrorNumHex+1 ;21E6 8D F9 21 + JSR PrintXY ;21E9 20 88 27 + .BYTE $00,$00 ;21EC 00 + ;21ED 00 + .BYTE $7d ;21EE 7D 45 52 + .BYTE "ERROR - $" +ErrorNumHex + .BYTE "00",$00 ;21F8 30 + ;21F9 30 00 + LDA #$FF ;21FB A9 FF + STA KBCODES ;21FD 8D FC 02 +WaitKloop + LDX KBCODES ;2200 AE FC 02 + INX ;2203 E8 + BEQ WaitKloop ;2204 F0 FA + LDA #$FF ;2206 A9 FF + STA KBCODES ;2208 8D FC 02 + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie prechodzimy na D1 + LDA #$01 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ;220B 4C 70 21 +ReadMainDir + LDX #>FirstSectorBuff ;220E A2 29 + LDY #DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BYTE ":Main Dir. " + .BYTE +$80,"<" + .BYTE ":UP-DIR." + .BYTE $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesni nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA [GameName+12] ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BYTE $01 ;242F 01 +YposGameName + .BYTE $02 +GameKeySymbol + .BYTE "A) " ;2431 41 29 20 +GameName + .BYTE " " ;2434 20 20 20 + .BYTE $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL A ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA data03,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA data03+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS label67 ;2477 B0 35 + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP label02 ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP label71 ;24AB 4C EF 22 +label67 + JSR PrintXY ;24AE 20 88 27 + .BYTE $01,$15 ;24B1 01 15 + .BYTE $1D + .BYTE $00 ;24B3 1D 00 + JSR PrintXY ;24B5 20 88 27 + .BYTE $0E,$15 ;24B8 0E 15 + .BYTE $1D + .BYTE $00 ;24BA 1D 00 + JMP KeyboardProc ;24BC 4C C1 24 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey ;24C1 20 69 28 + PHA ;24C4 48 + LDA SKSTAT ;24C5 AD 0F D2 + AND BootSHIFT ; sprawdzenie czy byl Shift przy starcie, wtedy obecny nie ma znaczenia + AND #$08 ;24C8 29 08 + BNE NoSHIFT ;24CA D0 08 + LDA #$00 ;24CC A9 00 + STA CzyTopDrive ;24CE 8D 53 21 +; STA CzySpeedy ;24D1 8D 54 21 + STA CzyHappyUS +NoSHIFT + PLA ;24D4 68 + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + ; ale najpierw odshiftowanie (za pomoca tabelki tyle ze tu od 0 do 9 zeby miec na przyszlosc) + STA SprawdzShiftCyfra+1 ; zapamietujemy kod do porownan (przy okazji) + LDX #9 +PetlaShiftNaCyfre + LDA TablShift,X +SprawdzShiftCyfra + CMP #'! ; tu jest wstawiony kod wcisnietego klawisza do przeliczenia + BNE NieShiftCyfra + ; liczba wg tablicy + TXA + CLC + ADC #'0 + BNE JestShiftCyfra +NieShiftCyfra + DEX + BPL PetlaShiftNaCyfre + LDA SprawdzShiftCyfra+1 ; Jesli nie bylo w tablicy to przywracamy stary Accu +JestShiftCyfra + CMP #'1 + BCC NoNumber + CMP #'9 + BCS NoNumber + SEC + SBC #'0 + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +TablShift + .BYTE $29,$21,$22,$23,$24,$25,$26,$27,$40,$28,$29 ; cyfry 0-9 z Shift (kody) +NoNumber + SEC ;24E5 38 + SBC #$41 ; "A" ;24E6 E9 41 + CMP $D9 ;24E8 C5 D9 + BCS KeyboardProc ;24EA B0 D5 + ASL A ;24EC 0A + TAX ;24ED AA + LDA data03,X ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA data03+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + AND #$20 ;24FC 29 20 + BEQ label01 ;24FE F0 15 + LDY #$02 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP label02 ;2509 4C 34 22 +SubDirText + .BYTE "" ;250C 3C +label01 + JSR DiscChangeCheck ;2515 20 B3 28 + BEQ label04 ;2518 F0 03 + JMP ReadMainDir ;251A 4C 0E 22 +label04 + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA FirstMapSectorNr ;2521 8D 00 21 + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA FirstMapSectorNr+1 ;2527 8D 01 21 + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA ToFileEndH ;2537 8D 00 20 + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 FF + STA ToFileEndH+1 ;253F 8D 01 20 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #label06 ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + LDA #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 + LDX #$00 ;2597 A2 00 + LDA #$00 ;2599 A9 00 +ClearLoop1 + STA $0100,X ;259B 9D 00 01 + STA $0400,X ;259E 9D 00 04 + STA $0500,X ;25A1 9D 00 05 + STA $0600,X ;25A4 9D 00 06 + CPX #$80 ;25A7 E0 80 + BCC NoZpage ;25A9 90 02 + STA $00,X ;25AB 95 00 +NoZpage + INX ;25AD E8 + BNE ClearLoop1 ;25AE D0 EB + LDX #$FF ;25B0 A2 FF + TXS ;25B2 9A + JSR label07 ;25B3 20 B9 25 + JMP [LoadStart-offset1] ;25B6 4C 02 08 +label07 + LDA CzyTopDrive ;25B9 AD 53 21 + BEQ NoTopDriveLoader ;25BC F0 11 + LDX #[EndTopDriveProc-TopDriveMovedProc]-1 ;25BE A2 34 +label72 + LDA TopDriveMovedProc,X ;25C0 BD 0C 26 + STA $0A00,X ;25C3 9D 00 0A + DEX ;25C6 CA + BPL label72 ;25C7 10 F7 + LDY #[EndTopDriveProc-TopDriveMovedProc] ;25C9 A0 35 + LDX #$00 ;25CB A2 00 + BEQ label73 ;25CD F0 23 +NoTopDriveLoader +; LDA CzySpeedy ;25CF AD 54 21 +; BEQ NoSpeedyLoader ;25D2 F0 37 +;; Pytanie stacji o dlugosc procedury szybkiej transmisji +; LDY #blokDanychIO3 ;25D6 A2 26 +; JSR Table2DCB ;25D8 20 4D 28 +; JSR JSIOINT ;25DB 20 59 E4 +; BMI NoSpeedyLoader ;25DE 30 2B +;; Wczytanie procedury szybkiej transmisji pod $0a00 +; LDY #blokDanychIO4 ;25E2 A2 26 +; JSR Table2DCB ;25E4 20 4D 28 +; JSR JSIOINT ;25E7 20 59 E4 +; BMI NoSpeedyLoader ;25EA 30 1F +;; Dlugosc procedury szybkiej transmisji do X i Y +; LDY blokDanychIO4+8 ;25EC AC 55 26 +; LDX blokDanychIO4+9 ;25EF AE 56 26 +; jmp label73 +NoSpeedyLoader + LDA CzyHappyUS + BEQ NoHappyLoader + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler +; ldy #blokDanychIO6 +; jsr Table2DCB +; jsr JSIOINT ; "?" +; bmi NoHappyLoader + + LDY #0 + LDX #[$A-1] ;xjsrA - the last +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC #HappyOffset + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + + + + + + + LDX #[EndHappyUSProc-HappyUSMovedProc] +label72x + LDA HappyUSMovedProc-1,X + STA $0A00-1,X + DEX + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA #<[TopDriveMovedProc-offset2] ;2601 A9 00 + STA [SioJMP-offset1]+1 ;2603 8D A7 07 + LDA #>[TopDriveMovedProc-offset2] ;2606 A9 0A + STA [SioJMP-offset1]+2 ;2608 8D A8 07 +NoHappyLoader + RTS ;260B 60 + + + +; 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 ; +HappyOffset=[HappyUSMovedProc-$a00] + + 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 +TopDriveMovedProc + LDA VSERIN ;260C AD 0A 02 + STA [OldSerInJmp-offset2]+1 ;260F 8D 33 0A + PHA ;2612 48 + LDA VSERIN+1 ;2613 AD 0B 02 + STA [OldSerInJmp-offset2]+2 ;2616 8D 34 0A + PHA ;2619 48 + LDA DCOMND ;261A AD 02 03 + ORA #$80 ;261D 09 80 + STA DCOMND ;261F 8D 02 03 + LDA #<[NewSerInInterrupt-offset2] ;2622 A9 2D + STA VSERIN ;2624 8D 0A 02 + LDA #>[NewSerInInterrupt-offset2] ;2627 A9 0A + STA VSERIN+1 ;2629 8D 0B 02 + JSR JSIOINT ;262C 20 59 E4 + PLA ;262F 68 + STA VSERIN+1 ;2630 8D 0B 02 + PLA ;2633 68 + STA VSERIN ;2634 8D 0A 02 + TYA ;2637 98 + RTS ;2638 60 +NewSerInInterrupt + LDA #$10 ;2639 A9 10 + STA AUDF3 ;263B 8D 04 D2 +OldSerInJmp + JMP $FFFF ;263E 4C FF FF +EndTopDriveProc +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 +; Rozkazy DCB do wszytania procedury turbo dla Speedy/HDI + .BYTE $31,$01,$3f,$40 + .WORD HappySpeed + .BYTE $07,$00,$01,$00,$00,$0A +;blokDanychIO3 +; .byte $31,$01,$68,$40 ;2641 31 01 +; .word [blokDanychIO4+8] +; .byte $07,$00,$02,$00,$00,$0A +;blokDanychIO4 +; .byte $31,$01,$69,$40,$00,$0A,$07,$00,$01,$00,$00,$0A ;264D 31 01 +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ;2666 20 B3 28 + BEQ label76 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +label76 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BYTE $31,$01,$52,$40 + .WORD DirMapSectorBuff + .BYTE $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BYTE $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL A ;279B 0A + ASL A ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL A ;27A0 0A + ASL A ;27A1 0A + ROL $DF ;27A2 26 DF + ASL A ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio ze sprawdzeniem czy nie TopDrive i odpowiedna modyfikacja +; procedury +GoSIO + LDA CzyTopDrive ;2818 AD 53 21 + BNE label95 ;281B D0 03 + LDA CzyHappyUS + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +label95 +; Obsluga trybu TopDrive (XF)... + LDA VSERIN ;2820 AD 0A 02 + STA OldSerInJmp+1 ;2823 8D 3F 26 + PHA ;2826 48 + LDA VSERIN+1 ;2827 AD 0B 02 + STA OldSerInJmp+2 ;282A 8D 40 26 + PHA ;282D 48 + LDA DCOMND ;282E AD 02 03 + ORA #$80 ;2831 09 80 + STA DCOMND ;2833 8D 02 03 + LDA #NewSerInInterrupt ;283B A9 26 + STA VSERIN+1 ;283D 8D 0B 02 + JSR JSIOINT ;2840 20 59 E4 + PLA ;2843 68 + STA VSERIN+1 ;2844 8D 0B 02 + PLA ;2847 68 + STA VSERIN ;2848 8D 0A 02 + TYA ;284B 98 + RTS ;284C 60 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BYTE "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 +; Ustawia numer satcji wg A +SeTDriveNR + STA blokDanychIO1+1 + STA blokDanychIO2+1 +; sta blokDanychIO3 +; sta blokDanychIO4 + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #['0+$80] + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BYTE $08,$00 +DriveDisp2 + .BYTE +$80,"1" + .BYTE $00 + RTS + +xjsrTableL + .BYTE <[xjsr1+1],<[xjsr2+1],<[xjsr3+1],<[xjsr4+1],<[xjsr5+1] + .BYTE <[xjsr6+1],<[xjsr7+1],<[xjsr8+1],<[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BYTE >[xjsr1+1],>[xjsr2+1],>[xjsr3+1],>[xjsr4+1],>[xjsr5+1] + .BYTE >[xjsr6+1],>[xjsr7+1],>[xjsr8+1],>[xjsr9+1],>[xjsrA+1] + + +data03 + *=*+$30 +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; tutaj sektor katalogu + .BYTE "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + *=$02e0 + .WORD START ;02E0 FD 1F + + .OPT List \ No newline at end of file diff --git a/old_versions/msdos33b.s65 b/old_versions/msdos33b.s65 new file mode 100644 index 0000000..2707b9f --- /dev/null +++ b/old_versions/msdos33b.s65 @@ -0,0 +1,1638 @@ + ;MICRO SPARTA DOS 3.0s + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + *=$1FFD + .OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 + + +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) +BootSHIFT = START-1 + +VSERIN = $020a + +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 + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = TopDriveMovedProc-$0a00 +; 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 = FirstMapSectorNr - offset1 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) +movedproc +; 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 + .WORD $0000 +FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + TXA + PHA + LDA ToFileEndL + PHA + JSR [GoInitAddr-offset1] + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA [SecLen-offset1] + STA SecLenZ + JSR [FileGetBlockStart-offset1] ; pobranie dwoch bajtow (adres poczatku bloku) + AND InBlockAddr + CMP #$FF ; jesli oba sa $FF to..... + BNE FileNoFFFFHead + JSR [FileGetBlockStart-offset1] ; pobranie jeszcze raz +FileNoFFFFHead + JSR [FileGetByte-offset1] ; 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-offset1] ; 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-offset1] ; 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-offset1] ; do adresu inicjacji wpisanie adresu rozkazu RTS + STA $02E2 ; bo po kazdym bloku odbywa sie tam skok + LDA #>[Jrts-offset1] ; 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 SecLenZ ; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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-offset1] ; 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-offset1] + BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +FileGetBlockStart + JSR [FileGetByte-offset1] + STA InBlockAddr + JSR [FileGetByte-offset1] + STA InBlockAddr+1 + RTS +GoInitAddr + JMP ($02E2) +GoSelfTest + JMP JTESTROM +GetMapSector + LDX #>FileMapBuff + .BYTE $2c ; rozkaz BIT powodujacy ominiecie nastepnyc dwoch bajtow ... +GetDataSector + LDX #>FileSecBuff + STX [blokDanychIO1-offset1]+5 + STY DAUX1 + STA DAUX2 + ORA DAUX1 + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$09 +SetDCB + LDA [blokDanychIO1-offset1],X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BYTE $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+8 +CheckEOF + INC [ToFileEndH-offset1] + BNE NotEOF + INC [ToFileEndH-offset1]+1 + BNE NotEOF +EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + LDA #>[JTESTROM-1] + PHA + LDA #<[JTESTROM-1] + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ; pobranie bajtu z pliku do A + INX + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + TYA + PHA + LDX PointInMap + CPX SecLenZ ; jesli koniec mapy to trzeba pobrac jej nastepny sektor + BNE NotMapEnd + LDY FileMapBuff ; pobranie numeru nastepnego sektora mapy + LDA FileMapBuff+$01 ; (dwa pierwsze bajty sektora mapy) + JSR [GetMapSector-offset1] ; zaladowanie sektora mapy do bufora + LDX #$04 +NotMapEnd + LDA FileMapBuff,X ; pobranie z mapy numeru kolejnego sektora pliku + TAY + LDA FileMapBuff+1,X + INX + INX ; zwiekszenie wskaznika pozycji w mapie + STX PointInMap ; i zapisanie go + JSR [GetDataSector-offset1] ; wczytanie kolejnego sektora pliku do bufora + PLA + TAY + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + BEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i koncie procedury +; 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 + .WORD $0000 +LoadStart + ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + LDY MEMLO + LDA MEMLO+1 + STA [InMemClearLoop-offset1]+2 +OutMemClearLoop + LDA #$00 +InMemClearLoop + STA $0900,Y + INY + BNE InMemClearLoop + INC [InMemClearLoop-offset1]+2 + LDA [InMemClearLoop-offset1]+2 + CMP MEMTOP+1 + BCC OutMemClearLoop + LDA MEMTOP+1 + STA [LastMemPageClear-offset1]+2 + LDY MEMTOP + LDA #$00 +LastMemPageClear + STA $8000,Y + DEY + CPY #$FF + BNE LastMemPageClear + ; wyczyszczona, wiec .... + LDA [FirstMapSectorNr-offset1]+1 + LDY [FirstMapSectorNr-offset1] + JSR [GetMapSector-offset1] ; ladowanie pierwszego sektora mapy do bufora + LDA #$04 + STA PointInMap + LDA [tempToFileEndL-offset1] + STA ToFileEndL + LDA #$FF + STA KBCODES + INC [WhatIsIt-offset1] ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) + LDX [SecLen-offset1] ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora + JMP [FileNextBlock-offset1] +; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku +; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera +tempToFileEndL + .BYTE $00 ;2152 00 +CzyTopDrive + .BYTE $00 ; Jesli >0 to transmisja w trybie TopDrive ;2153 00 00 +;CzySpeedy +; .byte $00 ; To samo dla trybu Speedy/HDI +CzyHappyUS + .BYTE $00 ; To samo dla Happy i US-Doubler +; Rozkaz DCB odczytujacy blok PERCOM (12b) pod $2900 +blokDanychIO2 + .BYTE $31,$01,$4E,$40 + .WORD FirstSectorBuff + .BYTE $07,$00,$0C,$00 ;2155 31 01 +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F ;2161 29 0F + ORA #$30 ;2163 09 30 + CMP #$3A ;2165 C9 3A + BCC labelka ;2167 90 03 + CLC ;2169 18 + ADC #$07 ;216A 69 07 +labelka + RTS ;216C 60 + +Edriver + .BYTE "E:",$9b ;216D 45 3A +FirstRun + LDA SKSTAT ; uruchamia sie tylko raz na starcie loadera + AND #$08 + STA BootSHIFT ; zapamietanie stanu Shift z bootowania + LDA DUNIT ; zapamietanie numeru urzadzenia + AND #$0F + JSR SeTDriveNR +mainprog + LDX #$00 ;2170 A2 00 + JSR CloseX ;2172 20 61 28 + BMI ErrorDisplay ;2175 30 5A + LDX #$00 ;2177 A2 00 + LDA #$03 ;2179 A9 03 + STA ICCMD,X ;217B 9D 42 03 + LDA #$0C ;217E A9 0C + STA ICAX1,X ;2180 9D 4A 03 + STA ICBUFL,X ;2183 9D 48 03 + LDA #$00 ;2186 A9 00 + STA ICAX2,X ;2188 9D 4B 03 + STA ICBUFL+1,X ;218B 9D 49 03 + LDA #Edriver ;2193 A9 21 + STA ICBUFA+1,X ;2195 9D 45 03 + JSR JCIOMAIN ;2198 20 56 E4 + BMI ErrorDisplay ;219B 30 34 + LDA #$C4 ;219D A9 C4 + STA COLPF2S ;219F 8D C6 02 + STA COLBAKS ;21A2 8D C8 02 + LDA #$01 ;21A5 A9 01 + STA CzyTopDrive ;21A7 8D 53 21 +; STA CzySpeedy ;21AA 8D 54 21 + STA CzyHappyUS + LDA SKSTAT ;21AD AD 0F D2 + AND BootSHIFT ; sprawdzenie czy byl Shift przy starcie, wtedy obecny nie ma znaczenia + AND #$08 ;21B0 29 08 + BNE NoRunShift ; czy SHIFT w czasie odczytu glownego katalogu ;21B2 D0 08 + ; tu jest 0 w A +; STA CzySpeedy ; jesli tak to wylaczamy przyspieszacze. ;21B4 8D 54 21 + STA CzyTopDrive ;21B7 8D 53 21 + STA CzyHappyUS + BEQ ReadMainDir ;21BA F0 52 +; Odczyt bloku PERCOM procedura przeznaczona dla Top Drive (bo znacznik ustawiony) +NoRunShift + LDY #blokDanychIO2 ;21BE A2 21 + JSR Table2DCB ;21C0 20 4D 28 + JSR GoSIO ;21C3 20 18 28 + BPL ReadMainDir ;21C6 10 46 +; jesli PERCOM sie nie odczytal to nie mamy TopDrive + LDA #$00 ;21C8 A9 00 + STA CzyTopDrive ;21CA 8D 53 21 + ;sprawdzamy jeszcze Happy/US-Doubler + LDY #blokDanychIO6 + JSR Table2DCB + JSR JSIOINT + BPL ReadMainDir + ; jezeli predkosc sie nie odczytala to brak Happy/US + ; ustawienie standardowej predkosci + LDA #$28 + STA HappySpeed + LDA #$00 + STA CzyHappyUS + BEQ ReadMainDir ;21CD F0 3F +Error148 + LDY #$94 ;21CF A0 94 +ErrorDisplay + TYA ;21D1 98 + PHA ;21D2 48 + JSR Close1 ;21D3 20 5F 28 + PLA ;21D6 68 + PHA ;21D7 48 + LSR A ;21D8 4A + LSR A ;21D9 4A + LSR A ;21DA 4A + LSR A ;21DB 4A + JSR bin2AsciiHex ;21DC 20 61 21 + STA ErrorNumHex ;21DF 8D F8 21 + PLA ;21E2 68 + JSR bin2AsciiHex ;21E3 20 61 21 + STA ErrorNumHex+1 ;21E6 8D F9 21 + JSR PrintXY ;21E9 20 88 27 + .BYTE $00,$00 ;21EC 00 + ;21ED 00 + .BYTE $7d ;21EE 7D 45 52 + .BYTE "ERROR - $" +ErrorNumHex + .BYTE "00",$00 ;21F8 30 + ;21F9 30 00 + LDA #$FF ;21FB A9 FF + STA KBCODES ;21FD 8D FC 02 +WaitKloop + LDX KBCODES ;2200 AE FC 02 + INX ;2203 E8 + BEQ WaitKloop ;2204 F0 FA + LDA #$FF ;2206 A9 FF + STA KBCODES ;2208 8D FC 02 + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie prechodzimy na D1 + LDA #$01 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ;220B 4C 70 21 +ReadMainDir + LDX #>FirstSectorBuff ;220E A2 29 + LDY #DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BYTE ":Main Dir. " + .BYTE +$80,"<" + .BYTE ":UP-DIR." + .BYTE $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesni nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA [GameName+12] ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BYTE $01 ;242F 01 +YposGameName + .BYTE $02 +GameKeySymbol + .BYTE "A) " ;2431 41 29 20 +GameName + .BYTE " " ;2434 20 20 20 + .BYTE $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL A ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA data03,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA data03+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS label67 ;2477 B0 35 + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP label02 ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP label71 ;24AB 4C EF 22 +label67 + JSR PrintXY ;24AE 20 88 27 + .BYTE $01,$15 ;24B1 01 15 + .BYTE $1D + .BYTE $00 ;24B3 1D 00 + JSR PrintXY ;24B5 20 88 27 + .BYTE $0E,$15 ;24B8 0E 15 + .BYTE $1D + .BYTE $00 ;24BA 1D 00 + JMP KeyboardProc ;24BC 4C C1 24 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey ;24C1 20 69 28 + PHA ;24C4 48 + LDA SKSTAT ;24C5 AD 0F D2 + AND BootSHIFT ; sprawdzenie czy byl Shift przy starcie, wtedy obecny nie ma znaczenia + AND #$08 ;24C8 29 08 + BNE NoSHIFT ;24CA D0 08 + LDA #$00 ;24CC A9 00 + STA CzyTopDrive ;24CE 8D 53 21 +; STA CzySpeedy ;24D1 8D 54 21 + STA CzyHappyUS +NoSHIFT + PLA ;24D4 68 + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + ; ale najpierw odshiftowanie (za pomoca tabelki tyle ze tu od 0 do 9 zeby miec na przyszlosc) + STA SprawdzShiftCyfra+1 ; zapamietujemy kod do porownan (przy okazji) + LDX #9 +PetlaShiftNaCyfre + LDA TablShift,X +SprawdzShiftCyfra + CMP #'! ; tu jest wstawiony kod wcisnietego klawisza do przeliczenia + BNE NieShiftCyfra + ; liczba wg tablicy + TXA + CLC + ADC #'0 + BNE JestShiftCyfra +NieShiftCyfra + DEX + BPL PetlaShiftNaCyfre + LDA SprawdzShiftCyfra+1 ; Jesli nie bylo w tablicy to przywracamy stary Accu +JestShiftCyfra + CMP #'1 + BCC NoNumber + CMP #'9 + BCS NoNumber + SEC + SBC #'0 + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +TablShift + .BYTE $29,$21,$22,$23,$24,$25,$26,$27,$40,$28,$29 ; cyfry 0-9 z Shift (kody) +NoNumber + SEC ;24E5 38 + SBC #$41 ; "A" ;24E6 E9 41 + CMP $D9 ;24E8 C5 D9 + BCS KeyboardProc ;24EA B0 D5 + ASL A ;24EC 0A + TAX ;24ED AA + LDA data03,X ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA data03+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + AND #$20 ;24FC 29 20 + BEQ label01 ;24FE F0 15 + LDY #$02 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP label02 ;2509 4C 34 22 +SubDirText + .BYTE "" ;250C 3C +label01 + JSR DiscChangeCheck ;2515 20 B3 28 + BEQ label04 ;2518 F0 03 + JMP ReadMainDir ;251A 4C 0E 22 +label04 + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA FirstMapSectorNr ;2521 8D 00 21 + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA FirstMapSectorNr+1 ;2527 8D 01 21 + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA ToFileEndH ;2537 8D 00 20 + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 FF + STA ToFileEndH+1 ;253F 8D 01 20 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #label06 ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + LDA #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 + LDX #$00 ;2597 A2 00 + LDA #$00 ;2599 A9 00 +ClearLoop1 + STA $0100,X ;259B 9D 00 01 + STA $0400,X ;259E 9D 00 04 + STA $0500,X ;25A1 9D 00 05 + STA $0600,X ;25A4 9D 00 06 + CPX #$80 ;25A7 E0 80 + BCC NoZpage ;25A9 90 02 + STA $00,X ;25AB 95 00 +NoZpage + INX ;25AD E8 + BNE ClearLoop1 ;25AE D0 EB + LDX #$FF ;25B0 A2 FF + TXS ;25B2 9A + JSR label07 ;25B3 20 B9 25 + JMP [LoadStart-offset1] ;25B6 4C 02 08 +label07 + LDA CzyTopDrive ;25B9 AD 53 21 + BEQ NoTopDriveLoader ;25BC F0 11 + LDX #[EndTopDriveProc-TopDriveMovedProc]-1 ;25BE A2 34 +label72 + LDA TopDriveMovedProc,X ;25C0 BD 0C 26 + STA $0A00,X ;25C3 9D 00 0A + DEX ;25C6 CA + BPL label72 ;25C7 10 F7 + LDY #[EndTopDriveProc-TopDriveMovedProc] ;25C9 A0 35 + LDX #$00 ;25CB A2 00 + BEQ label73 ;25CD F0 23 +NoTopDriveLoader +; LDA CzySpeedy ;25CF AD 54 21 +; BEQ NoSpeedyLoader ;25D2 F0 37 +;; Pytanie stacji o dlugosc procedury szybkiej transmisji +; LDY #blokDanychIO3 ;25D6 A2 26 +; JSR Table2DCB ;25D8 20 4D 28 +; JSR JSIOINT ;25DB 20 59 E4 +; BMI NoSpeedyLoader ;25DE 30 2B +;; Wczytanie procedury szybkiej transmisji pod $0a00 +; LDY #blokDanychIO4 ;25E2 A2 26 +; JSR Table2DCB ;25E4 20 4D 28 +; JSR JSIOINT ;25E7 20 59 E4 +; BMI NoSpeedyLoader ;25EA 30 1F +;; Dlugosc procedury szybkiej transmisji do X i Y +; LDY blokDanychIO4+8 ;25EC AC 55 26 +; LDX blokDanychIO4+9 ;25EF AE 56 26 +; jmp label73 +NoSpeedyLoader + LDA CzyHappyUS + BEQ NoHappyLoader + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler +; ldy #blokDanychIO6 +; jsr Table2DCB +; jsr JSIOINT ; "?" +; bmi NoHappyLoader + + LDY #0 + LDX #[$A-1] ;xjsrA - the last +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC #HappyOffset + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + + + + + + + LDX #[EndHappyUSProc-HappyUSMovedProc] +label72x + LDA HappyUSMovedProc-1,X + STA $0A00-1,X + DEX + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA #<[TopDriveMovedProc-offset2] ;2601 A9 00 + STA [SioJMP-offset1]+1 ;2603 8D A7 07 + LDA #>[TopDriveMovedProc-offset2] ;2606 A9 0A + STA [SioJMP-offset1]+2 ;2608 8D A8 07 +NoHappyLoader + RTS ;260B 60 + + + +; 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 ; +HappyOffset=[HappyUSMovedProc-$a00] + + 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 +TopDriveMovedProc + LDA VSERIN ;260C AD 0A 02 + STA [OldSerInJmp-offset2]+1 ;260F 8D 33 0A + PHA ;2612 48 + LDA VSERIN+1 ;2613 AD 0B 02 + STA [OldSerInJmp-offset2]+2 ;2616 8D 34 0A + PHA ;2619 48 + LDA DCOMND ;261A AD 02 03 + ORA #$80 ;261D 09 80 + STA DCOMND ;261F 8D 02 03 + LDA #<[NewSerInInterrupt-offset2] ;2622 A9 2D + STA VSERIN ;2624 8D 0A 02 + LDA #>[NewSerInInterrupt-offset2] ;2627 A9 0A + STA VSERIN+1 ;2629 8D 0B 02 + JSR JSIOINT ;262C 20 59 E4 + PLA ;262F 68 + STA VSERIN+1 ;2630 8D 0B 02 + PLA ;2633 68 + STA VSERIN ;2634 8D 0A 02 + TYA ;2637 98 + RTS ;2638 60 +NewSerInInterrupt + LDA #$10 ;2639 A9 10 + STA AUDF3 ;263B 8D 04 D2 +OldSerInJmp + JMP $FFFF ;263E 4C FF FF +EndTopDriveProc +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 +; Rozkazy DCB do wszytania procedury turbo dla Speedy/HDI + .BYTE $31,$01,$3f,$40 + .WORD HappySpeed + .BYTE $07,$00,$01,$00,$00,$0A +;blokDanychIO3 +; .byte $31,$01,$68,$40 ;2641 31 01 +; .word [blokDanychIO4+8] +; .byte $07,$00,$02,$00,$00,$0A +;blokDanychIO4 +; .byte $31,$01,$69,$40,$00,$0A,$07,$00,$01,$00,$00,$0A ;264D 31 01 +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ;2666 20 B3 28 + BEQ label76 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +label76 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BYTE $31,$01,$52,$40 + .WORD DirMapSectorBuff + .BYTE $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BYTE $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL A ;279B 0A + ASL A ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL A ;27A0 0A + ASL A ;27A1 0A + ROL $DF ;27A2 26 DF + ASL A ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio ze sprawdzeniem czy nie TopDrive i odpowiedna modyfikacja +; procedury +GoSIO + LDA CzyTopDrive ;2818 AD 53 21 + BNE label95 ;281B D0 03 + LDA CzyHappyUS + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +label95 +; Obsluga trybu TopDrive (XF)... + LDA VSERIN ;2820 AD 0A 02 + STA OldSerInJmp+1 ;2823 8D 3F 26 + PHA ;2826 48 + LDA VSERIN+1 ;2827 AD 0B 02 + STA OldSerInJmp+2 ;282A 8D 40 26 + PHA ;282D 48 + LDA DCOMND ;282E AD 02 03 + ORA #$80 ;2831 09 80 + STA DCOMND ;2833 8D 02 03 + LDA #NewSerInInterrupt ;283B A9 26 + STA VSERIN+1 ;283D 8D 0B 02 + JSR JSIOINT ;2840 20 59 E4 + PLA ;2843 68 + STA VSERIN+1 ;2844 8D 0B 02 + PLA ;2847 68 + STA VSERIN ;2848 8D 0A 02 + TYA ;284B 98 + RTS ;284C 60 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BYTE "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 +; Ustawia numer satcji wg A +SeTDriveNR + STA blokDanychIO1+1 + STA blokDanychIO2+1 +; sta blokDanychIO3 +; sta blokDanychIO4 + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #['0+$80] + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BYTE $08,$00 +DriveDisp2 + .BYTE +$80,"1" + .BYTE $00 + RTS + +xjsrTableL + .BYTE <[xjsr1+1],<[xjsr2+1],<[xjsr3+1],<[xjsr4+1],<[xjsr5+1] + .BYTE <[xjsr6+1],<[xjsr7+1],<[xjsr8+1],<[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BYTE >[xjsr1+1],>[xjsr2+1],>[xjsr3+1],>[xjsr4+1],>[xjsr5+1] + .BYTE >[xjsr6+1],>[xjsr7+1],>[xjsr8+1],>[xjsr9+1],>[xjsrA+1] + + +data03 + *=*+$30 +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; tutaj sektor katalogu + .BYTE "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + *=$02e0 + .WORD START ;02E0 FD 1F + + .OPT List \ No newline at end of file diff --git a/old_versions/msdos33c.s65 b/old_versions/msdos33c.s65 new file mode 100644 index 0000000..79f3cc5 --- /dev/null +++ b/old_versions/msdos33c.s65 @@ -0,0 +1,1701 @@ + ;MICRO SPARTA DOS 3.0s + +; nowa koncepcja: + +; 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 : +; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) następny bajt to liczba kolejno wczytanych sektorów +; 00000000 -- następny bajt to liczba kolejno wczytanych sektorów (razem z ew. pierwszym sektorem pliku) +; 00000001 -- następne 2 bajty to numer kolejnego sektora do odczytania, +; następny bajt to liczba kolejno wczytanych sektorów + +; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + org $1FFD + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 + + +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) +BootSHIFT = START-1 + +VSERIN = $020a + +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 + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = TopDriveMovedProc-$0a00 +; 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 = FirstMapSectorNr - offset1 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) +movedproc +; 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 + .WORD $0000 +FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym + TXA + PHA + LDA ToFileEndL + PHA + JSR [GoInitAddr-offset1] + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA [SecLen-offset1] + STA SecLenZ + JSR [FileGetBlockStart-offset1] ; pobranie dwoch bajtow (adres poczatku bloku) + AND InBlockAddr + CMP #$FF ; jesli oba sa $FF to..... + BNE FileNoFFFFHead + JSR [FileGetBlockStart-offset1] ; pobranie jeszcze raz +FileNoFFFFHead + JSR [FileGetByte-offset1] ; 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-offset1] ; 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-offset1] ; 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-offset1] ; do adresu inicjacji wpisanie adresu rozkazu RTS + STA $02E2 ; bo po kazdym bloku odbywa sie tam skok + LDA #>[Jrts-offset1] ; 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 SecLenZ ;; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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-offset1 ; 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-offset1 + BCS InBlockReadLoop ; tu zawsze jest CARRY, a w A kolejny bajt z pliku, wiec powrot do petli +FileGetBlockStart + JSR FileGetByte-offset1 + STA InBlockAddr + JSR FileGetByte-offset1 + STA InBlockAddr+1 + RTS +GoInitAddr + JMP ($02E2) +GoSelfTest + JMP JTESTROM +GetMapSector + LDX #>FileMapBuff + .BYTE $2c ; rozkaz BIT powodujacy ominiecie nastepnyc dwoch bajtow ... +GetDataSector + LDX #>FileSecBuff + STX blokDanychIO1-offset1+5 + STY DAUX1 + STA DAUX2 + ORA DAUX1 + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$09 +SetDCB + LDA [blokDanychIO1-offset1],X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BYTE $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+8 +CheckEOF + INC [ToFileEndH-offset1] + BNE NotEOF + INC [ToFileEndH-offset1]+1 + BNE NotEOF +EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + LDA #>[JTESTROM-1] + PHA + LDA #<[JTESTROM-1] + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + TYA + PHA + LDX PointInMap + CPX SecLenZ ;; jesli koniec mapy to trzeba pobrac jej nastepny sektor + BNE NotMapEnd + LDY FileMapBuff ;; pobranie numeru nastepnego sektora mapy + LDA FileMapBuff+$01 ;; (dwa pierwsze bajty sektora mapy) + JSR [GetMapSector-offset1] ; zaladowanie sektora mapy do bufora + LDX #$04 +NotMapEnd + LDA FileMapBuff,X ; pobranie z mapy numeru kolejnego sektora pliku + TAY + LDA FileMapBuff+1,X + INX + INX ; zwiekszenie wskaznika pozycji w mapie + STX PointInMap ; i zapisanie go + JSR [GetDataSector-offset1] ; wczytanie kolejnego sektora pliku do bufora + PLA + TAY + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + BEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i koncie procedury +; 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 + .WORD $0000 +LoadStart + ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP + LDY MEMLO + LDA MEMLO+1 + STA [InMemClearLoop-offset1]+2 +OutMemClearLoop + LDA #$00 +InMemClearLoop + STA $0900,Y + INY + BNE InMemClearLoop + INC [InMemClearLoop-offset1]+2 + LDA [InMemClearLoop-offset1]+2 + CMP MEMTOP+1 + BCC OutMemClearLoop + LDA MEMTOP+1 + STA [LastMemPageClear-offset1]+2 + LDY MEMTOP + LDA #$00 +LastMemPageClear + STA $8000,Y + DEY + CPY #$FF + BNE LastMemPageClear + ; wyczyszczona, wiec .... + LDA [FirstMapSectorNr-offset1]+1 + LDY [FirstMapSectorNr-offset1] + JSR [GetMapSector-offset1] ; ladowanie pierwszego sektora mapy do bufora + LDA #$04 + STA PointInMap + LDA [tempToFileEndL-offset1] + STA ToFileEndL + LDA #$FF + STA KBCODES + INC [WhatIsIt-offset1] ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR) + LDX [SecLen-offset1] ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora + JMP [FileNextBlock-offset1] +; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku +; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera +tempToFileEndL + .BYTE $00 ;2152 00 +JAkieTurbo + .BYTE $00 ; 0 - brak turbo + ; 1 - TopDrive lub XF + ; 2 - Speedy/Happy + ; 3 - HDI +; Rozkaz DCB odczytujacy blok PERCOM (12b) pod FirstSectorBuff +blokDanychIO2 + .BYTE $31,$01,$4E,$40 + .WORD FirstSectorBuff + .BYTE $07,$00,$0C,$00 ;2155 31 01 +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F ;2161 29 0F + ORA #$30 ;2163 09 30 + CMP #$3A ;2165 C9 3A + BCC labelka ;2167 90 03 + CLC ;2169 18 + ADC #$07 ;216A 69 07 +labelka + RTS + +Edriver + .BYTE "E:",$9b +mainprog + LDX #$00 + JSR CloseX ; Zamkniecie Ekranu + BMI ErrorDisplay + LDX #$00 + 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + LDA #$03 + STA JAkieTurbo ;wymuszenie sprawdzenia wszystkich turb + LDA SKSTAT + AND BootSHIFT ; sprawdzenie czy byl Shift przy starcie, wtedy obecny nie ma znaczenia + AND #$08 + BNE NoRunShift ; czy SHIFT w czasie odczytu glownego katalogu + ; tu jest 0 w A + STA JAkieTurbo ; wylacza wszystkie turba + BEQ ReadMainDir +NoRunShift +; tutaj sprawdzenie jakie mamy turbo i ustawienie odpowiednio znacznikow. + jsr CzyHDI ; sprawdzenie czy jest HDI i zaladowanie procedury (jesli jest), jesli nie Wartosc ujemna + bpl ReaDMainDir + dec JakieTurbo ; 2 + jsr CzyHappy ; sprawdzenie czy jest Happy/US i pobranie indeksu predkosci + bpl ReadMainDir + dec JakieTurbo ; 1 + jsr CzyXF ; sprawdzenie czy jest turbo XF + bpl ReadMainDir + dec JakieTurbo ; 0 + beq ReadMainDir ; skoczy zawsze bo 0 +Error148 + LDY #$94 ;21CF A0 94 +ErrorDisplay + TYA ;21D1 98 + PHA ;21D2 48 + JSR Close1 ;21D3 20 5F 28 + PLA ;21D6 68 + PHA ;21D7 48 + LSR A ;21D8 4A + LSR A ;21D9 4A + LSR A ;21DA 4A + LSR A ;21DB 4A + JSR bin2AsciiHex ;21DC 20 61 21 + STA ErrorNumHex ;21DF 8D F8 21 + PLA ;21E2 68 + JSR bin2AsciiHex ;21E3 20 61 21 + STA ErrorNumHex+1 ;21E6 8D F9 21 + JSR PrintXY ;21E9 20 88 27 + .BYTE $00,$00 ;21EC 00 + ;21ED 00 + .BYTE $7d ;21EE 7D 45 52 + .BYTE "ERROR - $" +ErrorNumHex + .BYTE "00",$00 ;21F8 30 + ;21F9 30 00 + LDA #$FF ;21FB A9 FF + STA KBCODES ;21FD 8D FC 02 +WaitKloop + LDX KBCODES ;2200 AE FC 02 + INX ;2203 E8 + BEQ WaitKloop ;2204 F0 FA + LDA #$FF ;2206 A9 FF + STA KBCODES ;2208 8D FC 02 + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie prechodzimy na D1 + LDA #$01 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ;220B 4C 70 21 +ReadMainDir + LDX #>FirstSectorBuff ;220E A2 29 + LDY #DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BYTE ":Main Dir. " + .BYTE +$80,"<" + .BYTE ":UP-DIR." + .BYTE $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesni nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA [GameName+12] ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BYTE $01 ;242F 01 +YposGameName + .BYTE $02 +GameKeySymbol + .BYTE "A) " ;2431 41 29 20 +GameName + .BYTE " " ;2434 20 20 20 + .BYTE $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL A ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA data03,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA data03+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS label67 ;2477 B0 35 + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP label02 ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP label71 ;24AB 4C EF 22 +label67 + JSR PrintXY ;24AE 20 88 27 + .BYTE $01,$15 ;24B1 01 15 + .BYTE $1D + .BYTE $00 ;24B3 1D 00 + JSR PrintXY ;24B5 20 88 27 + .BYTE $0E,$15 ;24B8 0E 15 + .BYTE $1D + .BYTE $00 ;24BA 1D 00 + JMP KeyboardProc ;24BC 4C C1 24 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey ;24C1 20 69 28 + PHA ;24C4 48 + LDA SKSTAT ;24C5 AD 0F D2 + AND BootSHIFT ; sprawdzenie czy byl Shift przy starcie, wtedy obecny nie ma znaczenia + AND #$08 ;24C8 29 08 + BNE NoSHIFT ;24CA D0 08 + LDA #$00 ;24CC A9 00 + STA JakieTurbo ;24CE 8D 53 21 +NoSHIFT + PLA ;24D4 68 + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + ; ale najpierw odshiftowanie (za pomoca tabelki tyle ze tu od 0 do 9 zeby miec na przyszlosc) + STA SprawdzShiftCyfra+1 ; zapamietujemy kod do porownan (przy okazji) + LDX #9 +PetlaShiftNaCyfre + LDA TablShift,X +SprawdzShiftCyfra + CMP #'! ; tu jest wstawiony kod wcisnietego klawisza do przeliczenia + BNE NieShiftCyfra + ; liczba wg tablicy + TXA + CLC + ADC #'0 + BNE JestShiftCyfra +NieShiftCyfra + DEX + BPL PetlaShiftNaCyfre + LDA SprawdzShiftCyfra+1 ; Jesli nie bylo w tablicy to przywracamy stary Accu +JestShiftCyfra + CMP #'1 + BCC NoNumber + CMP #'9 + BCS NoNumber + SEC + SBC #'0 + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +TablShift + .BYTE $29,$21,$22,$23,$24,$25,$26,$27,$40,$28,$29 ; cyfry 0-9 z Shift (kody) +NoNumber + SEC ;24E5 38 + SBC #$41 ; "A" ;24E6 E9 41 + CMP $D9 ;24E8 C5 D9 + BCS KeyboardProc ;24EA B0 D5 + ASL A ;24EC 0A + TAX ;24ED AA + LDA data03,X ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA data03+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + AND #$20 ;24FC 29 20 + BEQ label01 ;24FE F0 15 + LDY #$02 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP label02 ;2509 4C 34 22 +SubDirText + .BYTE "" ;250C 3C +label01 + JSR DiscChangeCheck ;2515 20 B3 28 + BEQ label04 ;2518 F0 03 + JMP ReadMainDir ;251A 4C 0E 22 +label04 + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA FirstMapSectorNr ;2521 8D 00 21 + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA FirstMapSectorNr+1 ;2527 8D 01 21 + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA ToFileEndH ;2537 8D 00 20 + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 FF + STA ToFileEndH+1 ;253F 8D 01 20 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #label06 ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + LDA #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 + LDX #$00 ;2597 A2 00 + LDA #$00 ;2599 A9 00 +ClearLoop1 + STA $0100,X ;259B 9D 00 01 + STA $0400,X ;259E 9D 00 04 + STA $0500,X ;25A1 9D 00 05 + STA $0600,X ;25A4 9D 00 06 + CPX #$80 ;25A7 E0 80 + BCC NoZpage ;25A9 90 02 + STA $00,X ;25AB 95 00 +NoZpage + INX ;25AD E8 + BNE ClearLoop1 ;25AE D0 EB + LDX #$FF ;25B0 A2 FF + TXS ;25B2 9A + JSR label07 ;25B3 20 B9 25 + JMP [LoadStart-offset1] ;25B6 4C 02 08 +label07 + LDA JakieTurbo ;25B9 AD 53 21 + CMP #$01 + BNE NoTopDriveLoader ;25BC F0 11 + LDX #[EndTopDriveProc-TopDriveMovedProc]-1 ;25BE A2 34 +label72 + LDA TopDriveMovedProc,X ;25C0 BD 0C 26 + STA $0A00,X ;25C3 9D 00 0A + DEX ;25C6 CA + BPL label72 ;25C7 10 F7 + LDY #[EndTopDriveProc-TopDriveMovedProc] ;25C9 A0 35 + LDX #$00 ;25CB A2 00 + BEQ label73 ;25CD F0 23 +NoTopDriveLoader +; LDA CzySpeedy ;25CF AD 54 21 +; BEQ NoSpeedyLoader ;25D2 F0 37 +;; Pytanie stacji o dlugosc procedury szybkiej transmisji +; LDY #blokDanychIO3 ;25D6 A2 26 +; JSR Table2DCB ;25D8 20 4D 28 +; JSR JSIOINT ;25DB 20 59 E4 +; BMI NoSpeedyLoader ;25DE 30 2B +;; Wczytanie procedury szybkiej transmisji pod $0a00 +; LDY #blokDanychIO4 ;25E2 A2 26 +; JSR Table2DCB ;25E4 20 4D 28 +; JSR JSIOINT ;25E7 20 59 E4 +; BMI NoSpeedyLoader ;25EA 30 1F +;; Dlugosc procedury szybkiej transmisji do X i Y +; LDY blokDanychIO4+8 ;25EC AC 55 26 +; LDX blokDanychIO4+9 ;25EF AE 56 26 +; jmp label73 +NoSpeedyLoader + CMP #$02 + BNE NoHappyLoader + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler +; ldy #blokDanychIO6 +; jsr Table2DCB +; jsr JSIOINT ; "?" +; bmi NoHappyLoader + + LDY #0 + LDX #[$A-1] ;xjsrA - the last +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC #HappyOffset + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + + + + + + + LDX #[EndHappyUSProc-HappyUSMovedProc] +label72x + LDA HappyUSMovedProc-1,X + STA $0A00-1,X + DEX + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA #<[TopDriveMovedProc-offset2] ;2601 A9 00 + STA [SioJMP-offset1]+1 ;2603 8D A7 07 + LDA #>[TopDriveMovedProc-offset2] ;2606 A9 0A + STA [SioJMP-offset1]+2 ;2608 8D A8 07 +NoHappyLoader + RTS ;260B 60 + + + +; 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 ; +HappyOffset=[HappyUSMovedProc-$a00] + + 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 +TopDriveMovedProc + LDA VSERIN ;260C AD 0A 02 + STA [OldSerInJmp-offset2]+1 ;260F 8D 33 0A + PHA ;2612 48 + LDA VSERIN+1 ;2613 AD 0B 02 + STA [OldSerInJmp-offset2]+2 ;2616 8D 34 0A + PHA ;2619 48 + LDA DCOMND ;261A AD 02 03 + ORA #$80 ;261D 09 80 + STA DCOMND ;261F 8D 02 03 + LDA #<[NewSerInInterrupt-offset2] ;2622 A9 2D + STA VSERIN ;2624 8D 0A 02 + LDA #>[NewSerInInterrupt-offset2] ;2627 A9 0A + STA VSERIN+1 ;2629 8D 0B 02 + JSR JSIOINT ;262C 20 59 E4 + PLA ;262F 68 + STA VSERIN+1 ;2630 8D 0B 02 + PLA ;2633 68 + STA VSERIN ;2634 8D 0A 02 + TYA ;2637 98 + RTS ;2638 60 +NewSerInInterrupt + LDA #$10 ;2639 A9 10 + STA AUDF3 ;263B 8D 04 D2 +OldSerInJmp + JMP $FFFF ;263E 4C FF FF +EndTopDriveProc +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 +; Rozkazy DCB do wszytania procedury turbo dla Speedy/HDI + .BYTE $31,$01,$3f,$40 + .WORD HappySpeed + .BYTE $07,$00,$01,$00,$00,$0A +;blokDanychIO3 +; .byte $31,$01,$68,$40 ;2641 31 01 +; .word [blokDanychIO4+8] +; .byte $07,$00,$02,$00,$00,$0A +;blokDanychIO4 +; .byte $31,$01,$69,$40,$00,$0A,$07,$00,$01,$00,$00,$0A ;264D 31 01 +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ;2666 20 B3 28 + BEQ label76 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +label76 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BYTE $31,$01,$52,$40 + .WORD DirMapSectorBuff + .BYTE $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BYTE $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL A ;279B 0A + ASL A ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL A ;27A0 0A + ASL A ;27A1 0A + ROL $DF ;27A2 26 DF + ASL A ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio ze sprawdzeniem czy nie TopDrive i odpowiedna modyfikacja +; procedury +GoSIO + LDY JakieTurbo + BEQ StandardSpeed + DEY ; sprawdzamy czy 1 + BEQ XFturbo + DEY ; sprawdzamy czy 2 + BNE HDIturbo ; jesli 3 + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed +HDIturbo ; na razie bez obslugi + JMP JSIOINT ;281D 4C 59 E4 +XFturbo +; Obsluga trybu TopDrive (XF)... + LDA VSERIN ;2820 AD 0A 02 + STA OldSerInJmp+1 ;2823 8D 3F 26 + PHA ;2826 48 + LDA VSERIN+1 ;2827 AD 0B 02 + STA OldSerInJmp+2 ;282A 8D 40 26 + PHA ;282D 48 + LDA DCOMND ;282E AD 02 03 + ORA #$80 ;2831 09 80 + STA DCOMND ;2833 8D 02 03 + LDA #NewSerInInterrupt ;283B A9 26 + STA VSERIN+1 ;283D 8D 0B 02 + JSR JSIOINT ;2840 20 59 E4 + PLA ;2843 68 + STA VSERIN+1 ;2844 8D 0B 02 + PLA ;2847 68 + STA VSERIN ;2848 8D 0A 02 + TYA ;284B 98 + RTS ;284C 60 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BYTE "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + +; Procedury różne +; Sprawdzenie czy HDI i odczyt procedury z urzadzenia +CzyHDI + LDY #128 ; błąd + RTS +CzyHappy + LDY #128 ; błąd + RTS +CzyXF + LDY #128 ; błąd + RTS +;; Odczyt bloku PERCOM procedura przeznaczona dla Top Drive (bo znacznik ustawiony) +; LDY #blokDanychIO2 ;21BE A2 21 +; JSR Table2DCB ;21C0 20 4D 28 +; JSR GoSIO ;21C3 20 18 28 +; BPL ReadMainDir ;21C6 10 46 +;; jesli PERCOM sie nie odczytal to nie mamy TopDrive +; LDA #$00 ;21C8 A9 00 +; STA CzyTopDrive ;21CA 8D 53 21 +; ;sprawdzamy jeszcze Happy/US-Doubler +; LDY #blokDanychIO6 +; JSR Table2DCB +; JSR JSIOINT +; BPL ReadMainDir +; ; jezeli predkosc sie nie odczytala to brak Happy/US +; ; ustawienie standardowej predkosci +; LDA #$28 +; STA HappySpeed +; LDA #$00 +; STA CzyHappyUS +; BEQ ReadMainDir ;21CD F0 3F + + + ; Ustawia numer satcji wg A +SeTDriveNR + STA blokDanychIO1+1 + STA blokDanychIO2+1 +; sta blokDanychIO3 +; sta blokDanychIO4 + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #['0+$80] + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BYTE $08,$00 +DriveDisp2 + .BYTE +$80,"1" + .BYTE $00 + RTS + +xjsrTableL + .BYTE <[xjsr1+1],<[xjsr2+1],<[xjsr3+1],<[xjsr4+1],<[xjsr5+1] + .BYTE <[xjsr6+1],<[xjsr7+1],<[xjsr8+1],<[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BYTE >[xjsr1+1],>[xjsr2+1],>[xjsr3+1],>[xjsr4+1],>[xjsr5+1] + .BYTE >[xjsr6+1],>[xjsr7+1],>[xjsr8+1],>[xjsr9+1],>[xjsrA+1] + + +data03 + *=*+$30 +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; tutaj sektor katalogu +FirstRun + LDA SKSTAT ; uruchamia sie tylko raz na starcie loadera + AND #$08 + STA BootSHIFT ; zapamietanie stanu Shift z bootowania +; ale jesli jest QMEG.... to odwracamy ten stan :) + ldy #$06 ; bo 6 znaków w ROMie testujemy +testQMEGloop + LDA $C001,y + CMP QMEGstring,y + bne brakQMEGa + dey + bpl testQMEGloop + ; jest QMEG - EORujemy odpowiedni bit i mamy odwrotny shift + LDA BootSHIFT + EOR #$08 + STA BootSHIFT +brakQMEGa + LDA DUNIT ; zapamietanie numeru urzadzenia + AND #$0F + JSR SeTDriveNR + JMP mainprog +QMEGstring + .BYTE "QMEG-OS" + .BYTE "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + *=$02e0 + .WORD START ;02E0 FD 1F + + .OPT List \ No newline at end of file diff --git a/old_versions/msdos40.asm b/old_versions/msdos40.asm new file mode 100644 index 0000000..f2b110c --- /dev/null +++ b/old_versions/msdos40.asm @@ -0,0 +1,1713 @@ + ;MICRO SPARTA DOS 3.0s + +; nowa koncepcja: + +; 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 : +; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) następny bajt to liczba kolejno wczytanych sektorów +; 00000000 -- następny bajt to liczba kolejno wczytanych sektorów (razem z ew. pierwszym sektorem pliku) +; 00000001 -- następne 2 bajty to numer kolejnego sektora do odczytania, +; następny bajt to liczba kolejno wczytanych sektorów + +; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + +; po bledzie odczytu program zawsze wraca na dysk nr.1 - jesli nie jest podpiety - to mamy petle nieskonczona - poprawic!!! + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 + + +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) +BootSHIFT = START-1 + +VSERIN = $020a + +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 + +AUDF3 = $d204 +AUDF4 = $d206 +AUDC4 = $d207 +AUDCTL = $d208 +SKSTRES = $d20a +SEROUT = $D20d +SERIN = $D20d +IRQEN = $D20e +IRQST = $D20e + + +SKSTAT = $d20f +SKCTL = $d20f + + +PBCTL = $d303 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = TopDriveMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen + STA SecLenZ + 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 SecLenZ ;; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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) +GoSelfTest + JMP JTESTROM +GetMapSector + LDX #>FileMapBuff + .BY $2c ; rozkaz BIT powodujacy ominiecie nastepnyc dwoch bajtow ... +GetDataSector + LDX #>FileSecBuff + STX blokDanychIO1+5 + STY DAUX1 + STA DAUX2 + ORA DAUX1 + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$09 +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+8 ; SecLen wskazuje na komurki do wpisania długości sektora przed przepisaniem procki na stronę $0700 +CheckEOF + INC ToFileEndH + BNE NotEOF + INC ToFileEndH+1 + BNE NotEOF +EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + LDA #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + TYA + PHA + LDX PointInMap + CPX SecLenZ ;; jesli koniec mapy to trzeba pobrac jej nastepny sektor + BNE NotMapEnd + LDY FileMapBuff ;; pobranie numeru nastepnego sektora mapy + LDA FileMapBuff+$01 ;; (dwa pierwsze bajty sektora mapy) + JSR GetMapSector ; zaladowanie sektora mapy do bufora + LDX #$04 +NotMapEnd + LDA FileMapBuff,X ; pobranie z mapy numeru kolejnego sektora pliku + TAY + LDA FileMapBuff+1,X + INX + INX ; zwiekszenie wskaznika pozycji w mapie + STX PointInMap ; i zapisanie go + JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + PLA + TAY + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + BEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i koncie procedury +; 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 + .if zzzzzz>$0800 + .error "zzzzz!!!" + .endif +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 FirstMapSectorNr+1 + LDY FirstMapSectorNr + JSR GetMapSector ; ladowanie pierwszego sektora mapy do bufora + LDA #$04 + STA PointInMap + 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 + JMP FileNextBlock +; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku +; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera + .endl +tempToFileEndL + .BY $00 ;2152 00 +JAkieTurbo + .BY $00 ; 0 - brak turbo + ; 1 - TopDrive lub XF + ; 2 - Speedy/Happy + ; 3 - HDI +; Rozkaz DCB odczytujacy blok PERCOM (12b) pod FirstSectorBuff +blokDanychIO2 + .BY $31,$01,$4E,$40 + .WO FirstSectorBuff + .BY $07,$00,$0C,$00 ;2155 31 01 +; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A) +bin2AsciiHex + AND #$0F ;2161 29 0F + ORA #$30 ;2163 09 30 + CMP #$3A ;2165 C9 3A + BCC labelka ;2167 90 03 + CLC ;2169 18 + ADC #$07 ;216A 69 07 +labelka + RTS + +Edriver + .BY "E:",$9b +mainprog + LDX #$00 + JSR CloseX ; Zamkniecie Ekranu + BMI ErrorDisplay + LDX #$00 + 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + LDA #$03 + STA JAkieTurbo ;wymuszenie sprawdzenia wszystkich turb + LDA SKSTAT + AND BootSHIFT ; sprawdzenie czy byl Shift przy starcie, wtedy obecny nie ma znaczenia + AND #$08 + BNE NoRunShift ; czy SHIFT w czasie odczytu glownego katalogu + ; tu jest 0 w A + STA JAkieTurbo ; wylacza wszystkie turba + BEQ ReadMainDir +NoRunShift +; tutaj sprawdzenie jakie mamy turbo i ustawienie odpowiednio znacznikow. + jsr CzyHDI ; sprawdzenie czy jest HDI i zaladowanie procedury (jesli jest), jesli nie Wartosc ujemna + bpl ReaDMainDir + dec JakieTurbo ; 2 + jsr CzyHappy ; sprawdzenie czy jest Happy/US i pobranie indeksu predkosci + bpl ReadMainDir + dec JakieTurbo ; 1 + jsr CzyXF ; sprawdzenie czy jest turbo XF + bpl ReadMainDir + dec JakieTurbo ; 0 + beq ReadMainDir ; skoczy zawsze bo 0 +Error148 + LDY #$94 ;21CF A0 94 +ErrorDisplay + TYA ;21D1 98 + PHA ;21D2 48 + JSR Close1 ;21D3 20 5F 28 + PLA ;21D6 68 + PHA ;21D7 48 + LSR ;21D8 4A + LSR ;21D9 4A + LSR ;21DA 4A + LSR ;21DB 4A + JSR bin2AsciiHex ;21DC 20 61 21 + STA ErrorNumHex ;21DF 8D F8 21 + PLA ;21E2 68 + JSR bin2AsciiHex ;21E3 20 61 21 + STA ErrorNumHex+1 ;21E6 8D F9 21 + JSR PrintXY ;21E9 20 88 27 + .BY $00,$00 ;21EC 00 + ;21ED 00 + .BY $7d ;21EE 7D 45 52 + .BY "ERROR - $" +ErrorNumHex + .BY "00",$00 ;21F8 30 + ;21F9 30 00 + LDA #$FF ;21FB A9 FF + STA KBCODES ;21FD 8D FC 02 +WaitKloop + LDX KBCODES ;2200 AE FC 02 + INX ;2203 E8 + BEQ WaitKloop ;2204 F0 FA + LDA #$FF ;2206 A9 FF + STA KBCODES ;2208 8D FC 02 + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie prechodzimy na D1 + LDA #$01 + JSR SeTDriveNR + ; ----------------- + JMP mainprog ;220B 4C 70 21 +ReadMainDir + LDX #>FirstSectorBuff ;220E A2 29 + LDY #DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesni nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS label67 ;2477 B0 35 + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP label02 ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP label71 ;24AB 4C EF 22 +label67 + JSR PrintXY ;24AE 20 88 27 + .BY $01,$15 ;24B1 01 15 + .BY $1D + .BY $00 ;24B3 1D 00 + JSR PrintXY ;24B5 20 88 27 + .BY $0E,$15 ;24B8 0E 15 + .BY $1D + .BY $00 ;24BA 1D 00 + JMP KeyboardProc ;24BC 4C C1 24 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey ;24C1 20 69 28 + PHA ;24C4 48 + LDA SKSTAT ;24C5 AD 0F D2 + AND BootSHIFT ; sprawdzenie czy byl Shift przy starcie, wtedy obecny nie ma znaczenia + AND #$08 ;24C8 29 08 + BNE NoSHIFT ;24CA D0 08 + LDA #$00 ;24CC A9 00 + STA JakieTurbo ;24CE 8D 53 21 +NoSHIFT + PLA ;24D4 68 + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + ; ale najpierw odshiftowanie (za pomoca tabelki tyle ze tu od 0 do 9 zeby miec na przyszlosc) + STA SprawdzShiftCyfra+1 ; zapamietujemy kod do porownan (przy okazji) + LDX #9 +PetlaShiftNaCyfre + LDA TablShift,X +SprawdzShiftCyfra + CMP #'!' ; tu jest wstawiony kod wcisnietego klawisza do przeliczenia + BNE NieShiftCyfra + ; liczba wg tablicy + TXA + CLC + ADC #'0' + BNE JestShiftCyfra +NieShiftCyfra + DEX + BPL PetlaShiftNaCyfre + LDA SprawdzShiftCyfra+1 ; Jesli nie bylo w tablicy to przywracamy stary Accu +JestShiftCyfra + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +TablShift + .BY $29,$21,$22,$23,$24,$25,$26,$27,$40,$28,$29 ; cyfry 0-9 z Shift (kody) +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ;24E6 E9 41 + CMP $D9 ;24E8 C5 D9 + BCS KeyboardProc ;24EA B0 D5 + ASL ;24EC 0A + TAX ;24ED AA + LDA FirstSectorsTable,X ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + AND #$20 ;24FC 29 20 + BEQ label01 ;24FE F0 15 + LDY #$02 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP label02 ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +label01 + JSR DiscChangeCheck ;2515 20 B3 28 + BEQ label04 ;2518 F0 03 + JMP ReadMainDir ;251A 4C 0E 22 +label04 + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 FF + STA .adr loader.ToFileEndH+1 ; przed przepisaniem + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #label06 ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + LDA #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 + LDX #$00 ;2597 A2 00 + LDA #$00 ;2599 A9 00 +ClearLoop1 + STA $0100,X ;259B 9D 00 01 + STA $0400,X ;259E 9D 00 04 + STA $0500,X ;25A1 9D 00 05 + STA $0600,X ;25A4 9D 00 06 + CPX #$80 ;25A7 E0 80 + BCC NoZpage ;25A9 90 02 + STA $00,X ;25AB 95 00 +NoZpage + INX ;25AD E8 + BNE ClearLoop1 ;25AE D0 EB + LDX #$FF ;25B0 A2 FF + TXS ;25B2 9A + JSR label07 ;25B3 20 B9 25 + JMP loader.LoadStart ; po przepisaniu +label07 + LDA JakieTurbo ;25B9 AD 53 21 + CMP #$01 + BNE NoTopDriveLoader ;25BC F0 11 + LDX #[EndTopDriveProc-TopDriveMovedProc]-1 ;25BE A2 34 +label72 + LDA TopDriveMovedProc,X ;25C0 BD 0C 26 + STA $0A00,X ;25C3 9D 00 0A + DEX ;25C6 CA + BPL label72 ;25C7 10 F7 + LDY #[EndTopDriveProc-TopDriveMovedProc] ;25C9 A0 35 + LDX #$00 ;25CB A2 00 + BEQ label73 ;25CD F0 23 +NoTopDriveLoader +; LDA CzySpeedy ;25CF AD 54 21 +; BEQ NoSpeedyLoader ;25D2 F0 37 +;; Pytanie stacji o dlugosc procedury szybkiej transmisji +; LDY #blokDanychIO3 ;25D6 A2 26 +; JSR Table2DCB ;25D8 20 4D 28 +; JSR JSIOINT ;25DB 20 59 E4 +; BMI NoSpeedyLoader ;25DE 30 2B +;; Wczytanie procedury szybkiej transmisji pod $0a00 +; LDY #blokDanychIO4 ;25E2 A2 26 +; JSR Table2DCB ;25E4 20 4D 28 +; JSR JSIOINT ;25E7 20 59 E4 +; BMI NoSpeedyLoader ;25EA 30 1F +;; Dlugosc procedury szybkiej transmisji do X i Y +; LDY blokDanychIO4+8 ;25EC AC 55 26 +; LDX blokDanychIO4+9 ;25EF AE 56 26 +; jmp label73 +NoSpeedyLoader + CMP #$02 + BNE NoHappyLoader + ; Pytanie stacji o predkosc transmisji Happy/US-Doubler +; ldy #blokDanychIO6 +; jsr Table2DCB +; jsr JSIOINT ; "?" +; bmi NoHappyLoader + + LDY #0 + LDX #[$A-1] ;xjsrA - the last +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC #HappyOffset + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + + + + + + + LDX #[EndHappyUSProc-HappyUSMovedProc] +label72x + LDA HappyUSMovedProc-1,X + STA $0A00-1,X + DEX + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA #<[TopDriveMovedProc-offset2] ;2601 A9 00 + STA loader.SioJMP+1 ; po przepisaniu + LDA #>[TopDriveMovedProc-offset2] ;2606 A9 0A + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 ; +HappyOffset=[HappyUSMovedProc-$a00] + + 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 +TopDriveMovedProc + LDA VSERIN ;260C AD 0A 02 + STA OldSerInJmp-offset2+1 ;260F 8D 33 0A + PHA ;2612 48 + LDA VSERIN+1 ;2613 AD 0B 02 + STA OldSerInJmp-offset2+2 ;2616 8D 34 0A + PHA ;2619 48 + LDA DCOMND ;261A AD 02 03 + ORA #$80 ;261D 09 80 + STA DCOMND ;261F 8D 02 03 + LDA #<(NewSerInInterrupt-offset2) ;2622 A9 2D + STA VSERIN ;2624 8D 0A 02 + LDA #>(NewSerInInterrupt-offset2) ;2627 A9 0A + STA VSERIN+1 ;2629 8D 0B 02 + JSR JSIOINT ;262C 20 59 E4 + PLA ;262F 68 + STA VSERIN+1 ;2630 8D 0B 02 + PLA ;2633 68 + STA VSERIN ;2634 8D 0A 02 + TYA ;2637 98 + RTS ;2638 60 +NewSerInInterrupt + LDA #$10 ;2639 A9 10 + STA AUDF3 ;263B 8D 04 D2 +OldSerInJmp + JMP $FFFF ;263E 4C FF FF +EndTopDriveProc +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 +; Rozkazy DCB do wszytania procedury turbo dla Speedy/HDI + .BY $31,$01,$3f,$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +;blokDanychIO3 +; .BY $31,$01,$68,$40 ;2641 31 01 +; .WO [blokDanychIO4+8] +; .BY $07,$00,$02,$00,$00,$0A +;blokDanychIO4 +; .BY $31,$01,$69,$40,$00,$0A,$07,$00,$01,$00,$00,$0A ;264D 31 01 +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ;2666 20 B3 28 + BEQ label76 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +label76 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio ze sprawdzeniem czy nie TopDrive i odpowiedna modyfikacja +; procedury +GoSIO + LDY JakieTurbo + BEQ StandardSpeed + DEY ; sprawdzamy czy 1 + BEQ XFturbo + DEY ; sprawdzamy czy 2 + BNE HDIturbo ; jesli 3 + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed +HDIturbo ; na razie bez obslugi + JMP JSIOINT ;281D 4C 59 E4 +XFturbo +; Obsluga trybu TopDrive (XF)... + LDA VSERIN ;2820 AD 0A 02 + STA OldSerInJmp+1 ;2823 8D 3F 26 + PHA ;2826 48 + LDA VSERIN+1 ;2827 AD 0B 02 + STA OldSerInJmp+2 ;282A 8D 40 26 + PHA ;282D 48 + LDA DCOMND ;282E AD 02 03 + ORA #$80 ;2831 09 80 + STA DCOMND ;2833 8D 02 03 + LDA #NewSerInInterrupt ;283B A9 26 + STA VSERIN+1 ;283D 8D 0B 02 + JSR JSIOINT ;2840 20 59 E4 + PLA ;2843 68 + STA VSERIN+1 ;2844 8D 0B 02 + PLA ;2847 68 + STA VSERIN ;2848 8D 0A 02 + TYA ;284B 98 + RTS ;284C 60 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + +; Procedury różne +; Sprawdzenie czy HDI i odczyt procedury z urzadzenia +CzyHDI + LDY #128 ; błąd + RTS +CzyHappy + LDY #128 ; błąd + RTS +CzyXF + LDY #128 ; błąd + RTS +;; Odczyt bloku PERCOM procedura przeznaczona dla Top Drive (bo znacznik ustawiony) +; LDY #blokDanychIO2 ;21BE A2 21 +; JSR Table2DCB ;21C0 20 4D 28 +; JSR GoSIO ;21C3 20 18 28 +; BPL ReadMainDir ;21C6 10 46 +;; jesli PERCOM sie nie odczytal to nie mamy TopDrive +; LDA #$00 ;21C8 A9 00 +; STA CzyTopDrive ;21CA 8D 53 21 +; ;sprawdzamy jeszcze Happy/US-Doubler +; LDY #blokDanychIO6 +; JSR Table2DCB +; JSR JSIOINT +; BPL ReadMainDir +; ; jezeli predkosc sie nie odczytala to brak Happy/US +; ; ustawienie standardowej predkosci +; LDA #$28 +; STA HappySpeed +; LDA #$00 +; STA CzyHappyUS +; BEQ ReadMainDir ;21CD F0 3F + + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO2+1 +; sta blokDanychIO3 +; sta blokDanychIO4 + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $08,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + RTS + +xjsrTableL + .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1],<[xjsr4+1],<[xjsr5+1] + .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1],<[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1],>[xjsr4+1],>[xjsr5+1] + .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1],>[xjsr9+1],>[xjsrA+1] + + +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + org *+$30 + +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; tutaj sektor katalogu +FirstRun + LDA SKSTAT ; uruchamia sie tylko raz na starcie loadera + AND #$08 + STA BootSHIFT ; zapamietanie stanu Shift z bootowania +; ale jesli jest QMEG.... to odwracamy ten stan :) + ldy #$06 ; bo 6 znaków w ROMie testujemy +testQMEGloop + LDA $C001,y + CMP QMEGstring,y + bne brakQMEGa + dey + bpl testQMEGloop + ; jest QMEG - EORujemy odpowiedni bit i mamy odwrotny shift + LDA BootSHIFT + EOR #$08 + STA BootSHIFT +brakQMEGa + LDA DUNIT ; zapamietanie numeru urzadzenia + AND #$0F + JSR SeTDriveNR + JMP mainprog +QMEGstring + .BY "QMEG-OS" + .BY "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + org $02e0 + .WO START ;02E0 FD 1F + + ;.OPT List \ No newline at end of file diff --git a/old_versions/msdos41.asm b/old_versions/msdos41.asm new file mode 100644 index 0000000..d867e62 --- /dev/null +++ b/old_versions/msdos41.asm @@ -0,0 +1,1620 @@ + ;MICRO SPARTA DOS 3.0s + +; nowa koncepcja: + +; 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 : +; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) następny bajt to liczba kolejno wczytanych sektorów +; 00000000 -- następny bajt to liczba kolejno wczytanych sektorów (razem z ew. pierwszym sektorem pliku) +; 00000001 -- następne 2 bajty to numer kolejnego sektora do odczytania, +; następny bajt to liczba kolejno wczytanych sektorów + +; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 + + +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) + +VSERIN = $020a + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen + STA SecLenZ + 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 SecLenZ ;; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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) +GoSelfTest + JMP JTESTROM +GetMapSector + LDX #>FileMapBuff + .BY $2c ; rozkaz BIT powodujacy ominiecie nastepnyc dwoch bajtow ... +GetDataSector + LDX #>FileSecBuff + STX blokDanychIO1+5 + STY DAUX1 + STA DAUX2 + ORA DAUX1 + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$09 +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+8 ; SecLen wskazuje na komurki do wpisania długości sektora przed przepisaniem procki na stronę $0700 +CheckEOF + INC ToFileEndH + BNE NotEOF + INC ToFileEndH+1 + BNE NotEOF +EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + LDA #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + TYA + PHA + LDX PointInMap + CPX SecLenZ ;; jesli koniec mapy to trzeba pobrac jej nastepny sektor + BNE NotMapEnd + LDY FileMapBuff ;; pobranie numeru nastepnego sektora mapy + LDA FileMapBuff+$01 ;; (dwa pierwsze bajty sektora mapy) + JSR GetMapSector ; zaladowanie sektora mapy do bufora + LDX #$04 +NotMapEnd + LDA FileMapBuff,X ; pobranie z mapy numeru kolejnego sektora pliku + TAY + LDA FileMapBuff+1,X + INX + INX ; zwiekszenie wskaznika pozycji w mapie + STX PointInMap ; i zapisanie go + JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + PLA + TAY + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + BEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i koncie procedury +; 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 + .if zzzzzz>$0800 + .error "zzzzz!!!" + .endif +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 FirstMapSectorNr+1 + LDY FirstMapSectorNr + JSR GetMapSector ; ladowanie pierwszego sektora mapy do bufora + LDA #$04 + STA PointInMap + 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 + JMP FileNextBlock +; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku +; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera +tempToFileEndL + .BY $00 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; na wypadek wybrania nieistniejacej stacji + ; po bledzie przechodzimy na te z ktorej sie ladowalismy + LDA BootDrive + JSR SeTDriveNR + ; ----------------- + JMP mainprog ; i odpalamy program od nowa +ReadMainDir + LDX #>FirstSectorBuff ;220E A2 29 + LDY #= 4.39 (moga byc sektory wieksze niz 256b) + BNE Error148 ; Nieobslugiwany format dyskietki +SpartaDisk + LDX #$00 +; pobranie dlugosci sektora ($00 lub $80) + LDA FirstSectorBuff+$1F + STA .adr loader.SecLen ; przed przepisaniem + BMI Sektor128b + STX .adr loader.SecLen ; przed przepisaniem + TAX + INX ; i wyliczenie starszego bajtu +Sektor128b +label38 + STX .adr loader.SecLen+1 ; przed przepisaniem +; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + LDY FirstSectorBuff+$09 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 FF + STA .adr loader.ToFileEndH+1 ; przed przepisaniem + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + LDA #TempMEMLO ;256E A9 0A + STA MEMLO+1 ;2570 8D E8 02 + STA APPMHI+1 ;2573 85 0F + LDA #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 + LDX #$00 ;2597 A2 00 + LDA #$00 ;2599 A9 00 +; 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 + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 + LDY #0 + LDX #[$A-1] ;xjsrA - the last +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC #HappyOffset + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + + LDX #[EndHappyUSProc-HappyUSMovedProc] +label72x + LDA HappyUSMovedProc-1,X + STA $0A00-1,X + DEX + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA #<[HappyUSMovedProc-offset2] ;2601 A9 00 + STA loader.SioJMP+1 ; po przepisaniu + LDA #>[HappyUSMovedProc-offset2] ;2606 A9 0A + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 ; +HappyOffset=[HappyUSMovedProc-$a00] + + 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 + +xjsrTableL + .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1],<[xjsr4+1],<[xjsr5+1] + .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1],<[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1],>[xjsr4+1],>[xjsr5+1] + .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1],>[xjsr9+1],>[xjsrA+1] + +ONtext + .BY +$80,"ON " +OFFtext + .BY +$80,"OFF" +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + org *+$30 + +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; 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 + JMP mainprog +QMEGstring + .BY "QMEG-OS" + .BY "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + org $02e0 + .WO START + + ;.OPT List \ No newline at end of file diff --git a/old_versions/msdos42.asm b/old_versions/msdos42.asm new file mode 100644 index 0000000..7ccc815 --- /dev/null +++ b/old_versions/msdos42.asm @@ -0,0 +1,1876 @@ + ;MICRO SPARTA DOS 4.2 + +; nowa koncepcja: + +; 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 + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +CompressedMapPos = $2A ; 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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) + +VSERIN = $020a + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen + STA SecLenZ + 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 SecLenZ ;; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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) +GoSelfTest + JMP JTESTROM +GetMapSector + LDX #>FileMapBuff + .BY $2c ; rozkaz BIT powodujacy ominiecie nastepnyc dwoch bajtow ... +GetDataSector + LDX #>FileSecBuff + STX blokDanychIO1+5 + STY DAUX1 + STA DAUX2 + ORA DAUX1 + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$09 +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700 +CheckEOF + INC ToFileEndH + BNE NotEOF + INC ToFileEndH+1 + BNE NotEOF +EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku + LDA #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + SEC +Jrts + RTS +; Wczytanie do bufora kolejnego sektora pliku, kolejny bajt pliku w A, a CARRY ustawiony!!! +GetNextFileSect + TYA + PHA + LDX PointInMap + CPX SecLenZ ;; jesli koniec mapy to trzeba pobrac jej nastepny sektor + BNE NotMapEnd + LDY FileMapBuff ;; pobranie numeru nastepnego sektora mapy + LDA FileMapBuff+$01 ;; (dwa pierwsze bajty sektora mapy) + JSR GetMapSector ; zaladowanie sektora mapy do bufora + LDX #$04 +NotMapEnd + LDA FileMapBuff,X ; pobranie z mapy numeru kolejnego sektora pliku + TAY + LDA FileMapBuff+1,X + INX + INX ; zwiekszenie wskaznika pozycji w mapie + STX PointInMap ; i zapisanie go + JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + PLA + TAY + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + BEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i koncie procedury +; 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 + .if zzzzzz>$0800 + .error "zzzzz!!!" + .endif +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 FirstMapSectorNr+1 + LDY FirstMapSectorNr + JSR GetMapSector ; ladowanie pierwszego sektora mapy do bufora + LDA #$04 + STA PointInMap + 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 + JMP FileNextBlock +; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku +; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera +tempToFileEndL + .BY $00 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + LDY #= 4.39 (moga byc sektory wieksze niz 256b) + BNE Error148 ; Nieobslugiwany format dyskietki +SpartaDisk + LDX #$00 +; pobranie dlugosci sektora ($00 lub $80) + LDA FirstSectorBuff+$1F + STA .adr loader.SecLen ; przed przepisaniem + BMI Sektor128b + STX .adr loader.SecLen ; przed przepisaniem + TAX + INX ; i wyliczenie starszego bajtu +Sektor128b +label38 + STX .adr loader.SecLen+1 ; przed przepisaniem +; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + LDY FirstSectorBuff+$09 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 +CompressedMap = DirSectorBuff +; czytamy pierwszy sektor mapy + LDY #DirMapSectorBuff + Jsr ReadSector +; pobieramy numer pierwszego sektora pliku + LDA DirMapSectorBuff+4 + STA FirstFileSector + STA PrevFileSector + LDA DirMapSectorBuff+5 + STA FirstFileSector+1 + sta PrevFileSector+1 + ; Inicjujemy liczniki + .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80 + .zpvar FirstFileSector, PrevFileSector, MapPositionMem .word + .zpvar SectorOffset .word + .zpvar SectorsCounter .byte + LDA #$00 + STA MapCounter+1 + STA CompressedMapCounter + STA CompressedMapCounter+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 + CMP #$FF + BEQ OffsetToBig + 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 + BPL LessThen128 + LDA #$FF + JSR AddToCompressedMAP + LDA SectorOffset + SEC + SBC #%01111111 +LessThen128 + 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} + JNE GenerateCompressedMap +; czytamy nastepny sektor mapy + ; sprawdzmy czy nie koniec + LDA DirMapSectorBuff + ORA DirMapSectorBuff+1 + BEQ EndMakingMap + LDA DirMapSectorBuff + sta blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 + ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej + ADW MEMLO CompressedMapCounter + LDA #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + JMP * + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 + LDY #0 + LDX #[$A-1] ;xjsrA - the last +HappyRelocate + SEC + LDA xjsrTableL,x + STA SecBuffer + LDA xjsrTableH,x + STA SecBuffer+1 + LDA (SecBuffer),y + SBC #HappyOffset + STA (SecBuffer),y + DEY + DEX + BPL HappyRelocate + + + LDX #[EndHappyUSProc-HappyUSMovedProc] +label72x + LDA HappyUSMovedProc-1,X + STA $0A00-1,X + DEX + BNE label72x + LDY #[EndHappyUSProc-HappyUSMovedProc] + LDX #$00 +; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej. +label73 + TYA ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA #<[HappyUSMovedProc-offset2] ;2601 A9 00 + STA loader.SioJMP+1 ; po przepisaniu + LDA #>[HappyUSMovedProc-offset2] ;2606 A9 0A + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 ; +HappyOffset=[HappyUSMovedProc-$a00] + + 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 + +xjsrTableL + .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1],<[xjsr4+1],<[xjsr5+1] + .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1],<[xjsr9+1],<[xjsrA+1] +xjsrTableH + .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1],>[xjsr4+1],>[xjsr5+1] + .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1],>[xjsr9+1],>[xjsrA+1] + +ONtext + .BY +$80,"ON " +OFFtext + .BY +$80,"OFF" +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + org *+$30 + +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; 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 + JMP mainprog +QMEGstring + .BY "QMEG-OS" + .BY "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + + ;.OPT List + +GetNextFileSec2010 + tya + pha +ReadNextInSequence +SectorSequenceCount = *+1 + lda #$00 ; to już ma być zainicjowane!!! + beq NextMapPosition + dec SectorSequenceCount + inc DAUX1 + bne noIncDAUX2 + inc DAUX2 +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 + ldx #0 + lda (CompressedMapPos,X) ;clever :) + bmi HowManyToSkip + beq SetNewStartSector + ;tutaj jest ile kolejnych sektorów przeczytać w sekwencji + sta SectorSequenceCount + bne ReadNextInSequence ;zawsze skoczy +HowManyToSkip + and #%01111111 + clc + adc DAUX1 + sta DAUX1 + bne noIncDAUX2_v2 + inc DAUX2 +noIncDAUX2_v2 + bne ReadyToRead + ;jak jest tutaj to jest błąd... + ;powinien być skok do self-testu... +SetNewStartSector + jsr incCompressedMapPos + lda (CompressedMapPos,X) + sta DAUX1 + jsr incCompressedMapPos + lda (CompressedMapPos,X) + sta DAUX2 + + +ReadyToRead + ;JSR GetDataSector ; wczytanie kolejnego sektora pliku do bufora + + pla + tay + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + ;JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + +incCompressedMapPos + inc CompressedMapPos + bne skipIncCompressedMapPos + inc CompressedMapPos+1 +skipIncCompressedMapPos + rts + + + + + org $02e0 + .WO START diff --git a/old_versions/msdos42b.asm b/old_versions/msdos42b.asm new file mode 100644 index 0000000..35dcd01 --- /dev/null +++ b/old_versions/msdos42b.asm @@ -0,0 +1,1880 @@ + ;MICRO SPARTA DOS 4.2 + +; nowa koncepcja: + +; 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 + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) + +VSERIN = $020a + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen + STA SecLenZ + 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 SecLenZ ;; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + 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 + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + +incCompressedMapPos + inc CompressedMapPos + bne skipIncCompressedMapPos + inc CompressedMapPos+1 +skipIncCompressedMapPos + rts +; 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 .... +FirstFileSectorL=*+1 + LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku + STA DAUX1 +FirstFileSectorH=*+1 + LDA #$FF + STA DAUX2 + 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 + ;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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + LDY #= 4.39 (moga byc sektory wieksze niz 256b) + BNE Error148 ; Nieobslugiwany format dyskietki +SpartaDisk + LDX #$00 +; pobranie dlugosci sektora ($00 lub $80) + LDA FirstSectorBuff+$1F + STA .adr loader.SecLen ; przed przepisaniem + BMI Sektor128b + STX .adr loader.SecLen ; przed przepisaniem + TAX + INX ; i wyliczenie starszego bajtu +Sektor128b +label38 + STX .adr loader.SecLen+1 ; przed przepisaniem +; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + LDY FirstSectorBuff+$09 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 + CMP #$FF + BEQ OffsetToBig + 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 + BPL LessThen128 + LDA #$FF + JSR AddToCompressedMAP + LDA SectorOffset + SEC + SBC #%01111111 +LessThen128 + 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} + JNE GenerateCompressedMap +; czytamy nastepny sektor mapy + ; sprawdzmy czy nie koniec + LDA DirMapSectorBuff + ORA DirMapSectorBuff+1 + BEQ EndMakingMap + LDA DirMapSectorBuff + sta blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 + +ONtext + .BY +$80,"ON " +OFFtext + .BY +$80,"OFF" +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + org *+$30 + +ProgramEnd +FirstSectorBuff=[[>[*-1]]+1]*$100 ;$2900 ; tutaj pierwszy sektor dysku ($80 bajtow) +DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu +DirSectorBuff=FirstSectorBuff+$180 ; 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 + JMP mainprog +QMEGstring + .BY "QMEG-OS" + .BY "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + + ;.OPT List + + + + + + org $02e0 + .WO START diff --git a/old_versions/msdos42c.asm b/old_versions/msdos42c.asm new file mode 100644 index 0000000..4667a9f --- /dev/null +++ b/old_versions/msdos42c.asm @@ -0,0 +1,1886 @@ + ;MICRO SPARTA DOS 4.2 + +; nowa koncepcja: + +; 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 + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) + +VSERIN = $020a + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen + STA SecLenZ + 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 SecLenZ ;; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + 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 + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + +incCompressedMapPos + inc CompressedMapPos + bne skipIncCompressedMapPos + inc CompressedMapPos+1 +skipIncCompressedMapPos + rts +; 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 .... +FirstFileSectorL=*+1 + LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku + STA DAUX1 +FirstFileSectorH=*+1 + LDA #$FF + STA DAUX2 + 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 + ;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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + LDY #= 4.39 (moga byc sektory wieksze niz 256b) + BNE Error148 ; Nieobslugiwany format dyskietki +SpartaDisk + LDX #$00 +; pobranie dlugosci sektora ($00 lub $80) + LDA FirstSectorBuff+$1F + STA .adr loader.SecLen ; przed przepisaniem + BMI Sektor128b + STX .adr loader.SecLen ; przed przepisaniem + TAX + INX ; i wyliczenie starszego bajtu +Sektor128b +label38 + STX .adr loader.SecLen+1 ; przed przepisaniem +; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu + LDY FirstSectorBuff+$09 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP label57 ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + LDY #$0A ;23FC A0 0A +label62 + LDA ($D4),Y ;23FE B1 D4 + CMP GameName,Y ;2400 D9 34 24 + BNE label61 ;2403 D0 11 + DEY ;2405 88 + BPL label62 ;2406 10 F6 +; Wpisanie nazwy "ekranowej" zamiast nazwy pliku + LDY #$0B ;2408 A0 0B +label63 + LDA ($D4),Y ;240A B1 D4 + STA GameName-$0B,Y ;240C 99 29 24 + INY ;240F C8 + CPY #$2E ;2410 C0 2E + BCC label63 ;2412 90 F6 + BCS label57 ;2414 B0 0E +label61 + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +label57 + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 + CMP #$FF + BEQ OffsetToBig + 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 + BPL LessThen128 + LDA #$FF + JSR AddToCompressedMAP + LDA SectorOffset + SEC + SBC #%01111111 +LessThen128 + 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 + +ONtext + .BY +$80,"ON " +OFFtext + .BY +$80,"OFF" +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS" + .BY "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + + ;.OPT List + + + + + + org $02e0 + .WO START diff --git a/old_versions/msdos42d.asm b/old_versions/msdos42d.asm new file mode 100644 index 0000000..18995c7 --- /dev/null +++ b/old_versions/msdos42d.asm @@ -0,0 +1,1895 @@ + ;MICRO SPARTA DOS 4.2 + +; nowa koncepcja: + +; 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 + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) + +VSERIN = $020a + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen + STA SecLenZ + 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 SecLenZ ;; sprawdzenie czy juz caly sektor przepisany jesli tak + BEQ GoGetNextFileSect ;; skok do procedury pobrania nastepnego sektora + LDA FileSecBuff,X + INX +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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; nie EOF, ale moze koniec sektora + BEQ GetNextFileSect ;; jesli tak to pobieramy nastepny +ByteToACCU + LDA FileSecBuff,X ;; pobranie bajtu z pliku do A + INX + 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 + LDX #$00 ; wyzerowanie wskaznika bajtu w sektorze + JEQ ByteToACCU ; skok do pobrania bajtu z pliku do A i konc + +incCompressedMapPos + inc CompressedMapPos + bne skipIncCompressedMapPos + inc CompressedMapPos+1 +skipIncCompressedMapPos + rts +; 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 .... +FirstFileSectorL=*+1 + LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku + STA DAUX1 +FirstFileSectorH=*+1 + LDA #$FF + STA DAUX2 + 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 + ;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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + 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 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP GameNamePrint ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + 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 ;2414 B0 0E +CheckNextName + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +GameNamePrint + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 + CMP #$FF + BEQ OffsetToBig + 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 + BPL LessThen128 + LDA #$FF + JSR AddToCompressedMAP + LDA SectorOffset + SEC + SBC #%01111111 +LessThen128 + 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 $0e,$15,$a0 +ONtext + .BY +$80,"ON " +OFFtext + .BY +$80,"OFF" +; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS" + .BY "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + + ;.OPT List + + + + + + org $02e0 + .WO START diff --git a/old_versions/msdos42e.asm b/old_versions/msdos42e.asm new file mode 100644 index 0000000..c38aa89 --- /dev/null +++ b/old_versions/msdos42e.asm @@ -0,0 +1,1931 @@ + ;MICRO SPARTA DOS 4.2e + + ; wersja e powinna odczytac program zapisany na dysku o dowolnej dlugosci sektora + ; przetestowane dla 126 i 256b .... czekamy na testy KMK dla 512b + ; nie jest zrobiona obsluga wczytywania meny dla dluzszych sektorow, ale loader uznajemy za skonczony !!! + +; nowa koncepcja: + +; 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 + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji +; o obrabianym pliku (skok co $17) +CurrentFileInfoBuff = $D0 +; Aders bufora mapy sektorow aktualnego katalogu +DirMapSect = $D2 + +; Stan klawisza Shift w chwili uruchomienia programu (zapamietany toz przed nim) + +VSERIN = $020a + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen ; przepisanie mlodszego bajtu dlugosci sektora na ZP - zeby kod byl krotszy! + STA SecLenZ + 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 SecLenZ ;; 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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; 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 .... +FirstFileSectorL=*+1 + LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku + STA DAUX1 +FirstFileSectorH=*+1 + LDA #$FF + STA DAUX2 + 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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + 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 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP GameNamePrint ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + 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 ;2414 B0 0E +CheckNextName + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +GameNamePrint + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 + CMP #$FF + BEQ OffsetToBig + 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 + BPL LessThen128 + LDA #$FF + JSR AddToCompressedMAP + LDA SectorOffset + SEC + SBC #%01111111 +LessThen128 + 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS" + .BY "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + + ;.OPT List + + + + + + org $02e0 + .WO START diff --git a/old_versions/msdos42f.as8 b/old_versions/msdos42f.as8 new file mode 100644 index 0000000..f0c56a8 --- /dev/null +++ b/old_versions/msdos42f.as8 @@ -0,0 +1,1960 @@ + ;MICRO SPARTA DOS 4.2f + + ; wersja e powinna odczytac program zapisany na dysku o dowolnej dlugosci sektora + ; przetestowane dla 126 i 256b .... czekamy na testy KMK dla 512b + ; nie jest zrobiona obsluga wczytywania menu dla dluzszych sektorow, ale loader uznajemy za skonczony !!! + + ; w wersji f ma byc skonczona obsluga menu - czyli wlasciwie wszystko :) + +; nowa koncepcja: + +; 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 + +; 5. w wolne miejsca kitramy co się da (np. do buforu magnetofonu) + + + ;START ADDR = 1FFD + ;END ADDR = 28C9 + ;.OPT noList +acktimeout = $a +readtimeout = 2 + + +STACKP = $0318 +CRITIC = $42 +DRETRY = $02BD +CASFLG = $030F +CRETRY = $029C + + +CASINI = $02 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (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 +; 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 + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen ; przepisanie mlodszego bajtu dlugosci sektora na ZP - zeby kod byl krotszy! + STA SecLenZ + 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 SecLenZ ;; 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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; 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 .... +;FirstFileSectorL=*+1 +; LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku +; STA DAUX1 ; juz nie potrzebne, bo i tak pierwszy rozkaz mapy wskazuje na ten sektor +;FirstFileSectorH=*+1 +; LDA #$FF +; STA DAUX2 + 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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + 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 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP GameNamePrint ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + 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 ;2414 B0 0E +CheckNextName + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +GameNamePrint + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 + CMP #$FF + BEQ OffsetToBig + 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 + BPL LessThen128 + LDA #$FF + JSR AddToCompressedMAP + LDA SectorOffset + SEC + SBC #%01111111 +LessThen128 + 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y ;269B BD 80 29 + STA blokDanychIO5+10 ;269E 8D 85 27 + INY + LDA (TempZP),Y ;26A1 BD 81 29 + STA blokDanychIO5+11 ;26A4 8D 86 27 + ORA blokDanychIO5+10 ;26A7 0D 85 27 + BEQ label75 ;26AA F0 61 + ; i zwiekszenie wskaznika mapy o 2 + INY ;26AD E8 + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + ; STX $D6 ;26AE 86 D6 + LDA MEMTOP ;26B0 AD E5 02 + SEC ;26B3 38 + SBC CurrentFileInfoBuff ;26B4 E5 D0 + LDA MEMTOP+1 ;26B6 AD E6 02 + SBC CurrentFileInfoBuff+1 ;26B9 E5 D1 + BEQ label75 ;26BB F0 50 + LDY CurrentFileInfoBuff ;26BD A4 D0 + LDX CurrentFileInfoBuff+1 ;26BF A6 D1 + JSR ReadSector ;26C1 20 48 27 + LDA $D4 ;26C4 A5 D4 + ORA $D5 ;26C6 05 D5 + BNE label79 ;26C8 D0 16 + LDY #$03 ;26CA A0 03 + LDA (CurrentFileInfoBuff),Y ;26CC B1 D0 + STA $D4 ;26CE 85 D4 + INY ;26D0 C8 + LDA (CurrentFileInfoBuff),Y ;26D1 B1 D0 + STA $D5 ;26D3 85 D5 + INY ;26D5 C8 + LDA (CurrentFileInfoBuff),Y ;26D6 B1 D0 + BEQ label79 ;26D8 F0 06 + LDA #$FF ;26DA A9 FF + STA $D4 ;26DC 85 D4 + STA $D5 ;26DE 85 D5 +label79 + LDA CurrentFileInfoBuff ;26E0 A5 D0 + CLC ;26E2 18 + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff ;26E6 85 D0 + LDA CurrentFileInfoBuff+1 ;26E8 A5 D1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 ;26ED 85 D1 + LDA $D4 ;26EF A5 D4 + SEC ;26F1 38 + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 ;26F5 85 D4 + LDA $D5 ;26F7 A5 D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 ;26FC 85 D5 + BCS label80 ;26FE B0 94 + LDA CurrentFileInfoBuff ;2700 A5 D0 + CLC ;2702 18 + ADC $D4 ;2703 65 D4 + STA CurrentFileInfoBuff ;2705 85 D0 + LDA CurrentFileInfoBuff+1 ;2707 A5 D1 + ADC $D5 ;2709 65 D5 + STA CurrentFileInfoBuff+1 ;270B 85 D1 +label75 + LDA $DC ;270D A5 DC + CMP CurrentFileInfoBuff+1 ;270F C5 D1 + BCC label81 ;2711 90 0B + BNE label82 ;2713 D0 17 + LDA $DB ;2715 A5 DB + CMP CurrentFileInfoBuff ;2717 C5 D0 + BCC label81 ;2719 90 03 + BNE label82 ;271B D0 0F + RTS ;271D 60 +label81 + LDA $DB ;271E A5 DB + CLC ;2720 18 + ADC $DA ;2721 65 DA + STA $DB ;2723 85 DB + BCC label75 ;2725 90 E6 + INC $DC ;2727 E6 DC + JMP label75 ;2729 4C 0D 27 +label82 + LDA $DB ;272C A5 DB + SEC ;272E 38 + SBC $DA ;272F E5 DA + STA CurrentFileInfoBuff ;2731 85 D0 + LDA $DC ;2733 A5 DC + SBC #$00 ;2735 E9 00 + STA CurrentFileInfoBuff+1 ;2737 85 D1 + RTS ;2739 60 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 ;273A A9 01 + STA blokDanychIO5+10 ;273C 8D 85 27 + LDA #$00 ;273F A9 00 + STA blokDanychIO5+11 ;2741 8D 86 27 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA #$80 ;2744 A9 80 + BNE ReadSectorA ;2746 D0 03 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +; Wczytuje sektor (numer musi byc juz podany w blokDanychIO5 !!) +; o dlugosci A($00 lub $80) pod adres X(starszy) Y(mlodszy) +ReadSectorA + STA blokDanychIO5+8 ;274B 8D 83 27 + STX blokDanychIO5+5 ;274E 8E 80 27 + STY blokDanychIO5+4 ;2751 8C 7F 27 + ;LDX #$00 ;2754 A2 00 + ;LDA blokDanychIO5+8 ;2756 AD 83 27 + ;BNE label84 ;2759 D0 01 + ;INX ;275B E8 +;label84 ; to zostalo zrobione wczesniej przez kod do obslugi dluzszych sektorow !!! + ;STX blokDanychIO5+9 ;275C 8E 84 27 + LDA #$04 ;275F A9 04 + STA DiskRetryCount ;2761 8D 87 27 +DiskReadRetry + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS" + .BY "HS procedures for Happy/US-Doubler by Pecus & Pirx 25-08-2002" + + ;.OPT List + + + + + + org $02e0 + .WO START diff --git a/old_versions/msdos43.as8 b/old_versions/msdos43.as8 new file mode 100644 index 0000000..dfefb7b --- /dev/null +++ b/old_versions/msdos43.as8 @@ -0,0 +1,1949 @@ + ;MICRO SPARTA DOS 4.3 + + +; 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 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (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 +; 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 + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen ; przepisanie mlodszego bajtu dlugosci sektora na ZP - zeby kod byl krotszy! + STA SecLenZ + 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 SecLenZ ;; 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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; 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 .... +;FirstFileSectorL=*+1 +; LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku +; STA DAUX1 ; juz nie potrzebne, bo i tak pierwszy rozkaz mapy wskazuje na ten sektor +;FirstFileSectorH=*+1 +; LDA #$FF +; STA DAUX2 + 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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + 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 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP GameNamePrint ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + 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 ;2414 B0 0E +CheckNextName + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +GameNamePrint + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 + CMP #$FF + BEQ OffsetToBig + 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 + BPL LessThen128 + LDA #$FF + JSR AddToCompressedMAP + LDA SectorOffset + SEC + SBC #%01111111 +LessThen128 + 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y ;269B BD 80 29 + STA blokDanychIO5+10 ;269E 8D 85 27 + INY + LDA (TempZP),Y ;26A1 BD 81 29 + STA blokDanychIO5+11 ;26A4 8D 86 27 + ORA blokDanychIO5+10 ;26A7 0D 85 27 + BEQ label75 ;26AA F0 61 + ; i zwiekszenie wskaznika mapy o 2 + INY ;26AD E8 + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + ; STX $D6 ;26AE 86 D6 + LDA MEMTOP ;26B0 AD E5 02 + SEC ;26B3 38 + SBC CurrentFileInfoBuff ;26B4 E5 D0 + LDA MEMTOP+1 ;26B6 AD E6 02 + SBC CurrentFileInfoBuff+1 ;26B9 E5 D1 + BEQ label75 ;26BB F0 50 + LDY CurrentFileInfoBuff ;26BD A4 D0 + LDX CurrentFileInfoBuff+1 ;26BF A6 D1 + JSR ReadSector ;26C1 20 48 27 + LDA $D4 ;26C4 A5 D4 + ORA $D5 ;26C6 05 D5 + BNE label79 ;26C8 D0 16 + LDY #$03 ;26CA A0 03 + LDA (CurrentFileInfoBuff),Y ;26CC B1 D0 + STA $D4 ;26CE 85 D4 + INY ;26D0 C8 + LDA (CurrentFileInfoBuff),Y ;26D1 B1 D0 + STA $D5 ;26D3 85 D5 + INY ;26D5 C8 + LDA (CurrentFileInfoBuff),Y ;26D6 B1 D0 + BEQ label79 ;26D8 F0 06 + LDA #$FF ;26DA A9 FF + STA $D4 ;26DC 85 D4 + STA $D5 ;26DE 85 D5 +label79 + LDA CurrentFileInfoBuff ;26E0 A5 D0 + CLC ;26E2 18 + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff ;26E6 85 D0 + LDA CurrentFileInfoBuff+1 ;26E8 A5 D1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 ;26ED 85 D1 + LDA $D4 ;26EF A5 D4 + SEC ;26F1 38 + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 ;26F5 85 D4 + LDA $D5 ;26F7 A5 D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 ;26FC 85 D5 + BCS label80 ;26FE B0 94 + LDA CurrentFileInfoBuff ;2700 A5 D0 + CLC ;2702 18 + ADC $D4 ;2703 65 D4 + STA CurrentFileInfoBuff ;2705 85 D0 + LDA CurrentFileInfoBuff+1 ;2707 A5 D1 + ADC $D5 ;2709 65 D5 + STA CurrentFileInfoBuff+1 ;270B 85 D1 +label75 + LDA $DC ;270D A5 DC + CMP CurrentFileInfoBuff+1 ;270F C5 D1 + BCC label81 ;2711 90 0B + BNE label82 ;2713 D0 17 + LDA $DB ;2715 A5 DB + CMP CurrentFileInfoBuff ;2717 C5 D0 + BCC label81 ;2719 90 03 + BNE label82 ;271B D0 0F + RTS ;271D 60 +label81 + LDA $DB ;271E A5 DB + CLC ;2720 18 + ADC $DA ;2721 65 DA + STA $DB ;2723 85 DB + BCC label75 ;2725 90 E6 + INC $DC ;2727 E6 DC + JMP label75 ;2729 4C 0D 27 +label82 + LDA $DB ;272C A5 DB + SEC ;272E 38 + SBC $DA ;272F E5 DA + STA CurrentFileInfoBuff ;2731 85 D0 + LDA $DC ;2733 A5 DC + SBC #$00 ;2735 E9 00 + STA CurrentFileInfoBuff+1 ;2737 85 D1 + RTS ;2739 60 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 ;273A A9 01 + STA blokDanychIO5+10 ;273C 8D 85 27 + LDA #$00 ;273F A9 00 + STA blokDanychIO5+11 ;2741 8D 86 27 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA #$80 ;2744 A9 80 + BNE ReadSectorA ;2746 D0 03 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +; Wczytuje sektor (numer musi byc juz podany w blokDanychIO5 !!) +; o dlugosci A($00 lub $80) pod adres X(starszy) Y(mlodszy) +ReadSectorA + STA blokDanychIO5+8 ;274B 8D 83 27 + STX blokDanychIO5+5 ;274E 8E 80 27 + STY blokDanychIO5+4 ;2751 8C 7F 27 + ;LDX #$00 ;2754 A2 00 + ;LDA blokDanychIO5+8 ;2756 AD 83 27 + ;BNE label84 ;2759 D0 01 + ;INX ;275B E8 +;label84 ; to zostalo zrobione wczesniej przez kod do obslugi dluzszych sektorow !!! + ;STX blokDanychIO5+9 ;275C 8E 84 27 + LDA #$04 ;275F A9 04 + STA DiskRetryCount ;2761 8D 87 27 +DiskReadRetry + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS",0 + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 26-05-2010" + ;.OPT List + + + org $02e0 + .WO START diff --git a/old_versions/msdos43b.as8 b/old_versions/msdos43b.as8 new file mode 100644 index 0000000..26cd3ab --- /dev/null +++ b/old_versions/msdos43b.as8 @@ -0,0 +1,1957 @@ + ;MICRO SPARTA DOS 4.3b + +; 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 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (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 +; 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 + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen ; przepisanie mlodszego bajtu dlugosci sektora na ZP - zeby kod byl krotszy! + STA SecLenZ + 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 SecLenZ ;; 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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; 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 .... +;FirstFileSectorL=*+1 +; LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku +; STA DAUX1 ; juz nie potrzebne, bo i tak pierwszy rozkaz mapy wskazuje na ten sektor +;FirstFileSectorH=*+1 +; LDA #$FF +; STA DAUX2 + 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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + 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 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP GameNamePrint ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + 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 ;2414 B0 0E +CheckNextName + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +GameNamePrint + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y ;269B BD 80 29 + STA blokDanychIO5+10 ;269E 8D 85 27 + INY + LDA (TempZP),Y ;26A1 BD 81 29 + STA blokDanychIO5+11 ;26A4 8D 86 27 + ORA blokDanychIO5+10 ;26A7 0D 85 27 + BEQ label75 ;26AA F0 61 + ; i zwiekszenie wskaznika mapy o 2 + INY ;26AD E8 + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + ; STX $D6 ;26AE 86 D6 + LDA MEMTOP ;26B0 AD E5 02 + SEC ;26B3 38 + SBC CurrentFileInfoBuff ;26B4 E5 D0 + LDA MEMTOP+1 ;26B6 AD E6 02 + SBC CurrentFileInfoBuff+1 ;26B9 E5 D1 + BEQ label75 ;26BB F0 50 + LDY CurrentFileInfoBuff ;26BD A4 D0 + LDX CurrentFileInfoBuff+1 ;26BF A6 D1 + JSR ReadSector ;26C1 20 48 27 + LDA $D4 ;26C4 A5 D4 + ORA $D5 ;26C6 05 D5 + BNE label79 ;26C8 D0 16 + LDY #$03 ;26CA A0 03 + LDA (CurrentFileInfoBuff),Y ;26CC B1 D0 + STA $D4 ;26CE 85 D4 + INY ;26D0 C8 + LDA (CurrentFileInfoBuff),Y ;26D1 B1 D0 + STA $D5 ;26D3 85 D5 + INY ;26D5 C8 + LDA (CurrentFileInfoBuff),Y ;26D6 B1 D0 + BEQ label79 ;26D8 F0 06 + LDA #$FF ;26DA A9 FF + STA $D4 ;26DC 85 D4 + STA $D5 ;26DE 85 D5 +label79 + LDA CurrentFileInfoBuff ;26E0 A5 D0 + CLC ;26E2 18 + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff ;26E6 85 D0 + LDA CurrentFileInfoBuff+1 ;26E8 A5 D1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 ;26ED 85 D1 + LDA $D4 ;26EF A5 D4 + SEC ;26F1 38 + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 ;26F5 85 D4 + LDA $D5 ;26F7 A5 D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 ;26FC 85 D5 + BCS label80 ;26FE B0 94 + LDA CurrentFileInfoBuff ;2700 A5 D0 + CLC ;2702 18 + ADC $D4 ;2703 65 D4 + STA CurrentFileInfoBuff ;2705 85 D0 + LDA CurrentFileInfoBuff+1 ;2707 A5 D1 + ADC $D5 ;2709 65 D5 + STA CurrentFileInfoBuff+1 ;270B 85 D1 +label75 + LDA $DC ;270D A5 DC + CMP CurrentFileInfoBuff+1 ;270F C5 D1 + BCC label81 ;2711 90 0B + BNE label82 ;2713 D0 17 + LDA $DB ;2715 A5 DB + CMP CurrentFileInfoBuff ;2717 C5 D0 + BCC label81 ;2719 90 03 + BNE label82 ;271B D0 0F + RTS ;271D 60 +label81 + LDA $DB ;271E A5 DB + CLC ;2720 18 + ADC $DA ;2721 65 DA + STA $DB ;2723 85 DB + BCC label75 ;2725 90 E6 + INC $DC ;2727 E6 DC + JMP label75 ;2729 4C 0D 27 +label82 + LDA $DB ;272C A5 DB + SEC ;272E 38 + SBC $DA ;272F E5 DA + STA CurrentFileInfoBuff ;2731 85 D0 + LDA $DC ;2733 A5 DC + SBC #$00 ;2735 E9 00 + STA CurrentFileInfoBuff+1 ;2737 85 D1 + RTS ;2739 60 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 ;273A A9 01 + STA blokDanychIO5+10 ;273C 8D 85 27 + LDA #$00 ;273F A9 00 + STA blokDanychIO5+11 ;2741 8D 86 27 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA #$80 ;2744 A9 80 + BNE ReadSectorA ;2746 D0 03 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +; Wczytuje sektor (numer musi byc juz podany w blokDanychIO5 !!) +; o dlugosci A($00 lub $80) pod adres X(starszy) Y(mlodszy) +ReadSectorA + STA blokDanychIO5+8 ;274B 8D 83 27 + STX blokDanychIO5+5 ;274E 8E 80 27 + STY blokDanychIO5+4 ;2751 8C 7F 27 + ;LDX #$00 ;2754 A2 00 + ;LDA blokDanychIO5+8 ;2756 AD 83 27 + ;BNE label84 ;2759 D0 01 + ;INX ;275B E8 +;label84 ; to zostalo zrobione wczesniej przez kod do obslugi dluzszych sektorow !!! + ;STX blokDanychIO5+9 ;275C 8E 84 27 + LDA #$04 ;275F A9 04 + STA DiskRetryCount ;2761 8D 87 27 +DiskReadRetry + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'0'+$80 + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"1" + .BY $00 + 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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS",0 + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 26-05-2010" + ;.OPT List + + + org $02e0 + .WO START diff --git a/old_versions/msdos44.as8 b/old_versions/msdos44.as8 new file mode 100644 index 0000000..f664ca1 --- /dev/null +++ b/old_versions/msdos44.as8 @@ -0,0 +1,1958 @@ + ;MICRO SPARTA DOS 4.4 + +; obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera +; wyswietlanie "numeru" napedu zawsze przy pomocy litery (jak w Sparcie w sumie....) + + +; 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 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (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 +; 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 + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen ; przepisanie mlodszego bajtu dlugosci sektora na ZP - zeby kod byl krotszy! + STA SecLenZ + 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 SecLenZ ;; 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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; 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 .... +;FirstFileSectorL=*+1 +; LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku +; STA DAUX1 ; juz nie potrzebne, bo i tak pierwszy rozkaz mapy wskazuje na ten sektor +;FirstFileSectorH=*+1 +; LDA #$FF +; STA DAUX2 + 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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + 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 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP GameNamePrint ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + 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 ;2414 B0 0E +CheckNextName + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +GameNamePrint + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + CMP #$10 + BCC toSetDrive ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' +toSetDrive + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 + CMP #$FF + BEQ OffsetToBig + 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 + BPL LessThen128 + LDA #$FF + JSR AddToCompressedMAP + LDA SectorOffset + SEC + SBC #%01111111 +LessThen128 + 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y ;269B BD 80 29 + STA blokDanychIO5+10 ;269E 8D 85 27 + INY + LDA (TempZP),Y ;26A1 BD 81 29 + STA blokDanychIO5+11 ;26A4 8D 86 27 + ORA blokDanychIO5+10 ;26A7 0D 85 27 + BEQ label75 ;26AA F0 61 + ; i zwiekszenie wskaznika mapy o 2 + INY ;26AD E8 + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + ; STX $D6 ;26AE 86 D6 + LDA MEMTOP ;26B0 AD E5 02 + SEC ;26B3 38 + SBC CurrentFileInfoBuff ;26B4 E5 D0 + LDA MEMTOP+1 ;26B6 AD E6 02 + SBC CurrentFileInfoBuff+1 ;26B9 E5 D1 + BEQ label75 ;26BB F0 50 + LDY CurrentFileInfoBuff ;26BD A4 D0 + LDX CurrentFileInfoBuff+1 ;26BF A6 D1 + JSR ReadSector ;26C1 20 48 27 + LDA $D4 ;26C4 A5 D4 + ORA $D5 ;26C6 05 D5 + BNE label79 ;26C8 D0 16 + LDY #$03 ;26CA A0 03 + LDA (CurrentFileInfoBuff),Y ;26CC B1 D0 + STA $D4 ;26CE 85 D4 + INY ;26D0 C8 + LDA (CurrentFileInfoBuff),Y ;26D1 B1 D0 + STA $D5 ;26D3 85 D5 + INY ;26D5 C8 + LDA (CurrentFileInfoBuff),Y ;26D6 B1 D0 + BEQ label79 ;26D8 F0 06 + LDA #$FF ;26DA A9 FF + STA $D4 ;26DC 85 D4 + STA $D5 ;26DE 85 D5 +label79 + LDA CurrentFileInfoBuff ;26E0 A5 D0 + CLC ;26E2 18 + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff ;26E6 85 D0 + LDA CurrentFileInfoBuff+1 ;26E8 A5 D1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 ;26ED 85 D1 + LDA $D4 ;26EF A5 D4 + SEC ;26F1 38 + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 ;26F5 85 D4 + LDA $D5 ;26F7 A5 D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 ;26FC 85 D5 + BCS label80 ;26FE B0 94 + LDA CurrentFileInfoBuff ;2700 A5 D0 + CLC ;2702 18 + ADC $D4 ;2703 65 D4 + STA CurrentFileInfoBuff ;2705 85 D0 + LDA CurrentFileInfoBuff+1 ;2707 A5 D1 + ADC $D5 ;2709 65 D5 + STA CurrentFileInfoBuff+1 ;270B 85 D1 +label75 + LDA $DC ;270D A5 DC + CMP CurrentFileInfoBuff+1 ;270F C5 D1 + BCC label81 ;2711 90 0B + BNE label82 ;2713 D0 17 + LDA $DB ;2715 A5 DB + CMP CurrentFileInfoBuff ;2717 C5 D0 + BCC label81 ;2719 90 03 + BNE label82 ;271B D0 0F + RTS ;271D 60 +label81 + LDA $DB ;271E A5 DB + CLC ;2720 18 + ADC $DA ;2721 65 DA + STA $DB ;2723 85 DB + BCC label75 ;2725 90 E6 + INC $DC ;2727 E6 DC + JMP label75 ;2729 4C 0D 27 +label82 + LDA $DB ;272C A5 DB + SEC ;272E 38 + SBC $DA ;272F E5 DA + STA CurrentFileInfoBuff ;2731 85 D0 + LDA $DC ;2733 A5 DC + SBC #$00 ;2735 E9 00 + STA CurrentFileInfoBuff+1 ;2737 85 D1 + RTS ;2739 60 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 ;273A A9 01 + STA blokDanychIO5+10 ;273C 8D 85 27 + LDA #$00 ;273F A9 00 + STA blokDanychIO5+11 ;2741 8D 86 27 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA #$80 ;2744 A9 80 + BNE ReadSectorA ;2746 D0 03 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +; Wczytuje sektor (numer musi byc juz podany w blokDanychIO5 !!) +; o dlugosci A($00 lub $80) pod adres X(starszy) Y(mlodszy) +ReadSectorA + STA blokDanychIO5+8 ;274B 8D 83 27 + STX blokDanychIO5+5 ;274E 8E 80 27 + STY blokDanychIO5+4 ;2751 8C 7F 27 + ;LDX #$00 ;2754 A2 00 + ;LDA blokDanychIO5+8 ;2756 AD 83 27 + ;BNE label84 ;2759 D0 01 + ;INX ;275B E8 +;label84 ; to zostalo zrobione wczesniej przez kod do obslugi dluzszych sektorow !!! + ;STX blokDanychIO5+9 ;275C 8E 84 27 + LDA #$04 ;275F A9 04 + STA DiskRetryCount ;2761 8D 87 27 +DiskReadRetry + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"A" + .BY $00 + 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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS",0 + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 26-05-2010" + ;.OPT List + + + org $02e0 + .WO START diff --git a/old_versions/msdos44b.as8 b/old_versions/msdos44b.as8 new file mode 100644 index 0000000..c76a834 --- /dev/null +++ b/old_versions/msdos44b.as8 @@ -0,0 +1,1966 @@ + ;MICRO SPARTA DOS 4.4b + +; obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera +; wyswietlanie "numeru" napedu zawsze przy pomocy litery (jak w Sparcie w sumie....) + +; 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 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (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 +; 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 + +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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen ; przepisanie mlodszego bajtu dlugosci sektora na ZP - zeby kod byl krotszy! + STA SecLenZ + 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 SecLenZ ;; 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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; 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 .... +;FirstFileSectorL=*+1 +; LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku +; STA DAUX1 ; juz nie potrzebne, bo i tak pierwszy rozkaz mapy wskazuje na ten sektor +;FirstFileSectorH=*+1 +; LDA #$FF +; STA DAUX2 + 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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + LDA #$C4 ; ustawienie koloru tła + STA COLPF2S + STA COLBAKS + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + 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 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP GameNamePrint ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT +label60 + 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 ;2414 B0 0E +CheckNextName + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +GameNamePrint + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f) + CMP #$10 + BCC toSetDrive ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku) + ; sprawdzenie klawiszy 1-8 + CMP #'1' + BCC NoNumber + CMP #'9' + BCS NoNumber + SEC + SBC #'0' +toSetDrive + JSR SeTDriveNR +; jmp MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!! + and #$08 + BNE NoSHIFT + STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0 +NoSHIFT + LDY #$01 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y ;269B BD 80 29 + STA blokDanychIO5+10 ;269E 8D 85 27 + INY + LDA (TempZP),Y ;26A1 BD 81 29 + STA blokDanychIO5+11 ;26A4 8D 86 27 + ORA blokDanychIO5+10 ;26A7 0D 85 27 + BEQ label75 ;26AA F0 61 + ; i zwiekszenie wskaznika mapy o 2 + INY ;26AD E8 + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + ; STX $D6 ;26AE 86 D6 + LDA MEMTOP ;26B0 AD E5 02 + SEC ;26B3 38 + SBC CurrentFileInfoBuff ;26B4 E5 D0 + LDA MEMTOP+1 ;26B6 AD E6 02 + SBC CurrentFileInfoBuff+1 ;26B9 E5 D1 + BEQ label75 ;26BB F0 50 + LDY CurrentFileInfoBuff ;26BD A4 D0 + LDX CurrentFileInfoBuff+1 ;26BF A6 D1 + JSR ReadSector ;26C1 20 48 27 + LDA $D4 ;26C4 A5 D4 + ORA $D5 ;26C6 05 D5 + BNE label79 ;26C8 D0 16 + LDY #$03 ;26CA A0 03 + LDA (CurrentFileInfoBuff),Y ;26CC B1 D0 + STA $D4 ;26CE 85 D4 + INY ;26D0 C8 + LDA (CurrentFileInfoBuff),Y ;26D1 B1 D0 + STA $D5 ;26D3 85 D5 + INY ;26D5 C8 + LDA (CurrentFileInfoBuff),Y ;26D6 B1 D0 + BEQ label79 ;26D8 F0 06 + LDA #$FF ;26DA A9 FF + STA $D4 ;26DC 85 D4 + STA $D5 ;26DE 85 D5 +label79 + LDA CurrentFileInfoBuff ;26E0 A5 D0 + CLC ;26E2 18 + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff ;26E6 85 D0 + LDA CurrentFileInfoBuff+1 ;26E8 A5 D1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 ;26ED 85 D1 + LDA $D4 ;26EF A5 D4 + SEC ;26F1 38 + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 ;26F5 85 D4 + LDA $D5 ;26F7 A5 D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 ;26FC 85 D5 + BCS label80 ;26FE B0 94 + LDA CurrentFileInfoBuff ;2700 A5 D0 + CLC ;2702 18 + ADC $D4 ;2703 65 D4 + STA CurrentFileInfoBuff ;2705 85 D0 + LDA CurrentFileInfoBuff+1 ;2707 A5 D1 + ADC $D5 ;2709 65 D5 + STA CurrentFileInfoBuff+1 ;270B 85 D1 +label75 + LDA $DC ;270D A5 DC + CMP CurrentFileInfoBuff+1 ;270F C5 D1 + BCC label81 ;2711 90 0B + BNE label82 ;2713 D0 17 + LDA $DB ;2715 A5 DB + CMP CurrentFileInfoBuff ;2717 C5 D0 + BCC label81 ;2719 90 03 + BNE label82 ;271B D0 0F + RTS ;271D 60 +label81 + LDA $DB ;271E A5 DB + CLC ;2720 18 + ADC $DA ;2721 65 DA + STA $DB ;2723 85 DB + BCC label75 ;2725 90 E6 + INC $DC ;2727 E6 DC + JMP label75 ;2729 4C 0D 27 +label82 + LDA $DB ;272C A5 DB + SEC ;272E 38 + SBC $DA ;272F E5 DA + STA CurrentFileInfoBuff ;2731 85 D0 + LDA $DC ;2733 A5 DC + SBC #$00 ;2735 E9 00 + STA CurrentFileInfoBuff+1 ;2737 85 D1 + RTS ;2739 60 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 ;273A A9 01 + STA blokDanychIO5+10 ;273C 8D 85 27 + LDA #$00 ;273F A9 00 + STA blokDanychIO5+11 ;2741 8D 86 27 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA #$80 ;2744 A9 80 + BNE ReadSectorA ;2746 D0 03 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +; Wczytuje sektor (numer musi byc juz podany w blokDanychIO5 !!) +; o dlugosci A($00 lub $80) pod adres X(starszy) Y(mlodszy) +ReadSectorA + STA blokDanychIO5+8 ;274B 8D 83 27 + STX blokDanychIO5+5 ;274E 8E 80 27 + STY blokDanychIO5+4 ;2751 8C 7F 27 + ;LDX #$00 ;2754 A2 00 + ;LDA blokDanychIO5+8 ;2756 AD 83 27 + ;BNE label84 ;2759 D0 01 + ;INX ;275B E8 +;label84 ; to zostalo zrobione wczesniej przez kod do obslugi dluzszych sektorow !!! + ;STX blokDanychIO5+9 ;275C 8E 84 27 + LDA #$04 ;275F A9 04 + STA DiskRetryCount ;2761 8D 87 27 +DiskReadRetry + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 + + ; Ustawia numer satcji wg A +SeTDriveNR + STA .adr loader.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + CLC + ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu + STA DriveDisp1 + STA DriveDisp2 + JSR PrintXY + .BY $02,$00 +DriveDisp2 + .BY +$80,"A" + .BY $00 + 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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS",0 + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 26-05-2010" + ;.OPT List + + + org $02e0 + .WO START diff --git a/old_versions/msdos45.as8 b/old_versions/msdos45.as8 new file mode 100644 index 0000000..bcf98ca --- /dev/null +++ b/old_versions/msdos45.as8 @@ -0,0 +1,2049 @@ + ;MICRO SPARTA DOS 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) + +; 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 +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 +; mlodszy bajt dlugosci sektora (pomocniczo na stronie zerowej) +SecLenZ = $28 +; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH +ToFileEndL = $29 +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 (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 +; 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 + +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 + +JCIOMAIN = $e456 +JSIOINT = $e459 +JTESTROM = $e471 +JRESETWM = $e474 +JRESETCD = $e477 + + org $1FFD + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 + JSR GoInitAddr + PLA + STA ToFileEndL + PLA + TAX +FileNextBlock ; wczytanie kolejnego bloku binarnego + LDA SecLen ; przepisanie mlodszego bajtu dlugosci sektora na ZP - zeby kod byl krotszy! + STA SecLenZ + 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 SecLenZ ;; 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) +GoSelfTest + JMP JTESTROM +GetDataSector + LDA SectorNumber+1 + ORA SectorNumber + BEQ GoSelfTest ; jesli sektor numer 0 - selftest +ReadErrorLoop + LDX #$0B +SetDCB + LDA blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #>(JTESTROM-1) + PHA + LDA #<(JTESTROM-1) + PHA + JMP ($02E0) +; Pobranie z pliku pojedynczego bajtu danych ... wynik w A, a CARRY ustawiony!!! +FileGetByte + INC ToFileEndL + BEQ CheckEOF +NotEOF + CPX SecLenZ ;; 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 .... +;FirstFileSectorL=*+1 +; LDA #$FF ; kod samomodyfikujacy - tu wpisany bedzie numer pierwszego sektora pliku +; STA DAUX1 ; juz nie potrzebne, bo i tak pierwszy rozkaz mapy wskazuje na ten sektor +;FirstFileSectorH=*+1 +; LDA #$FF +; STA DAUX2 + 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 ;2152 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 +; 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 +mainprog + LDX #$00 ; kanal nr 0 + JSR CloseX ; 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 + JSR StandardColors ; zmienia tylko A + 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 #blokDanychIO6 + 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 ;21F8 30 + ; czekamy na dowolny klawisz + LDA #$FF + STA KBCODES +WaitKloop + LDX KBCODES + INX + BEQ WaitKloop + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + LDX #>FirstSectorBuff ;220E A2 29 + 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 ;222E AC 09 29 + LDX FirstSectorBuff+$0A ;2231 AE 0A 29 +; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x +ReadDIR +; ustawienie znacznika wlaczenia Turbo dla katalogu + LDA $01 + STA FolderTurbo +; na poczatek kolorki dla pewnosci + JSR StandardColors ; zmienia tylko A + STY DirMapSect ;2234 84 D2 + STX DirMapSect+1 ;2236 86 D3 + LDA #>DirSectorBuff ;2238 A9 2A + STA CurrentFileInfoBuff+1 ;223A 85 D1 + STA CurrentDirBuf+1 ;223C 85 CB + LDA #" + .BY ":Main Dir. " + .BY +$80,"<" + .BY ":UP-DIR." + .BY $00 ;2374 00 + LDA #$00 ;2375 A9 00 + STA $D9 ;2377 85 D9 +label68 + LDA CurrentFileInfoBuff+1 ;2379 A5 D1 + CMP $CD ;237B C5 CD + BCC label48 ;237D 90 08 + BNE label49 ;237F D0 55 + LDA CurrentFileInfoBuff ;2381 A5 D0 + CMP $CC ;2383 C5 CC + BCS label49 ;2385 B0 4F +label48 + LDY #$00 ;2387 A0 00 + LDA (CurrentFileInfoBuff),Y ;2389 B1 D0 + BEQ label49 ;238B F0 49 + LDX #$22 ;238D A2 22 + LDA #$20 ; spacja ;238F A9 20 +label50 + STA GameName,X ;2391 9D 34 24 + DEX ;2394 CA + BPL label50 ;2395 10 FA + LDY #$10 ;2397 A0 10 + LDX #$0A ;2399 A2 0A +label51 + LDA (CurrentFileInfoBuff),Y ;239B B1 D0 + STA GameName,X ;239D 9D 34 24 + DEY ;23A0 88 + DEX ;23A1 CA + BPL label51 ;23A2 10 F7 + LDA $D9 ;23A4 A5 D9 + CLC ;23A6 18 + ADC #$41 ; literka "A" ;23A7 69 41 + STA GameKeySymbol ;23A9 8D 31 24 + LDA $D8 ;23AC A5 D8 + BNE label52 ;23AE D0 2C + LDY #$00 ;23B0 A0 00 + ; status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23B2 B1 D0 + AND #$19 ;23B4 29 19 + CMP #$09 ;23B6 C9 09 + ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu" + BEQ label53 ;23B8 F0 08 + LDX $D7 ;23BA A6 D7 + BEQ label54 ;23BC F0 1B + CMP #$08 ;23BE C9 08 + BNE label54 ;23C0 D0 17 +label53 + ; jeszcze raz status sprawdzanego pliku + LDA (CurrentFileInfoBuff),Y ;23C2 B1 D0 + AND #$20 ;23C4 29 20 + ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik) + BEQ label55 ;23C6 F0 0B + ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "") + LDX #$08 ;23C8 A2 08 +label56 + LDA SubDirText,X ;23CA BD 0C 25 + STA GameName+12 ;23CD 9D 40 24 + DEX ;23D0 CA + BPL label56 ;23D1 10 F7 +label55 + JMP GameNamePrint ;23D3 4C 24 24 +label49 + JMP label58 ;23D6 4C BF 24 +label54 + JMP label59 ;23D9 4C 7C 24 +label52 + LDY #$00 ;23DC A0 00 + LDA (CurrentFileInfoBuff),Y ;23DE B1 D0 + AND #$18 ;23E0 29 18 + CMP #$08 ;23E2 C9 08 + BNE label54 ;23E4 D0 F3 + LDA $CC ;23E6 A5 CC + STA $D4 ;23E8 85 D4 + LDA $CD ;23EA A5 CD + STA $D5 ;23EC 85 D5 +label65 + LDA $D5 ;23EE A5 D5 + CMP $CF ;23F0 C5 CF + BCC label60 ;23F2 90 08 + BNE label54 ;23F4 D0 E3 + LDA $D4 ;23F6 A5 D4 + CMP $CE ;23F8 C5 CE + BCS label54 ;23FA B0 DD +; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy +label60 + LDY #$00 + LDA ($D4),Y + CMP #'*' + BNE CompareNames + 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 ;2414 B0 0E +CheckNextName + LDA $D4 ;2416 A5 D4 + CLC ;2418 18 + ADC #$2E ;2419 69 2E + STA $D4 ;241B 85 D4 + BCC label64 ;241D 90 02 + INC $D5 ;241F E6 D5 +label64 + JMP label65 ;2421 4C EE 23 +GameNamePrint + LDA $D9 ;2424 A5 D9 + CLC ;2426 18 + ADC #$02 ;2427 69 02 + STA YposGameName ;2429 8D 30 24 + JSR PrintXY ;242C 20 88 27 + .BY $01 ;242F 01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " ;2431 41 29 20 +GameName + .BY " " ;2434 20 20 20 + .BY $00 ;2457 00 + LDA $D9 ;2458 A5 D9 + ASL ;245A 0A + TAX ;245B AA + LDA CurrentFileInfoBuff ;245C A5 D0 + STA FirstSectorsTable,X ;245E 9D CA 28 + LDA CurrentFileInfoBuff+1 ;2461 A5 D1 + STA FirstSectorsTable+1,X ;2463 9D CB 28 + LDA CurrentFileInfoBuff ;2466 A5 D0 + CLC ;2468 18 + ADC #$17 ;2469 69 17 + STA CurrentFileInfoBuff ;246B 85 D0 + BCC label66 ;246D 90 02 + INC CurrentFileInfoBuff+1 ;246F E6 D1 +label66 + INC $D9 ;2471 E6 D9 + LDA $D9 ;2473 A5 D9 + CMP #$13 ;2475 C9 13 + BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie + JMP label68 ;2479 4C 79 23 +label59 + LDA CurrentFileInfoBuff ;247C A5 D0 + CLC ;247E 18 + ADC #$17 ;247F 69 17 + STA CurrentFileInfoBuff ;2481 85 D0 + BCC label69 ;2483 90 02 + INC CurrentFileInfoBuff+1 ;2485 E6 D1 +label69 + JMP label68 ;2487 4C 79 23 +MainDirKEY + JMP ReadMainDir ;248A 4C 0E 22 +UpDirKEY + LDY #$02 ;248D A0 02 + LDA (CurrentDirBuf),Y ;248F B1 CA + TAX ;2491 AA + DEY ;2492 88 + ORA (CurrentDirBuf),Y ;2493 11 CA + BEQ KeyboardProc ;2495 F0 2A + LDA (CurrentDirBuf),Y ;2497 B1 CA + TAY ;2499 A8 + JMP ReadDIR ;249A 4C 34 22 +EscKEY + LDX #$00 ;249D A2 00 + STX $D8 ;249F 86 D8 + INX ;24A1 E8 + STX $D7 ;24A2 86 D7 +label70 + JMP label41 ;24A4 4C DE 22 +SpaceKEY + LDA $D6 ;24A7 A5 D6 + BNE label70 ;24A9 D0 F9 + JMP StatusBarPrint +; 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 +label58 + INC $D6 ;24BF E6 D6 +KeyboardProc + JSR GetKey + BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu + CMP #$3E ; ">" ;24D5 C9 3E + BEQ MainDirKEY ;24D7 F0 B1 + CMP #$3C ; "<" ;24D9 C9 3C + BEQ UpDirKEY ;24DB F0 B0 + CMP #$1B ; Esc ;24DD C9 1B + BEQ EscKEY ;24DF F0 BC + CMP #$20 ; Spacja ;24E1 C9 20 + BEQ SpaceKEY ;24E3 F0 C2 + ; ---------------- + ; 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 MainDirKEY + JMP mainprog + ; ----------------- +NoNumber + SEC ;24E5 38 + SBC #'A' ; "A" ; czy klawisz A lub wiekszy + CMP $D9 ; 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 ;24EE BD CA 28 + STA $D4 ;24F1 85 D4 + LDA FirstSectorsTable+1,X ;24F3 BD CB 28 + STA $D5 ;24F6 85 D5 + LDY #$00 ;24F8 A0 00 + LDA ($D4),Y ;24FA B1 D4 + 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 ;2500 A0 02 + LDA ($D4),Y ;2502 B1 D4 + TAX ;2504 AA + DEY ;2505 88 + LDA ($D4),Y ;2506 B1 D4 + TAY ;2508 A8 + JMP ReadDIR ;2509 4C 34 22 +SubDirText + .BY "" ;250C 3C +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 ;251D A0 01 + LDA ($D4),Y ;251F B1 D4 + STA .adr loader.FirstMapSectorNr ; przed przepisaniem + sta blokDanychIO5+$A ; od razu do bloku IOCB + INY ;2524 C8 + LDA ($D4),Y ;2525 B1 D4 + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$B ; od razu do bloku IOCB + INY ;252A C8 + LDA ($D4),Y ;252B B1 D4 + EOR #$FF ;252D 49 FF + STA .adr loader.tempToFileEndL ;252F 8D 52 21 + INY ;2532 C8 + LDA ($D4),Y ;2533 B1 D4 + EOR #$FF ;2535 49 FF + STA .adr loader.ToFileEndH ; przed przepisaniem + INY ;253A C8 + LDA ($D4),Y ;253B B1 D4 + EOR #$FF ;253D 49 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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 #00 + 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 + LDA #$00 ;2542 A9 00 + STA COLDST ;2544 8D 44 02 + LDA #$02 ;2547 A9 02 + STA BOOT ;2549 85 09 + STA $03F8 ;254B 8D F8 03 + LDA #AfterWormStart ;2552 A9 25 + STA CASINI+1 ;2554 85 03 + LDA #>JRESETCD ;2556 A9 E4 + STA DOSVEC+1 ;2558 85 0B + STA DOSINI+1 ;255A 85 0D + 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 #JRESETCD ;2579 A9 E4 + STA CASINI+1 ;257B 85 03 + INC $033D ;257D EE 3D 03 + INC $033E ;2580 EE 3E 03 + DEC $033F ;2583 CE 3F 03 + LDX #$00 ;2586 A2 00 + STX BOOT +; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci +moveloop1 + LDA movedproc,X ;2588 BD 00 20 + STA $0700,X ;258B 9D 00 07 + LDA movedproc+$0100,X ;258E BD 00 21 + STA $0800,X ;2591 9D 00 08 + INX ;2594 E8 + BNE moveloop1 ;2595 D0 F1 +; 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 + 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 + + JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO + JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy) + 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 ;25F2 98 + CLC ;25F3 18 + ADC MEMLO ;25F4 6D E7 02 + STA MEMLO ;25F7 8D E7 02 + TXA ;25FA 8A + ADC MEMLO+1 ;25FB 6D E8 02 + STA MEMLO+1 ;25FE 8D E8 02 + LDA TurboRelocADDR + STA loader.SioJMP+1 ; po przepisaniu + LDA TurboRelocADDR+1 + STA loader.SioJMP+2 ; po przepisaniu +NoHappyLoader + RTS ;260B 60 + + + +; 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 CheckSum ; ------------------- nie potrzebne !!!!! + 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .BY $31,$01,"?",$40 + .WO HappySpeed + .BY $07,$00,$01,$00,$00,$0A +DirMapEnd + JMP label75 ;2659 4C 0D 27 +label39 + STA $DA ;265C 85 DA + LDA CurrentFileInfoBuff ;265E A5 D0 + STA $DB ;2660 85 DB + LDA CurrentFileInfoBuff+1 ;2662 A5 D1 + STA $DC ;2664 85 DC + JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka + BEQ DiscNotChanged2 ;2669 F0 05 + PLA ;266B 68 + PLA ;266C 68 + JMP ReadMainDir ;266D 4C 0E 22 +DiscNotChanged2 + ; odczyt sektora mapy wskazywanego przez DirMapSec + LDA DirMapSect ;2670 A5 D2 + STA blokDanychIO5+10 ;2672 8D 85 27 + LDA DirMapSect+1 ;2675 A5 D3 + STA blokDanychIO5+11 ;2677 8D 86 27 + ORA blokDanychIO5+10 ;267A 0D 85 27 + BEQ DirMapEnd ;267D F0 DA + LDX #>DirMapSectorBuff ;267F A2 29 + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y ;269B BD 80 29 + STA blokDanychIO5+10 ;269E 8D 85 27 + INY + LDA (TempZP),Y ;26A1 BD 81 29 + STA blokDanychIO5+11 ;26A4 8D 86 27 + ORA blokDanychIO5+10 ;26A7 0D 85 27 + BEQ label75 ;26AA F0 61 + ; i zwiekszenie wskaznika mapy o 2 + INY ;26AD E8 + STY InMapPointer + BNE NoIncH ; -- + INC InMapPointer+1 ; -- +NoIncH + ; STX $D6 ;26AE 86 D6 + LDA MEMTOP ;26B0 AD E5 02 + SEC ;26B3 38 + SBC CurrentFileInfoBuff ;26B4 E5 D0 + LDA MEMTOP+1 ;26B6 AD E6 02 + SBC CurrentFileInfoBuff+1 ;26B9 E5 D1 + BEQ label75 ;26BB F0 50 + LDY CurrentFileInfoBuff ;26BD A4 D0 + LDX CurrentFileInfoBuff+1 ;26BF A6 D1 + JSR ReadSector ;26C1 20 48 27 + LDA $D4 ;26C4 A5 D4 + ORA $D5 ;26C6 05 D5 + BNE label79 ;26C8 D0 16 + LDY #$03 ;26CA A0 03 + LDA (CurrentFileInfoBuff),Y ;26CC B1 D0 + STA $D4 ;26CE 85 D4 + INY ;26D0 C8 + LDA (CurrentFileInfoBuff),Y ;26D1 B1 D0 + STA $D5 ;26D3 85 D5 + INY ;26D5 C8 + LDA (CurrentFileInfoBuff),Y ;26D6 B1 D0 + BEQ label79 ;26D8 F0 06 + LDA #$FF ;26DA A9 FF + STA $D4 ;26DC 85 D4 + STA $D5 ;26DE 85 D5 +label79 + LDA CurrentFileInfoBuff ;26E0 A5 D0 + CLC ;26E2 18 + ADC .adr loader.SecLen ; przed przepisaniem + STA CurrentFileInfoBuff ;26E6 85 D0 + LDA CurrentFileInfoBuff+1 ;26E8 A5 D1 + ADC .adr loader.SecLen+1 ; przed przepisaniem + STA CurrentFileInfoBuff+1 ;26ED 85 D1 + LDA $D4 ;26EF A5 D4 + SEC ;26F1 38 + SBC .adr loader.SecLen ; przed przepisaniem + STA $D4 ;26F5 85 D4 + LDA $D5 ;26F7 A5 D5 + SBC .adr loader.SecLen+1 ; przed przepisaniem + STA $D5 ;26FC 85 D5 + BCS label80 ;26FE B0 94 + LDA CurrentFileInfoBuff ;2700 A5 D0 + CLC ;2702 18 + ADC $D4 ;2703 65 D4 + STA CurrentFileInfoBuff ;2705 85 D0 + LDA CurrentFileInfoBuff+1 ;2707 A5 D1 + ADC $D5 ;2709 65 D5 + STA CurrentFileInfoBuff+1 ;270B 85 D1 +label75 + LDA $DC ;270D A5 DC + CMP CurrentFileInfoBuff+1 ;270F C5 D1 + BCC label81 ;2711 90 0B + BNE label82 ;2713 D0 17 + LDA $DB ;2715 A5 DB + CMP CurrentFileInfoBuff ;2717 C5 D0 + BCC label81 ;2719 90 03 + BNE label82 ;271B D0 0F + RTS ;271D 60 +label81 + LDA $DB ;271E A5 DB + CLC ;2720 18 + ADC $DA ;2721 65 DA + STA $DB ;2723 85 DB + BCC label75 ;2725 90 E6 + INC $DC ;2727 E6 DC + JMP label75 ;2729 4C 0D 27 +label82 + LDA $DB ;272C A5 DB + SEC ;272E 38 + SBC $DA ;272F E5 DA + STA CurrentFileInfoBuff ;2731 85 D0 + LDA $DC ;2733 A5 DC + SBC #$00 ;2735 E9 00 + STA CurrentFileInfoBuff+1 ;2737 85 D1 + RTS ;2739 60 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 ;273A A9 01 + STA blokDanychIO5+10 ;273C 8D 85 27 + LDA #$00 ;273F A9 00 + STA blokDanychIO5+11 ;2741 8D 86 27 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA #$80 ;2744 A9 80 + BNE ReadSectorA ;2746 D0 03 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +; Wczytuje sektor (numer musi byc juz podany w blokDanychIO5 !!) +; o dlugosci A($00 lub $80) pod adres X(starszy) Y(mlodszy) +ReadSectorA + STA blokDanychIO5+8 ;274B 8D 83 27 + STX blokDanychIO5+5 ;274E 8E 80 27 + STY blokDanychIO5+4 ;2751 8C 7F 27 + ;LDX #$00 ;2754 A2 00 + ;LDA blokDanychIO5+8 ;2756 AD 83 27 + ;BNE label84 ;2759 D0 01 + ;INX ;275B E8 +;label84 ; to zostalo zrobione wczesniej przez kod do obslugi dluzszych sektorow !!! + ;STX blokDanychIO5+9 ;275C 8E 84 27 + LDA #$04 ;275F A9 04 + STA DiskRetryCount ;2761 8D 87 27 +DiskReadRetry + LDY #blokDanychIO5 ;2766 A2 27 + JSR Table2DCB ;2768 20 4D 28 + JSR GoSIO ;276B 20 18 28 + BMI label85 ;276E 30 01 + RTS ;2770 60 +label85 + DEC DiskRetryCount ;2771 CE 87 27 + BNE DiskReadRetry ;2774 D0 EE + PLA ;2776 68 + PLA ;2777 68 + JMP ErrorDisplay ;2778 4C D1 21 +blokDanychIO5 + .BY $31,$01,$52,$40 + .WO DirMapSectorBuff + .BY $0A,$00,$80,$00,$01,$00 ;277B 31 01 +DiskRetryCount + .BY $00 ;2787 00 +PrintXY + PLA ;2788 68 + STA $C8 ;2789 85 C8 + PLA ;278B 68 + STA $C9 ;278C 85 C9 + LDA #$00 ;278E A9 00 + STA $DF ;2790 85 DF + JSR label87 ;2792 20 0A 28 + PHA ;2795 48 + JSR label87 ;2796 20 0A 28 + STA $DE ;2799 85 DE + ASL ;279B 0A + ASL ;279C 0A + CLC ;279D 18 + ADC $DE ;279E 65 DE + ASL ;27A0 0A + ASL ;27A1 0A + ROL $DF ;27A2 26 DF + ASL ;27A4 0A + ROL $DF ;27A5 26 DF + CLC ;27A7 18 + ADC SAVMSC ;27A8 65 58 + STA $DE ;27AA 85 DE + LDA $DF ;27AC A5 DF + ADC SAVMSC+1 ;27AE 65 59 + STA $DF ;27B0 85 DF + PLA ;27B2 68 + TAY ;27B3 A8 +label92 + JSR label87 ;27B4 20 0A 28 + CMP #$00 ;27B7 C9 00 + BEQ label88 ;27B9 F0 48 + CMP #$7D ;27BB C9 7D + BEQ label89 ;27BD F0 21 + LDX #$00 ;27BF A2 00 + STX $E0 ;27C1 86 E0 + CMP #$80 ;27C3 C9 80 + ROR $E0 ;27C5 66 E0 + AND #$7F ;27C7 29 7F + CMP #$20 ;27C9 C9 20 + BCS label90 ;27CB B0 04 + ORA #$40 ;27CD 09 40 + BNE label91 ;27CF D0 07 +label90 + CMP #$60 ;27D1 C9 60 + BCS label91 ;27D3 B0 03 + SEC ;27D5 38 + SBC #$20 ;27D6 E9 20 +label91 + ORA $E0 ;27D8 05 E0 + STA ($DE),Y ;27DA 91 DE + INY ;27DC C8 + JMP label92 ;27DD 4C B4 27 +label89 + TYA ;27E0 98 + PHA ;27E1 48 + LDA SAVMSC ;27E2 A5 58 + STA $E0 ;27E4 85 E0 + LDA #$03 ;27E6 A9 03 + TAX ;27E8 AA + CLC ;27E9 18 + ADC SAVMSC+1 ;27EA 65 59 + STA $E1 ;27EC 85 E1 + LDY #$BF ;27EE A0 BF + LDA #$00 ;27F0 A9 00 +label93 + STA ($E0),Y ;27F2 91 E0 + DEY ;27F4 88 + CPY #$FF ;27F5 C0 FF + BNE label93 ;27F7 D0 F9 + DEC $E1 ;27F9 C6 E1 + DEX ;27FB CA + BPL label93 ;27FC 10 F4 + PLA ;27FE 68 + TAY ;27FF A8 + JMP label92 ;2800 4C B4 27 +label88 + LDA $C9 ;2803 A5 C9 + PHA ;2805 48 + LDA $C8 ;2806 A5 C8 + PHA ;2808 48 + RTS ;2809 60 +label87 + INC $C8 ;280A E6 C8 + BNE label94 ;280C D0 02 + INC $C9 ;280E E6 C9 +label94 + LDX #$00 ;2810 A2 00 + LDA ($C8,X) ;2812 A1 C8 + RTS ;2814 60 +GoErrorDisp + JMP ErrorDisplay ;2815 4C D1 21 +; Skok do Sio lub procedury Turbo +GoSIO + LDY USmode + BEQ StandardSpeed + JMP HappyUSMovedProc ; mozna skakac do tej procki +StandardSpeed + JMP JSIOINT ;281D 4C 59 E4 +; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy) +; do bloku kontroli transmisji szeregowej DCB +Table2DCB + STY IOtableAddr+1 ;284D 8C 56 28 + STX IOtableAddr+2 ;2850 8E 57 28 + LDX #$0B ;2853 A2 0B +IOtableAddr + LDA $FFFF,X ;2855 BD FF FF + STA DDEVIC,X ;2858 9D 00 03 + DEX ;285B CA + BPL IOtableAddr ;285C 10 F7 + RTS ;285E 60 +Close1 + LDX #$10 ;285F A2 10 +CloseX + LDA #$0C ;2861 A9 0C + STA ICCMD,X ;2863 9D 42 03 + JMP JCIOMAIN ;2866 4C 56 E4 +GetKey + LDX #$10 ;2869 A2 10 + LDA #$03 ;286B A9 03 + STA ICCMD,X ;286D 9D 42 03 + LDA #$04 ;2870 A9 04 + STA ICAX1,X ;2872 9D 4A 03 + LDA #$00 ;2875 A9 00 + STA ICAX2,X ;2877 9D 4B 03 + STA ICBUFL+1,X ;287A 9D 49 03 + LDA #$FF ;287D A9 FF + STA ICBUFL,X ;287F 9D 48 03 + LDA #Kdriver ;2887 A9 28 + STA ICBUFA+1,X ;2889 9D 45 03 + JSR JCIOMAIN ;288C 20 56 E4 + BMI GKeyError ;288F 30 1C + LDX #$10 ;2891 A2 10 + LDA #$00 ;2893 A9 00 + STA ICBUFL,X ;2895 9D 48 03 + STA ICBUFL+1,X ;2898 9D 49 03 + LDA #$07 ;289B A9 07 + STA ICCMD,X ;289D 9D 42 03 + JSR JCIOMAIN ;28A0 20 56 E4 + BMI GKeyError ;28A3 30 08 + PHA ;28A5 48 + JSR Close1 ;28A6 20 5F 28 + BMI GKeyError ;28A9 30 02 + PLA ;28AB 68 + RTS ;28AC 60 +GKeyError + JMP GoErrorDisp ;28AD 4C 15 28 +Kdriver + .BY "K:",$9B ;28B0 4B +DiscChangeCheck + LDY #DirMapSectorBuff ;28B5 A2 29 + JSR ReadFirstSect ;28B7 20 3A 27 + LDX #$7F ;28BA A2 7F +label98 + LDA FirstSectorBuff,X ;28BC BD 00 29 + CMP DirMapSectorBuff,X ;28BF DD 80 29 + BNE ChangedD ;28C2 D0 05 + DEX ;28C4 CA + BPL label98 ;28C5 10 F5 + LDA #$00 ;28C7 A9 00 +ChangedD + RTS ;28C9 60 +StandardColors + LDA #$C4 ; ustawienie koloru tła i liter + STA COLPF2S + STA COLBAKS + LDA #$CA + STA COLPF1S + 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.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 + JMP mainprog +QMEGstring + .BY "QMEG-OS",0 + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 26-05-2010" + ;.OPT List + + + org $02e0 + .WO START diff --git a/old_versions/msdos46.as8 b/old_versions/msdos46.as8 new file mode 100755 index 0000000..2322348 --- /dev/null +++ b/old_versions/msdos46.as8 @@ -0,0 +1,2059 @@ + ;MICRO SPARTA DOS 4.6 + +; w wersji 4.6 przeniesienie otwarcia ekranu poza glowna petle (do bufora, bo uruchamiamy tylko raz) +; trzeba tez wyeliminowac chwilowe przelaczanie na domyslne kolory + +; 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) + +; 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 +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 (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 +; 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 + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #blokDanychIO6 + 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 + LDA #$FF + STA KBCODES + ; ------------------ + ; 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 + 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 $D9 +label68 + LDA CurrentFileInfoBuff+1 + CMP $CD + BCC label48 + BNE label49 + LDA CurrentFileInfoBuff + CMP $CC + BCS label49 +label48 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + BEQ label49 + 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 $D9 + 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 +label49 + JMP label58 +label54 + JMP label59 +label52 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + AND #$18 + CMP #$08 + BNE label54 + LDA $CC + STA $D4 + LDA $CD + 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 $D9 + CLC + ADC #$02 + STA YposGameName + JSR PrintXY + .BY $01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " +GameName + .BY " " + .BY $00 + LDA $D9 + 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 $D9 + LDA $D9 + 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 + LDX #$00 + STX $D8 + INX + STX $D7 +label70 + JMP label41 +SpaceKEY + LDA $D6 + BNE label70 + JMP StatusBarPrint +; 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 +label58 + INC $D6 +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 #$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 $D9 ; 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 blokDanychIO5+$A ; od razu do bloku IOCB + INY + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 $08 ; 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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .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 blokDanychIO5+10 + LDA DirMapSect+1 + STA blokDanychIO5+11 + ORA blokDanychIO5+10 + BEQ DirMapEnd + LDX #>DirMapSectorBuff + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y + STA blokDanychIO5+10 + INY + LDA (TempZP),Y + STA blokDanychIO5+11 + ORA blokDanychIO5+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 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 + STA blokDanychIO5+10 + LDA #$00 + STA blokDanychIO5+11 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA #$80 + BNE ReadSectorA +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +; Wczytuje sektor (numer musi byc juz podany w blokDanychIO5 !!) +; o dlugosci A($00 lub $80) pod adres X(starszy) Y(mlodszy) +ReadSectorA + STA blokDanychIO5+8 + STX blokDanychIO5+5 + STY blokDanychIO5+4 + LDA #$04 + STA DiskRetryCount +DiskReadRetry + LDY #blokDanychIO5 + JSR Table2DCB + JSR GoSIO + BMI label85 + RTS +label85 + DEC DiskRetryCount + BNE DiskReadRetry + PLA + PLA + JMP ErrorDisplay +blokDanychIO5 + .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.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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 26-05-2010" + ;.OPT List + + + org $02e0 + .WO START diff --git a/old_versions/msdos46b.as8 b/old_versions/msdos46b.as8 new file mode 100755 index 0000000..4169960 --- /dev/null +++ b/old_versions/msdos46b.as8 @@ -0,0 +1,2077 @@ + ;MICRO SPARTA DOS 4.6 + +; w wersji 4.6b dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami +; "prawo"/"lewo" albo "gora"/"dol" ... i "backspace" o katalog wyzej + +; 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 (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 +; 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 + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #blokDanychIO6 + 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 + 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 $D9 +label68 + LDA CurrentFileInfoBuff+1 + CMP $CD + BCC label48 + BNE label49 + LDA CurrentFileInfoBuff + CMP $CC + BCS label49 +label48 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + BEQ label49 + 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 $D9 + 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 +label49 + JMP label58 +label54 + JMP label59 +label52 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + AND #$18 + CMP #$08 + BNE label54 + LDA $CC + STA $D4 + LDA $CD + 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 $D9 + CLC + ADC #$02 + STA YposGameName + JSR PrintXY + .BY $01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " +GameName + .BY " " + .BY $00 + LDA $D9 + 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 $D9 + LDA $D9 + 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 +label70 + JMP label41 +SpaceKEY + LDA $D6 + BNE label70 + JMP StatusBarPrint +; 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 +label58 + INC $D6 +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 #$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 $D9 ; 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 blokDanychIO5+$A ; od razu do bloku IOCB + INY + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .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 blokDanychIO5+10 + LDA DirMapSect+1 + STA blokDanychIO5+11 + ORA blokDanychIO5+10 + BEQ DirMapEnd + LDX #>DirMapSectorBuff + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y + STA blokDanychIO5+10 + INY + LDA (TempZP),Y + STA blokDanychIO5+11 + ORA blokDanychIO5+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 +; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy) +ReadFirstSect + LDA #$01 + STA blokDanychIO5+10 + LDA #$00 + STA blokDanychIO5+11 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA #$80 + BNE ReadSectorA +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +; Wczytuje sektor (numer musi byc juz podany w blokDanychIO5 !!) +; o dlugosci A($00 lub $80) pod adres X(starszy) Y(mlodszy) +ReadSectorA + STA blokDanychIO5+8 + STX blokDanychIO5+5 + STY blokDanychIO5+4 + LDA #$04 + STA DiskRetryCount +DiskReadRetry + LDY #blokDanychIO5 + JSR Table2DCB + JSR GoSIO + BMI label85 + RTS +label85 + DEC DiskRetryCount + BNE DiskReadRetry + PLA + PLA + JMP ErrorDisplay +blokDanychIO5 + .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.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+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 tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie +FirstSectorsTable + ; zostawiamy $30 bajtow wolnego + +FirstSectorBuff=[[>[*+$2f]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 bajtoe +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/old_versions/msdos46c.as8 b/old_versions/msdos46c.as8 new file mode 100755 index 0000000..feef497 --- /dev/null +++ b/old_versions/msdos46c.as8 @@ -0,0 +1,2115 @@ + ;MICRO SPARTA DOS 4.6 + +; w wersji 4.6d dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami +; "prawo"/"lewo" albo "gora"/"dol" ... i "backspace" o katalog 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 (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 +; 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 + +; przesuniecia potrzebne do relokacji +offset1 = movedproc-$0700 +offset2 = HappyUSMovedProc-$0a00 +; 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 +; adres bufora na sektor mapy wczytywanego pliku +FileMapBuff = FileSecBuff + $0100 ; oba bufory powinny miec taki sam mlodszy bajt adresu ; po przepisaniu +;TempMEMLO = FileMapBuff + $0100 ; Memlo bez procedur turbo (wartosc wyjsciowa) +TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora) +; Adres (offset) w mapie sektorow z ktorego nalezy pobrac adres nastepnego sektora +; startuje od $04 (pierwsze 4 bajty mapy, to numer nastepnego i poprzedniego jej sektora) +; jesli rowna sie dlugosci sektora to osiagnieto koniec tego sektora mapy +; i trzeba zaladowac nastepny +; obecnie zmienna trzymana w buforze mapy (zamazuje numer poprzedniego sektora) +PointInMap = FileMapBuff+$02 ; po przepisaniu + +START + JMP FirstRun ;1FFD 4C 70 21 +; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu +; do wczytania (wszystkie skoki bezwzgledne i samomodyfikacje "-offset1" !!!) + +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 blokDanychIO1,X + STA DDEVIC,X + DEX + BPL SetDCB +SioJMP + JSR JSIOINT + BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie + RTS +blokDanychIO1 + .BY $31,$01,$52,$40,FileSecBuff,$0A,$00,$80,$00 +; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100) +SecLen = blokDanychIO1+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 #blokDanychIO6 + 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 $D9 +label68 + LDA CurrentFileInfoBuff+1 + CMP $CD + BCC label48 + BNE label49 + LDA CurrentFileInfoBuff + CMP $CC + BCS label49 +label48 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + BEQ label49 + 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 $D9 + 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 +label49 + JMP label58 +label54 + JMP label59 +label52 + LDY #$00 + LDA (CurrentFileInfoBuff),Y + AND #$18 + CMP #$08 + BNE label54 + LDA $CC + STA $D4 + LDA $CD + 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 $D9 + CLC + ADC #$02 + STA YposGameName + JSR PrintXY + .BY $01 +YposGameName + .BY $02 +GameKeySymbol + .BY "A) " +GameName + .BY " " + .BY $00 + LDA $D9 + 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 $D9 + LDA $D9 + 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 +label70 + JMP label41 +SpaceKEY + LDA $D6 + BNE label70 + JMP StatusBarPrint +; 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 +label58 + INC $D6 +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 #$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 $D9 ; 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 blokDanychIO5+$A ; od razu do bloku IOCB + INY + LDA ($D4),Y + STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem + sta blokDanychIO5+$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 blokDanychIO5+$A + LDA DirMapSectorBuff+1 + sta blokDanychIO5+$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 + + +; Rockaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler +blokDanychIO6 + .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 blokDanychIO5+10 + LDA DirMapSect+1 + STA blokDanychIO5+11 + ORA blokDanychIO5+10 + BEQ DirMapEnd + LDX #>DirMapSectorBuff + LDY #DirMapSectorBuff ; -- + ADC InMapPointer+1 ; -- + STA TempZP+1 ; -- + LDA (TempZP),Y + STA blokDanychIO5+10 + INY + LDA (TempZP),Y + STA blokDanychIO5+11 + ORA blokDanychIO5+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 #blokDanychPERCOM + 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 +blokDanychPERCOM + .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 blokDanychIO5+10 + LDA #$00 + STA blokDanychIO5+11 + LDA PERCOMdata+6 + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA PERCOMdata+7 + JMP ReadSector1 +; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO1 (SecLen) +; reszta danych jak nizej (A nie wazne) +ReadSector + LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b + STA blokDanychIO5+9 ; --- obsluga sektorow ponad 256b + LDA .adr loader.SecLen ; przed przepisaniem +ReadSector1 + STA blokDanychIO5+8 + STX blokDanychIO5+5 + STY blokDanychIO5+4 + LDA #$04 + STA DiskRetryCount +DiskReadRetry + LDY #blokDanychIO5 + JSR Table2DCB + JSR GoSIO + BMI label85 + RTS +label85 + DEC DiskRetryCount + BNE DiskReadRetry + PLA + PLA + JMP ErrorDisplay +blokDanychIO5 + .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.blokDanychIO1+1 ; przed przepisaniem + STA blokDanychIO5+1 + STA blokDanychIO6+1 + STA blokDanychPERCOM+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/old_versions/test.atr b/old_versions/test.atr new file mode 100755 index 0000000..eed4dfe Binary files /dev/null and b/old_versions/test.atr differ diff --git a/old_versions/text.atr b/old_versions/text.atr new file mode 100755 index 0000000..922c07f Binary files /dev/null and b/old_versions/text.atr differ diff --git a/screen_proc.as8 b/screen_proc.as8 new file mode 100755 index 0000000..b36ec9e --- /dev/null +++ b/screen_proc.as8 @@ -0,0 +1,80 @@ + + +lines = 24 +screenSize = lines*40+dlend-dl+1 + +screenStart + sbw MEMTOP #screenSize newDLaddress + lda newDLAddress+1 + and #$F0 + sta newAddressTemp+1 + lda MEMTOP+1 + and #$F0 + cmp newAddressTemp+1 + beq screenFitsInSamePageAsMEMTOP + mva #0 newAddressTemp + lda MEMTOP+1 + and #$F0 + sta newAddressTemp+1 + sbw newAddressTemp #screenSize newDLaddress +screenFitsInSamePageAsMEMTOP + ;now adjust the screen pointer in DL + adw newDLaddress #dlend-dl newScreenAddress + mwa newScreenAddress PdlScreenAddress + mwa newDLaddress PdlJumpAddress + + /* move dl to the new home */ + mwa Pdl tempA + mwa newDLAddress tempB + ldy #dlend-dl-1 +dlMoveLoop + lda (tempA),y + sta (tempB),y + dey + bpl dlMoveLoop ;CAUTION!!! dl Must be shorter than 128 bytes!!! + mwa newDLaddress DLPTRS + + vdli dli + mva #$0e $2c8 ;COLBAKS + rts + +newDLaddress + dta $00, $00 +newAddressTemp +newScreenAddress + dta $00, $00 +;--------------- +Pdli DTA V(dli) +dli + pha + sta WSYNC + mva VCOUNT COLBAK + pla + rti + +Pdl + DTA V(dl) ;this is spartaaaaa +PdlScreenAddress + DTA V(dlScreenAddress) +PdlJumpAddress + DTA V(dlJumpAddress) + +dl + dta $70,$70,$70+$80 + dta $42+$80 +dlScreenAddress + dta a (screen) + + :lines-1 dta $02+$80 + + dta $41 +dlJumpAddress + dta a(dl) +dlend + .IF dlend-dl >127 + .ERROR "DL too long" + .ENDIF +screen + dta d"aba" + :40 dta $00 +;-----------------------------