;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