mirror of
https://github.com/pkali/micro-sparta-dos.git
synced 2026-05-20 22:34:22 +02:00
2156 lines
88 KiB
Plaintext
2156 lines
88 KiB
Plaintext
mads 2.1.6 build 65 (4 Jun 23)
|
|
Source: loaderFN.asm
|
|
1 ;MICRO SPARTA DOS 4.7
|
|
2
|
|
3 ; w wersji 4.7 dodac możnaby przechodzenie po kolejnych "ekranach" z lista plikow klawiszami
|
|
4 ; "prawo"/"lewo" albo "gora"/"dol" ... ... ale to b.trudne
|
|
5 ; ze wzgledu na mozliwosc roznej liczby plikow (stron) w zaleznosci czy wyswietlamy
|
|
6 ; dlugie nazwy czy nie - nie da sie tego latwo zliczyc
|
|
7
|
|
8 ; dodany "Backspace" jako powrot do katalogu wyzej.
|
|
9
|
|
10 ; w wersji 4.6c zmieniony sposob rozpoznawania wielkosci sektora, dodane czytanie
|
|
11 ; bloku PERCOM przy zmianie dysku...
|
|
12 ; UWAGA! Bufor na pierwszy sektor ma dalej 128b, bezposrednio za nim jest bufor na sektor
|
|
13 ; mapy, ktory moze byc zamazywany w chwili odczytu pierwszego sektora bez problemow.
|
|
14
|
|
15
|
|
16 ; w wersji 4.6b poprawione dwa male bugi i dodane kulturalne wyjscie do DOS (Shift+Esc) ...
|
|
17 ; ..... moznaby w tym momencie sprawdzac czy jest w ogole DOS w pamieci, bo bez DOS bedzie SelfTest
|
|
18
|
|
19 ; w wersji 4.6 wyeliminowane chwilowe przelaczanie na domyslne kolory, różne poprawki procedur,
|
|
20 ; żeby więcej gier się uruchamiało (zmiany w resecie i zmiennych systemowych)
|
|
21
|
|
22 ; w wersji 4.5 obsluga napedow 9-15 pod Ctrl-litera gotowa (napedy 1-8 zdublowane pod klawiszami 1-8 i Ctrl-litera
|
|
23 ; wyswietlanie "numeru" napedu w zaleznosci jak sie go wybierze (Dn: lub n: - cyfra lub litera)
|
|
24
|
|
25 ; w wersji 4.4 (niepublikowanej) poprawiony blad. Nie moze byc dwa razy po sobie znacznika dziury w skompresowanej mapie
|
|
26 ; czyli dziura max 127 sektorow a nie jak porzednio 254
|
|
27 ; dodatkowo zapamietanie (na czas resetu przed czyszczeniem pamieci)
|
|
28 ; stanu aktywnych urzadzen PBI i odtworzenie go po resecie (dzieki Drac030)
|
|
29
|
|
30 ; stan urzadzen na szynie PBI
|
|
31 = 0247 PDVMASK = $0247
|
|
32
|
|
33 ; nowa koncepcja zrobiona:
|
|
34
|
|
35 ; 1. wywalić turbo 'top-drive'
|
|
36
|
|
37 ; 2. przerobić loader i menu na obsługę sektorów dow. długości
|
|
38
|
|
39 ; 3. przepisac czytanie tablicy sektorów indeksowych z loadera do menu:
|
|
40 ; a. w menu odczytywane są wszystkie sektory tablicy indeksowej
|
|
41 ; b. budowana jest "skompresowana" tablica offsetów w stosunku do pierwszego sektora na nast. zasadzie:
|
|
42 ; mamy nast. znaczniki : (nowa koncepcja)
|
|
43 ; 1xxxxxxx -- (0xxxxxxx = ile sektorów ominąć) . Opłaci się używać do max 255 sektorów do przeskoczenia.
|
|
44 ; 0xxxxxxx -- (0xxxxxxx = ile kolejnych sektorów wczytać)
|
|
45 ; 00000000 -- następne 2 bajty to numer kolejnego sektora do odczytania
|
|
46 ;
|
|
47
|
|
48 ; 4. nowa 'skompresowana' tablica indeksowa podwyzsza memlo
|
|
49
|
|
50
|
|
51 ;START ADDR = 1FFD
|
|
52 ;END ADDR = 28C9
|
|
53 ;.OPT noList
|
|
54
|
|
55 icl 'lib/SYSEQU.ASM'
|
|
Source: SYSEQU.ASM
|
|
1 ; .PAGE "FTe SYSTEM EQUATES FOR ATARI"
|
|
2 ;
|
|
3 ; FILE = #DN:SYSEQU.ASM
|
|
4 ;
|
|
5 ;
|
|
6 ; I/O CONTROL BLOCK EQUATES
|
|
7 ;
|
|
8 ;SAVEPC = * ; SAVE CURRENT ORG
|
|
9 ;
|
|
10
|
|
11 = 0340 IOCB = $0340 ;START OF SYSTEM IOCBS
|
|
12 ;
|
|
13 = 0340 ICHID = IOCB ;DEVICE HANDLER IS (SET BY OS)
|
|
14 = 0341 ICDNO = IOCB+1 ;DEVICE NUMBER (SET BY OS)
|
|
15 = 0342 ICCOM = IOCB+2 ;I/O COMMAND
|
|
16 = 0343 ICSTA = IOCB+3 ;I/O STATUS
|
|
17 = 0344 ICBADR = IOCB+4 ;BUFFER ADDRESS
|
|
18 = 0346 ICPUT = IOCB+6 ;DH PUT ROUTINE (ADR-1)
|
|
19 = 0348 ICBLEN = IOCB+8 ;BUFFER LENGTH
|
|
20 = 034A ICAUX1 = IOCB+10 ;AUX 1
|
|
21 = 034B ICAUX2 = IOCB+11 ;AUX 2
|
|
22 = 034C ICAUX3 = IOCB+12 ;AUX 3
|
|
23 = 034D ICAUX4 = IOCB+13 ;AUX 4
|
|
24 = 034E ICAUX5 = IOCB+14 ;AUX 5
|
|
25 = 034F ICAUX6 = IOCB+15 ;AUX 6
|
|
26 ;
|
|
27 = 0010 IOCBLEN = 16 ;LENGTH OF ONE IOCB
|
|
28 ;
|
|
29 ; IOCB COMMAND VALUE EQUATES
|
|
30 ;
|
|
31 = 0003 COPN = 3 ;OPEN
|
|
32 = 0007 CGBINR = 7 ;GET BINARY RECORD
|
|
33 = 0005 CGTXTR = 5 ;GET TEXT RECORD
|
|
34 = 000B CPBINR = 11 ;PUT BINARY RECORD
|
|
35 = 0009 CPTXTR = 9 ;PUT TEXT RECORD
|
|
36 = 000C CCLOSE = 12 ;CLOSE
|
|
37 = 000D CSTAT = 13 ;GET STATUS
|
|
38 ;
|
|
39 ; DEVICE DEPENDENT COMMAND EQUATES FOR FILE MANAGER
|
|
40 ;
|
|
41 = 0020 CREN = 32 ;RENAME
|
|
42 = 0021 CERA = 33 ;ERASE
|
|
43 = 0023 CPRO = 35 ;PROTECT
|
|
44 = 0024 CUNP = 36 ;UNPROTECT
|
|
45 = 0025 CPOINT = 37 ;POINT
|
|
46 = 0026 CNOTE = 38 ;NOTE
|
|
47 ;
|
|
48 ; AUX1 VALUES REQD FOR OPEN
|
|
49 ;
|
|
50 = 0004 OPIN = 4 ;OPEN INPUT
|
|
51 = 0008 OPOUT = 8 ;OPEN OUTPUT
|
|
52 = 000C OPUPD = 12 ;OPEN UPDATE
|
|
53 = 0009 OPAPND = 9 ;OPEN APPEND
|
|
54 = 0006 OPDIR = 6 ;OPEN DIRECTORY
|
|
55 ;
|
|
56 ; .PAGE
|
|
57 ;
|
|
58 ; EXECUTE FLAG DEFINES
|
|
59 ;
|
|
60 = 0080 EXCYES = $80 ; EXECUTE IN PROGRESS
|
|
61 = 0040 EXCSCR = $40 ; ECHO EXCUTE INPUT TO SCREEN
|
|
62 = 0010 EXCNEW = $10 ; EXECUTE START UP MODE
|
|
63 = 0020 EXCSUP = $20 ; COLD START EXEC FLAG
|
|
64 ;
|
|
65 ; MISC ADDRESS EQUATES
|
|
66 ;
|
|
67 = 000A CPALOC = $0A ; POINTER TO CP/A
|
|
68 = 0008 WARMST = $08 ; WAR, START (0=COLD)
|
|
69 = 02E7 MEMLO = $02E7 ; AVAIL MEM (LOW) PTR
|
|
70 = 02E5 MEMTOP = $02E5 ; AVAIL MEM (HIGH) PTR
|
|
71 = 000E APPMHI = $0E ; UPPER LIMIT OF APPLICATION MEMORY
|
|
72 = 02E2 INITADR = $02E2 ; ATARI LOAD/INIT ADR
|
|
73 = 02E0 GOADR = $02E0 ; ATARI LOAD/GO ADR
|
|
74 = BFFA CARTLOC = $BFFA ; CARTRIDGE RUN LOCATION
|
|
75 = E456 CIO = $E456 ;CIO ENTRY ADR
|
|
76 = 009B EOL = $9B ; END OF LINE CHAR
|
|
77 ;
|
|
78 ; CP/A FUNCTION AND VALUE DISPLACEMSNT
|
|
79 ; (INDIRECT THROUGH CPALOC)
|
|
80 ; IE. (CPALOC),Y
|
|
81 ;
|
|
82 = 0003 CPGNFN = 3 ; GET NEXT FILE NAME
|
|
83 = 0007 CPDFDV = $07 ; DEFAULT DRIVE (3 BYTES)
|
|
84 = 000A CPBUFP = $0A ; CMD BUFF NEXT CHAR POINTR (1 BYTE)
|
|
85 = 000B CPEXFL = $0B ; EXECUTE FLAG
|
|
86 = 000C CPEXFN = $0C ; EXECUTE FILE NAME (16 BYTES)
|
|
87 = 001C CPEXNP = $1C ; EXECUTE NOTE/POINT VALUES
|
|
88 = 0021 CPFNAM = $21 ; FILENAME BUFFER
|
|
89 = 003D RUNLOC = $3D ; CP/A LOAD/RUN ADR
|
|
90 = 003F CPCMDB = $3F ; COMMAND BUFFER (60 BYTES)
|
|
91 = 00F3 CPCMDGO = $F3
|
|
92 ;
|
|
93 ; *= SAVEPC ; RESTORE PC
|
|
94 ;
|
|
56
|
|
57
|
|
58 = 000A acktimeout = $a
|
|
59 = 0002 readtimeout = 2
|
|
60
|
|
61
|
|
62 = 0318 STACKP = $0318
|
|
63 = 0042 CRITIC = $42
|
|
64 = 02BD DRETRY = $02BD
|
|
65 = 030F CASFLG = $030F
|
|
66 = 029C CRETRY = $029C
|
|
67
|
|
68
|
|
69 = 0002 CASINI = $02
|
|
70 ;WARMST = $08
|
|
71 = 0009 BOOT = $09
|
|
72 = 000A DOSVEC = $0a
|
|
73 = 000C DOSINI = $0c
|
|
74 ;APPMHI = $0e
|
|
75
|
|
76 = 0010 IRQENS = $10
|
|
77
|
|
78
|
|
79 ; zmienne procedury ladowania pliku (w miejscu zmiennych CIO - ktore sa nieuzywane)
|
|
80
|
|
81 ; adres komorki pamieci do ktorej zapisujemy kolejny ladowany bajt pliku
|
|
82 = 0024 InBlockAddr = $24 ; word
|
|
83 ; dlugosc ladowanego bloku odjeta od $10000 (zwiekszana osiaga ZERO po zaladowaniu bloku w calosci)
|
|
84 = 0026 ToBlockEnd = $26 ; word
|
|
85 = 0026 BlockLen= $26 ; word
|
|
86 ; najmlodszy z trzech bajtow zliczajacych do konca pliku - patrz ToFileEndH
|
|
87 = 0028 ToFileEndL = $28
|
|
88 = 0028 BlockATemp = $28
|
|
89 = 003D CompressedMapPos = $3D ; pozycja w skompresowanej mapie pliku
|
|
90
|
|
91 = 0030 CheckSUM = $30
|
|
92 = 0031 SecLenUS = $31
|
|
93 = 0032 SecBuffer = $32
|
|
94 = 0034 CRETRYZ = $34
|
|
95 = 0035 TransmitError =$35
|
|
96 = 0036 Looperka = $36
|
|
97 = 0037 StackCopy = $37
|
|
98
|
|
99
|
|
100 = 0058 SAVMSC = $58
|
|
101 ; Adres bufora przechowywania Aktualnie obrabianego sektora zawierajacego
|
|
102 ; katalog
|
|
103 = 00CA CurrentDirBuf = $CA
|
|
104 ; adres konca tego bufora (2 bajty)
|
|
105 = 00CC CurrentDirBufEnd = $CC
|
|
106 ; Adres (w buforze CurrentDirBuff, ale bezwzgledny) poczatku informacji
|
|
107 ; o obrabianym pliku (skok co $17)
|
|
108 = 00D0 CurrentFileInfoBuff = $D0
|
|
109 ; Numer sektora ktory nalezy przeczytac - mapy sektorow aktualnego katalogu (2 bajty)
|
|
110 = 00D2 DirMapSect = $D2
|
|
111 ; Flaga ustawiana na 1 kiedy skoncza sie pliki do wyswietlenia w danym katalogu
|
|
112 ; oznacza wyswietlanie ostatniej strony i jednoczesnie mowi o tym, ze po spacji
|
|
113 ; ma byc wyswietlany katalog od poczatku
|
|
114 = 00D6 LastFilesPageFlag = $D6
|
|
115 ; Licznik nazw plikow wyswietlonych aktualnie na ekranie, po wyswietleniu strony
|
|
116 ; zawiera liczbe widocznych na ekranie plikow (1 bajt)
|
|
117 = 00D9 NamesOnScreen = $D9
|
|
118 ; wskaznik pozycji w mapie sektorow czytanego katalogu (2 bajty) - nowa zmienna
|
|
119 ; wczesniej byl 1 bajt w $D6
|
|
120 = 00E2 InMapPointer = $E2
|
|
121 ; zmienna tymczasowa na ZP (2 bajty)
|
|
122 = 00E4 TempZP = $E4
|
|
123
|
|
124 = 020A VSERIN = $020a
|
|
125 = 02C5 COLPF1S = $02c5
|
|
126 = 02C6 COLPF2S = $02c6
|
|
127 = 02C8 COLBAKS = $02c8
|
|
128
|
|
129 = 0244 COLDST = $0244
|
|
130 ;MEMTOP = $02e5
|
|
131 ;MEMLO = $02e7
|
|
132
|
|
133 = 02FC KBCODES = $02fc
|
|
134
|
|
135 = 0300 DDEVIC = $0300
|
|
136 = 0301 DUNIT = $0301
|
|
137 = 0302 DCOMND = $0302
|
|
138 = 0304 DBUFA = $0304
|
|
139 = 0308 DBYT = $0308
|
|
140 = 030A DAUX1 = $030a
|
|
141 = 030B DAUX2 = $030b
|
|
142
|
|
143 = 0342 ICCMD = $0342
|
|
144 = 0344 ICBUFA = $0344
|
|
145 ;ICBUFA+1 = $0345
|
|
146 = 0348 ICBUFL = $0348
|
|
147 ;ICBUFL+1 = $0349
|
|
148 = 034A ICAX1 = $034a
|
|
149 = 034B ICAX2 = $034b
|
|
150
|
|
151 = 03FA GINTLK = $03FA ; 0 brak carta - potrzebne przy wylaczaniu Sparty X by oszukac OS ze nie bylo carta
|
|
152
|
|
153 = D204 AUDF3 = $d204
|
|
154 = D206 AUDF4 = $d206
|
|
155 = D207 AUDC4 = $d207
|
|
156 = D208 AUDCTL = $d208
|
|
157 = D20A SKSTRES = $d20a
|
|
158 = D20D SEROUT = $D20d
|
|
159 = D20D SERIN = $D20d
|
|
160 = D20E IRQEN = $D20e
|
|
161 = D20E IRQST = $D20e
|
|
162
|
|
163
|
|
164 = D20F SKSTAT = $d20f
|
|
165 = D20F SKCTL = $d20f
|
|
166
|
|
167
|
|
168 = D303 PBCTL = $d303
|
|
169 = D301 PORTB = $d301
|
|
170
|
|
171 = D40B VCOUNT = $D40B
|
|
172
|
|
173 = E456 JCIOMAIN = $e456
|
|
174 = E459 JSIOINT = $e459
|
|
175 = E471 JTESTROM = $e471
|
|
176 = E474 JRESETWM = $e474
|
|
177 = E477 JRESETCD = $e477
|
|
178
|
|
179 org $1FFD
|
|
180
|
|
181 ; adres bufora na sektor wczytywanego pliku w oryginale $0800, ale moze wydluzyc sie procedura
|
|
182 ; uwaga, ty juz odjety offset, wiec w procedurze nie odejmujemy!!!
|
|
183 = 07D7 FileSecBuff = loader.FirstMapSectorNr ; po przepisaniu
|
|
184 = 07D7 TempMEMLO = loader.FirstMapSectorNr ; Koniec procedury loader (poczatek bufora)
|
|
185
|
|
186 START
|
|
187 FFFF> 1FFD-2CE5> 4C 24 + JMP FirstRun ;1FFD 4C 70 21
|
|
188
|
|
189
|
|
190 ; procedura ladujaca, ktora zostanie przepisana pod adres $0700 po wybraniu programu
|
|
191 ; do wczytania !!!!!!
|
|
192
|
|
193 2000 movedproc
|
|
194 0700 .local loader, $0700
|
|
195
|
|
196 ; dwa starsze bajty (bo to wielkosc 3 bajtowa) dlugosci pliku odjetej od $1000000
|
|
197 ; dzieki czemu mozna stwierdzic osiagniecie konca pliku przez zwiekszanie tych
|
|
198 ; bajtow (wraz z najmlodszym) i sprawdzanie czy osiagnieto ZERO
|
|
199 0700 ToFileEndH
|
|
200 0700 00 00 .WO $0000
|
|
201 0702 FileInit ; skok JSR pod adres inicjalizacji po (przed) kazdym nastepnym bloku binarnym
|
|
202 0702 8A TXA
|
|
203 0703 48 PHA
|
|
204 0704 A5 28 LDA ToFileEndL
|
|
205 0706 48 PHA
|
|
206 0707 A5 3D LDA CompressedMapPos
|
|
207 0709 48 PHA
|
|
208 070A A5 3E LDA CompressedMapPos+1
|
|
209 070C 48 PHA
|
|
210 070D 20 93 07 JSR GoInitAddr
|
|
211 0710 68 PLA
|
|
212 0711 85 3E STA CompressedMapPos+1
|
|
213 0713 68 PLA
|
|
214 0714 85 3D STA CompressedMapPos
|
|
215 0716 68 PLA
|
|
216 0717 85 28 STA ToFileEndL
|
|
217 0719 68 PLA
|
|
218 071A AA TAX
|
|
219 071B FileNextBlock
|
|
220 ; wczytanie kolejnego bloku binarnego
|
|
221 071B 20 88 07 JSR FileGetBlockStart ; pobranie dwoch bajtow (adres poczatku bloku)
|
|
222 071E C0 88 CPY #$88 ; czy EOF
|
|
223 0720 D0 03 4C A6 07 jeq EndOfFile
|
|
224 0725 A5 24 LDA InBlockAddr
|
|
225 0727 25 25 AND InBlockAddr+1
|
|
226 0729 C9 FF CMP #$FF ; jesli oba sa $FF to.....
|
|
227 072B D0 03 BNE FileNoFFFFHead
|
|
228 072D 20 88 07 JSR FileGetBlockStart ; pobranie jeszcze raz
|
|
229 0730 FileNoFFFFHead
|
|
230 0730 A5 24 85 28 A5 25 + mwa InBlockAddr BlockATemp ; zapamietanie adresu poczatkowego bloku (na chwile)
|
|
231 0738 A9 26 LDA #<BlockLen
|
|
232 073A 85 24 sta InBlockAddr
|
|
233 073C A9 00 lda #>BlockLen
|
|
234 073E 85 25 sta InBlockAddr+1
|
|
235 0740 20 B0 07 JSR GetFile2Bytes ; pobranie dwoch bajtow - ; Pobranie adresu konca ladowanego bloku
|
|
236 0743 C0 88 CPY #$88 ; czy EOF
|
|
237 0745 F0 5F beq EndOfFile
|
|
238 ; wyliczenie długości bloku programu binarnego
|
|
239 0747 38 sec
|
|
240 0748 A5 26 lda BlockLen
|
|
241 074A E5 28 sbc BlockATemp
|
|
242 074C 85 26 sta BlockLen
|
|
243 074E A5 27 lda BlockLen+1
|
|
244 0750 E5 29 sbc BlockATemp+1
|
|
245 0752 85 27 sta BlockLen+1
|
|
246 0754 E6 26 D0 02 E6 27 inw BlockLen
|
|
247 075A A5 28 85 24 A5 29 + mwa BlockATemp InBlockAddr ; odtworzenie adresu poczatkowego bloku
|
|
248 0762 38 SEC
|
|
249 0763 WhatIsIt
|
|
250 0763 B0 0D BCS FileNoFirstBlock ; tu wstawiany jest raz (na poczatku) rozkaz LDA ($0D),Y
|
|
251 ; ktory tylko wylacza skok !!!
|
|
252 0765 CE 63 07 DEC WhatIsIt ; Przywraca poprzednie BCS z poprzedniego wiersza!!
|
|
253 0768 A5 24 LDA InBlockAddr ; Czyli TO wykona sie tylko RAZ
|
|
254 076A 8D E0 02 STA $02E0 ; Wpisujac adres pierwszego bloku do ard. startu
|
|
255 076D A5 25 LDA InBlockAddr+1 ; na wypadek gdyby plik nie konczyl sie blokiem
|
|
256 076F 8D E1 02 STA $02E1 ; z adresem startu (bywa i tak).
|
|
257 0772 FileNoFirstBlock
|
|
258 0772 A9 AF LDA #<Jrts ; do adresu inicjacji wpisanie adresu rozkazu RTS
|
|
259 0774 8D E2 02 STA $02E2 ; bo po kazdym bloku odbywa sie tam skok
|
|
260 0777 A9 07 LDA #>Jrts ; jesli nie jest to blok z adresem inicjacji
|
|
261 0779 8D E3 02 STA $02E3 ; to dzieki temu nic sie nie stanie
|
|
262
|
|
263 077C BlockReadLoop ;; petla odczytujaca z pliku blok binarny
|
|
264 077C 20 B8 07 JSR GetFileBytes
|
|
265 077F C0 88 CPY #$88 ; czy EOF
|
|
266 0781 F0 23 beq EndOfFile
|
|
267 0783 F0 03 4C 02 07 jne FileInit ; koniec bloku - skok pod adres inicjalizacji
|
|
268 0788 FileGetBlockStart
|
|
269 0788 A9 24 LDA #<InBlockAddr
|
|
270 078A 85 24 sta InBlockAddr
|
|
271 078C A9 00 lda #>InBlockAddr
|
|
272 078E 85 25 sta InBlockAddr+1
|
|
273 0790 4C B0 07 JMP GetFile2Bytes ; pobranie dwoch bajtow
|
|
274 0793 GoInitAddr
|
|
275 0793 6C E2 02 JMP ($02E2)
|
|
276 0796 SioJMP
|
|
277 0796 20 59 E4 JSR JSIOINT
|
|
278 ; BMI ReadErrorLoop ; jesli blad odczytu sektora to czytamy ponownie
|
|
279 0799 60 RTS
|
|
280 079A blokDanychIO_Loader
|
|
281 079A 31 01 52 40 D7 07 + .BY $31,$01,$52,$40,<FileSecBuff,>FileSecBuff,$0A,$00,$80,$00
|
|
282 ; Dlugosc sektora to dwa ostatnie bajty bloku danych ($0080 lub $0100)
|
|
283 = 07A2 SecLen = blokDanychIO_Loader+8 ; SecLen wskazuje na komórki do wpisania długości sektora przed przepisaniem procki na stronę $0700
|
|
284 07A4 SectorNumber
|
|
285 07A4 00 00 .WO $0000
|
|
286 07A6 EndOfFile ; to wykona sie przy nieoczekiwanym (i oczekiwanym) koncu pliku
|
|
287 07A6 A9 E4 LDA #>(JRESETWM-1) ; cieply start (RESET) zamiast SelfTestu
|
|
288 07A8 48 PHA
|
|
289 07A9 A9 73 LDA #<(JRESETWM-1)
|
|
290 07AB 48 PHA
|
|
291 ;WaitLine0
|
|
292 ; LDA VCOUNT
|
|
293 ; bne WaitLine0
|
|
294 07AC 6C E0 02 JMP ($02E0)
|
|
295 07AF Jrts
|
|
296 07AF 60 RTS
|
|
297 07B0 GetFile2Bytes
|
|
298 07B0 A9 02 85 26 A9 00 + mwa #2 BlockLen
|
|
299 07B8 GetFileBytes
|
|
300 07B8 A2 10 LDX #16 ; kanal 1
|
|
301 07BA A9 07 LDA #CGBINR ; rozkaz BGET
|
|
302 07BC 9D 42 03 STA ICCOM,X ; COMMAND
|
|
303 07BF A5 24 LDA InBlockAddr
|
|
304 07C1 9D 44 03 STA ICBUFA,x
|
|
305 07C4 A5 25 LDA InBlockAddr+1
|
|
306 07C6 9D 45 03 STA ICBUFA+1,x
|
|
307 07C9 A5 26 LDA BlockLen
|
|
308 07CB 9D 48 03 STA ICBUFL,x
|
|
309 07CE A5 27 LDA BlockLen+1
|
|
310 07D0 9D 49 03 STA ICBUFL+1,x
|
|
311 07D3 4C 56 E4 JMP CIO
|
|
312
|
|
313 ; starszy bajt licznika pozycji bajtu w sektorze - mlodszy jest caly czas w X
|
|
314 ; potrzebny do obslugi sektorow wiekszych od 256b
|
|
315 07D6 InSectorCountH
|
|
316 07D6 00 .BY $00
|
|
317 ; koniec czesci glownejprocedury ladowania pliku przepisywanej pod $0700
|
|
318 ; tu zaczyna sie (takze przepisywana) procedura wykonujaca sie tylko raz
|
|
319 ; w tym miejscu potem bedzie bufor
|
|
320 ; Tutaj wpisywany jest przez menu loadera numer pierwszego sektora
|
|
321 ; mapy pliku do wczytania, potrzebny tylko na starcie ladowania
|
|
322 07D7 zzzzzz ; dla wygody - ta etykieta powinna miec $2100 jesli procedura ja poprzedzajaca miesci sie na stronie
|
|
323 07D7 FirstMapSectorNr
|
|
324 07D7 00 00 .WO $0000
|
|
325 07D9 LoadStart
|
|
326 ; na poczatek czyszczenie pamieci od MEMLO do MEMTOP
|
|
327 07D9 AC E7 02 LDY MEMLO
|
|
328 07DC AD E8 02 LDA MEMLO+1
|
|
329 07DF 8D E6 07 STA InMemClearLoop+2
|
|
330 07E2 OutMemClearLoop
|
|
331 07E2 A9 00 LDA #$00
|
|
332 07E4 InMemClearLoop
|
|
333 07E4 99 00 09 STA $0900,Y
|
|
334 07E7 C8 INY
|
|
335 07E8 D0 FA BNE InMemClearLoop
|
|
336 07EA EE E6 07 INC InMemClearLoop+2
|
|
337 07ED AD E6 07 LDA InMemClearLoop+2
|
|
338 07F0 CD E6 02 CMP MEMTOP+1
|
|
339 07F3 90 ED BCC OutMemClearLoop
|
|
340 07F5 AD E6 02 LDA MEMTOP+1
|
|
341 07F8 8D 02 08 STA LastMemPageClear+2
|
|
342 07FB AC E5 02 LDY MEMTOP
|
|
343 07FE A9 00 LDA #$00
|
|
344 0800 LastMemPageClear
|
|
345 0800 99 00 80 STA $8000,Y
|
|
346 0803 88 DEY
|
|
347 0804 C0 FF CPY #$FF
|
|
348 0806 D0 F8 BNE LastMemPageClear
|
|
349 ; wyczyszczona, wiec ....
|
|
350 0808 AD 21 08 LDA tempToFileEndL
|
|
351 080B 85 28 STA ToFileEndL
|
|
352 080D A9 FF LDA #$FF
|
|
353 080F 8D FC 02 STA KBCODES
|
|
354 0812 EE 63 07 INC WhatIsIt ; zmiana BCS omijajacego procedure na LDA (adres pierwszego bloku do STARTADR)
|
|
355 0815 AE A2 07 LDX SecLen ; dlugosc sektora do X, czyli wymuszenie przeczytania nastepnego sektora
|
|
356 0818 AD A3 07 LDA Seclen+1 ; --
|
|
357 081B 8D D6 07 STA InSectorCountH ; -- obsluga sektorow ponad 256b
|
|
358 ;jmp *
|
|
359 081E 4C 1B 07 JMP FileNextBlock
|
|
360 ; tymczasowe przechowanie najmlodszego bajtu licznika do konca pliku
|
|
361 ; sluzy do przepisania tego bajtu z glownego programu do zmiennej loadera
|
|
362 0821 tempToFileEndL
|
|
363 0821 00 .BY $00
|
|
364 .endl
|
|
365 2122 JAkieTurbo
|
|
366 2122 USmode
|
|
367 2122 01 .BY $01 ; 0 - brak turbo 1 - Ultra Speed
|
|
368 2123 QMEG
|
|
369 2123 01 .BY $01 ;1 - brak QMEGa 0 - jest QMEG
|
|
370 2124 BootDrive
|
|
371 2124 00 .BY $00 ;Numer stacji dysków z której sie BOOT robi
|
|
372 2125 BootShift
|
|
373 2125 01 .BY $01 ; stan Shift w czasie bootowania (przyda sie jednak) 1 - bez shift 0 - Shift wcisniety
|
|
374 2126 FolderTurbo
|
|
375 2126 01 .BY $01 ; 00 wyłącza turbo 01 - zostawia tak jak jest - ty ma sie wpisywac znacznik turbo dla katalogu z MSDOS.DAT
|
|
376 2127 NewColors
|
|
377 2127 00 .BY $00 ; 00 oznacza ze nie zaladowano kolorow z pliku DAT i trzeba ustawic standardowe - inna wartosc zaladowano
|
|
378 ; Zamiana 4 mlodszych bitow z A na liczbe Hex w Ascii (tez w A)
|
|
379 2128 bin2AsciiHex
|
|
380 2128 29 0F AND #$0F
|
|
381 212A 09 30 ORA #$30
|
|
382 212C C9 3A CMP #$3A
|
|
383 212E 90 03 BCC labelka
|
|
384 2130 18 CLC
|
|
385 2131 69 07 ADC #$07
|
|
386 2133 labelka
|
|
387 2133 60 RTS
|
|
388 2134 Edriver
|
|
389 2134 45 3A 9B .BY "E:",$9b
|
|
390 2137 EditorOpen
|
|
391 ; otwarcie ekranu !!!
|
|
392 2137 A2 00 LDX #$00 ; kanal nr 0
|
|
393 2139 20 F5 2A JSR CloseX ; najpierw Zamkniecie Ekranu
|
|
394 213C 30 55 BMI ErrorDisplay
|
|
395 213E A2 00 LDX #$00 ; kanal nr 0
|
|
396 2140 A9 03 LDA #$03
|
|
397 2142 9D 42 03 STA ICCMD,X
|
|
398 2145 A9 0C LDA #$0C
|
|
399 2147 9D 4A 03 STA ICAX1,X
|
|
400 214A 9D 48 03 STA ICBUFL,X
|
|
401 214D A9 00 LDA #$00
|
|
402 214F 9D 4B 03 STA ICAX2,X
|
|
403 2152 9D 49 03 STA ICBUFL+1,X
|
|
404 2155 A9 34 LDA #<Edriver
|
|
405 2157 9D 44 03 STA ICBUFA,X
|
|
406 215A A9 21 LDA #>Edriver
|
|
407 215C 9D 45 03 STA ICBUFA+1,X
|
|
408 215F 20 56 E4 JSR JCIOMAIN ; Otwarcie "E:" w trybie Gr.0
|
|
409 2162 30 2F BMI ErrorDisplay
|
|
410 2164 60 RTS
|
|
411
|
|
412 2165 mainprog
|
|
413 2165 AD 23 21 LDA QMEG ; jesli jest QMEG to wylacza sie tryb US
|
|
414 2168 2D 25 21 AND BootShift ; i jak byl Shift w czasie bootowania tez sie wylacza
|
|
415 216B 8D 22 21 STA USmode
|
|
416 216E F0 1E BEQ NoUSSpeed
|
|
417 ; Pytanie stacji o predkosc transmisji Happy/US-Doubler
|
|
418 2170 A0 BB ldy #<blokDanychIO_GetUSSpeed
|
|
419 2172 A2 28 ldx #>blokDanychIO_GetUSSpeed
|
|
420 2174 20 E1 2A jsr Table2DCB
|
|
421 2177 20 59 E4 jsr JSIOINT ; wysylamy "?"
|
|
422 217A 10 07 bpl USSpeed
|
|
423 217C A9 00 lda #0 ; blad odczytu wiec nie ma USspeed - zerujemy wiec flage
|
|
424 217E 8D 22 21 sta USmode
|
|
425 2181 F0 0B beq NoUSSpeed
|
|
426 2183 USSpeed
|
|
427 2183 A0 02 LDY #$2
|
|
428 2185 USstatprint
|
|
429 2185 B9 1D 2C LDA ONtext,y
|
|
430 2188 99 F7 22 STA USstatus,y
|
|
431 218B 88 DEY
|
|
432 218C 10 F7 bpl USstatprint
|
|
433
|
|
434 218E NoUSSpeed
|
|
435 218E 4C D4 21 JMP ReadMainDir
|
|
436 2191 Error148
|
|
437 2191 A0 94 LDY #$94 ; kod bledu do Y
|
|
438 ; wyswietlenie komunikatu o bledzie - kod bledu w Y
|
|
439 2193 ErrorDisplay
|
|
440 2193 98 TYA
|
|
441 2194 48 PHA
|
|
442 2195 20 F3 2A JSR Close1
|
|
443 2198 68 PLA
|
|
444 2199 48 PHA
|
|
445 219A 4A LSR
|
|
446 219B 4A LSR
|
|
447 219C 4A LSR
|
|
448 219D 4A LSR
|
|
449 219E 20 28 21 JSR bin2AsciiHex ; 4 starsze bity na HEX
|
|
450 21A1 8D BA 21 STA ErrorNumHex
|
|
451 21A4 68 PLA
|
|
452 21A5 20 28 21 JSR bin2AsciiHex ; 4 mlodsze bity na HEX
|
|
453 21A8 8D BB 21 STA ErrorNumHex+1
|
|
454 21AB 20 46 2A JSR PrintXY
|
|
455 21AE 00 00 .BY $00,$00
|
|
456 21B0 7D .BY $7d ; kod czyszczenia ekranu
|
|
457 21B1 45 52 52 4F 52 20 + .BY "ERROR - $"
|
|
458 21BA ErrorNumHex
|
|
459 21BA 30 30 00 .BY "00",$00
|
|
460 ; czekamy na dowolny klawisz
|
|
461 21BD A9 FF LDA #$FF
|
|
462 21BF 8D FC 02 STA KBCODES
|
|
463 21C2 WaitKloop
|
|
464 21C2 AE FC 02 LDX KBCODES
|
|
465 21C5 E8 INX
|
|
466 21C6 F0 FA BEQ WaitKloop
|
|
467 21C8 8D FC 02 STA KBCODES ; w A jest $FF
|
|
468 ; ------------------
|
|
469 ; na wypadek wybrania nieistniejacej stacji
|
|
470 ; po bledzie przechodzimy na te z ktorej sie ladowalismy
|
|
471 21CB AD 24 21 LDA BootDrive
|
|
472 ;LDA #1
|
|
473 21CE 20 98 2B JSR SeTDriveNR
|
|
474 ; -----------------
|
|
475 21D1 4C 65 21 JMP mainprog ; i odpalamy program od nowa
|
|
476 21D4 ReadMainDir
|
|
477 21D4 20 C0 29 JSR ReadPERCOM
|
|
478 21D7 A2 2D LDX #>FirstSectorBuff
|
|
479 21D9 A0 00 LDY #<FirstSectorBuff
|
|
480 21DB 20 F5 29 JSR ReadFirstSect
|
|
481 ; Sprawdzenie wersji DOSa pod ktora formatowany byl dysk
|
|
482 21DE AD 20 2D LDA FirstSectorBuff+$20
|
|
483 21E1 C9 11 CMP #$11 ; Sparta DOS 1.1
|
|
484 21E3 F0 08 BEQ SpartaDisk
|
|
485 21E5 C9 20 CMP #$20 ; Sparta DOS 2.x 3.x Sparta DOS X 4.1x/4.2x
|
|
486 21E7 F0 04 BEQ SpartaDisk
|
|
487 21E9 C9 21 CMP #$21 ; Nowy format Sparta DOS X >= 4.39 (moga byc sektory wieksze niz 256b)
|
|
488 21EB D0 A4 BNE Error148 ; Nieobslugiwany format dyskietki
|
|
489 21ED SpartaDisk
|
|
490 21ED A2 00 LDX #$00
|
|
491 ; pobranie dlugosci sektora ($00 lub $80) - poprawione dla wiekszych niz 256
|
|
492 21EF AD 1F 2D LDA FirstSectorBuff+$1F
|
|
493 21F2 30 04 BMI Sektor128b
|
|
494 21F4 AA TAX
|
|
495 21F5 A9 00 LDA #$00
|
|
496 21F7 E8 INX ; i wyliczenie starszego bajtu
|
|
497 21F8 Sektor128b
|
|
498 21F8 8D A2 20 STA .adr loader.SecLen ; przed przepisaniem
|
|
499 21FB 8E A3 20 STX .adr loader.SecLen+1 ; przed przepisaniem
|
|
500 ; pokazanie na ekranie
|
|
501 21FE BD 1A 2C LDA DensityCodes,X
|
|
502 2201 8D D3 22 STA DensityDisplay
|
|
503 ; pobranie numeru pierwszego sektora mapy sektorow glownego katalogu
|
|
504 2204 AC 09 2D LDY FirstSectorBuff+$09
|
|
505 2207 AE 0A 2D LDX FirstSectorBuff+$0A
|
|
506 ; odczyt katalogu, ktorego mapa zaczyna sie w sektorze y*256+x
|
|
507 220A ReadDIR
|
|
508 ; ustawienie znacznika wlaczenia Turbo dla katalogu
|
|
509 220A A9 01 LDA #$01
|
|
510 220C 8D 26 21 STA FolderTurbo
|
|
511 220F 84 D2 STY DirMapSect
|
|
512 2211 86 D3 STX DirMapSect+1
|
|
513 2213 A9 2F LDA #>DirSectorBuff
|
|
514 2215 85 D1 STA CurrentFileInfoBuff+1
|
|
515 2217 85 CB STA CurrentDirBuf+1
|
|
516 2219 A9 80 LDA #<DirSectorBuff
|
|
517 221B 85 D0 STA CurrentFileInfoBuff
|
|
518 221D 85 CA STA CurrentDirBuf
|
|
519 221F A9 00 LDA #$00
|
|
520 2221 8D 27 21 STA NewColors ; wyzerowanie kolorow tak zeby jak nie bedzie ich w DAT ustawily sie standardowe (akurat mamy 0 w A)
|
|
521 2224 85 D4 STA $D4
|
|
522 2226 85 D5 STA $D5
|
|
523 2228 A9 17 LDA #$17
|
|
524 222A 20 CA 28 JSR label39
|
|
525 222D A5 D0 LDA CurrentFileInfoBuff
|
|
526 222F 85 CC STA CurrentDirBufEnd
|
|
527 2231 A5 D1 LDA CurrentFileInfoBuff+1
|
|
528 2233 85 CD STA CurrentDirBufEnd+1
|
|
529 2235 A9 00 LDA #$00
|
|
530 2237 85 D7 STA $D7
|
|
531 2239 85 D8 STA $D8
|
|
532 223B A5 CA LDA CurrentDirBuf
|
|
533 223D 85 D0 STA CurrentFileInfoBuff
|
|
534 223F A5 CB LDA CurrentDirBuf+1
|
|
535 2241 85 D1 STA CurrentFileInfoBuff+1
|
|
536 2243 label46
|
|
537 2243 A5 D1 LDA CurrentFileInfoBuff+1
|
|
538 2245 C5 CD CMP CurrentDirBufEnd+1
|
|
539 2247 90 08 BCC label40
|
|
540 2249 D0 71 BNE ToStartOfDir
|
|
541 224B A5 D0 LDA CurrentFileInfoBuff
|
|
542 224D C5 CC CMP CurrentDirBufEnd
|
|
543 224F B0 6B BCS ToStartOfDir
|
|
544 2251 label40
|
|
545 2251 A0 00 LDY #$00
|
|
546 2253 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
547 2255 29 38 AND #$38
|
|
548 2257 C9 08 CMP #$08
|
|
549 2259 D0 1C BNE label42
|
|
550 225B A0 10 LDY #$10
|
|
551 225D A2 0A LDX #$0A
|
|
552 225F label43
|
|
553 225F B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
554 2261 DD 6C 22 CMP ProgName,X
|
|
555 2264 D0 11 BNE label42
|
|
556 2266 88 DEY
|
|
557 2267 CA DEX
|
|
558 2268 10 F5 BPL label43
|
|
559 226A 30 19 BMI DATfileFound
|
|
560 226C ProgName
|
|
561 226C 4D 53 44 4F 53 20 + .BY "MSDOS DAT"
|
|
562 2277 label42
|
|
563 2277 A5 D0 LDA CurrentFileInfoBuff
|
|
564 2279 18 CLC
|
|
565 227A 69 17 ADC #$17
|
|
566 227C 85 D0 STA CurrentFileInfoBuff
|
|
567 227E 90 02 BCC label45
|
|
568 2280 E6 D1 INC CurrentFileInfoBuff+1
|
|
569 2282 label45
|
|
570 2282 4C 43 22 JMP label46
|
|
571 ; znaleziono plik z dlugimi nazwami
|
|
572 2285 DATfileFound
|
|
573 ; numer pierwszego sektora mapy sektorow pliku MSDOS.DAT przepisujemy do
|
|
574 ; wskaznika aktualnego sektora mapy pliku/katalogu. Dzieki temu przy skoku do procedury czytania
|
|
575 ; sektora mapy, przeczyta sie wlasnie ten pierwszy
|
|
576 2285 A0 01 LDY #$01
|
|
577 2287 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
578 2289 85 D2 STA DirMapSect
|
|
579 228B C8 INY
|
|
580 228C B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
581 228E 85 D3 STA DirMapSect+1
|
|
582 2290 C8 INY
|
|
583 2291 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
584 2293 85 D4 STA $D4
|
|
585 2295 C8 INY
|
|
586 2296 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
587 2298 85 D5 STA $D5
|
|
588 229A C8 INY
|
|
589 229B B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
590 229D F0 06 BEQ label47
|
|
591 229F A9 FF LDA #$FF
|
|
592 22A1 85 D4 STA $D4
|
|
593 22A3 85 D5 STA $D5
|
|
594 22A5 label47
|
|
595 22A5 A5 CC LDA CurrentDirBufEnd
|
|
596 22A7 85 D0 STA CurrentFileInfoBuff
|
|
597 22A9 A5 CD LDA CurrentDirBufEnd+1
|
|
598 22AB 85 D1 STA CurrentFileInfoBuff+1
|
|
599 22AD A9 2E LDA #$2E
|
|
600 22AF 20 CA 28 JSR label39
|
|
601 22B2 A5 D0 LDA CurrentFileInfoBuff
|
|
602 22B4 85 CE STA $CE
|
|
603 22B6 A5 D1 LDA CurrentFileInfoBuff+1
|
|
604 22B8 85 CF STA $CF
|
|
605 22BA E6 D8 INC $D8
|
|
606 ; ustawienie wskaznikow dla listy wyswietlanych plikow na poczatek katalogu
|
|
607 22BC ToStartOfDir
|
|
608 22BC A9 00 LDA #$00
|
|
609 22BE 85 D6 STA LastFilesPageFlag
|
|
610 22C0 A5 CA LDA CurrentDirBuf
|
|
611 22C2 18 CLC
|
|
612 22C3 69 17 ADC #$17
|
|
613 22C5 85 D0 STA CurrentFileInfoBuff
|
|
614 22C7 A5 CB LDA CurrentDirBuf+1
|
|
615 22C9 69 00 ADC #$00
|
|
616 22CB 85 D1 STA CurrentFileInfoBuff+1
|
|
617 22CD StatusBarPrint
|
|
618 22CD 20 46 2A JSR PrintXY
|
|
619 22D0 00 00 .BY $00,$00
|
|
620 22D2 7D .BY $7d
|
|
621 22D3 DensityDisplay
|
|
622 22D3 A0 C4 .BY +$80," D"
|
|
623 22D5 DriveDisp1 ; "
|
|
624 22D5 C1 BA A0 CD D3 C4 + .BY +$80,"A: MSDOS 4.7 QMEG:"
|
|
625 22E8 QMEGstatus
|
|
626 22E8 CF C6 C6 AF C2 C1 + .BY +$80,"OFF/BAS:"
|
|
627 22F0 BASstatus
|
|
628 22F0 CF C6 C6 AF D5 D3 + .BY +$80,"OFF/US:"
|
|
629 22F7 USstatus
|
|
630 22F7 CF C6 C6 A0 .BY +$80,"OFF " ; w inversie
|
|
631 22FB 00 .BY $00
|
|
632 ; Nowa (minus pierwsza ;) linijka opisu na dole
|
|
633 22FC 20 46 2A JSR PrintXY
|
|
634 22FF 11 15 .BY $11,$15
|
|
635 2301 B1 .BY +$80,"1"
|
|
636 2302 2D .BY "-"
|
|
637 2303 B8 .BY +$80,"8"
|
|
638 2304 20 6F 72 20 .BY " or "
|
|
639 2308 E3 F4 F2 EC .BY +$80,"ctrl"
|
|
640 230C 2B .BY "+"
|
|
641 230D C1 AE AE CF .BY +$80,"A..O"
|
|
642 2311 20 44 72 69 76 65 .BY " Drive"
|
|
643 2317 00 .BY $00
|
|
644 ; Pierwsza linijka opisu na dole strony
|
|
645 2318 20 46 2A JSR PrintXY
|
|
646 231B 01 16 .BY $01,$16
|
|
647 231D D3 D0 C1 C3 C5 .BY +$80,"SPACE"
|
|
648 2322 3A 43 6F 6E 74 69 + .BY ":Continue "
|
|
649 232D D3 C8 C9 C6 D4 .BY +$80,"SHIFT"
|
|
650 2332 2B 2E 2E 2E 4E 6F + .BY "+...No High Speed"
|
|
651 2343 00 .BY $00
|
|
652 ; Druga linijka opisu na dole strony
|
|
653 2344 20 46 2A JSR PrintXY
|
|
654 2347 02 17 .BY $02,$17
|
|
655 2349 C5 D3 C3 .BY +$80,"ESC"
|
|
656 234C 3A 41 6C 6C 20 66 + .BY ":All files "
|
|
657 2358 BE .BY +$80,">"
|
|
658 2359 3A 4D 61 69 6E 20 + .BY ":Main Dir. "
|
|
659 2365 BC .BY +$80,"<"
|
|
660 2366 3A 55 50 2D 44 49 + .BY ":UP-DIR."
|
|
661 236E 00 .BY $00
|
|
662 236F A9 00 LDA #$00
|
|
663 2371 85 D9 STA NamesOnScreen
|
|
664 2373 label68
|
|
665 2373 A5 D1 LDA CurrentFileInfoBuff+1
|
|
666 2375 C5 CD CMP CurrentDirBufEnd+1
|
|
667 2377 90 08 BCC NoLastFileInDir
|
|
668 2379 D0 55 BNE LastFilesPageJump
|
|
669 237B A5 D0 LDA CurrentFileInfoBuff
|
|
670 237D C5 CC CMP CurrentDirBufEnd
|
|
671 237F B0 4F BCS LastFilesPageJump
|
|
672 2381 NoLastFileInDir
|
|
673 2381 A0 00 LDY #$00
|
|
674 2383 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
675 2385 F0 49 BEQ LastFilesPageJump
|
|
676 2387 A2 22 LDX #$22
|
|
677 2389 A9 20 LDA #$20 ; spacja
|
|
678 238B label50
|
|
679 238B 9D 3C 24 STA GameName,X
|
|
680 238E CA DEX
|
|
681 238F 10 FA BPL label50
|
|
682 2391 A0 10 LDY #$10
|
|
683 2393 A2 0A LDX #$0A
|
|
684 2395 label51
|
|
685 2395 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
686 2397 9D 3C 24 STA GameName,X
|
|
687 239A 88 DEY
|
|
688 239B CA DEX
|
|
689 239C 10 F7 BPL label51
|
|
690 239E A5 D9 LDA NamesOnScreen
|
|
691 23A0 18 CLC
|
|
692 23A1 69 41 ADC #$41 ; literka "A"
|
|
693 23A3 8D 39 24 STA GameKeySymbol
|
|
694 23A6 A5 D8 LDA $D8
|
|
695 23A8 D0 2C BNE label52
|
|
696 23AA A0 00 LDY #$00
|
|
697 ; status sprawdzanego pliku
|
|
698 23AC B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
699 23AE 29 19 AND #$19
|
|
700 23B0 C9 09 CMP #$09
|
|
701 ; sprawdzamy czy Nie skasowany, zabezpieczony i "w uzyciu"
|
|
702 23B2 F0 08 BEQ label53
|
|
703 23B4 A6 D7 LDX $D7
|
|
704 23B6 F0 1B BEQ label54
|
|
705 23B8 C9 08 CMP #$08
|
|
706 23BA D0 17 BNE label54
|
|
707 23BC label53
|
|
708 ; jeszcze raz status sprawdzanego pliku
|
|
709 23BC B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
710 23BE 29 20 AND #$20
|
|
711 ; sprawdzenie czy to podkatalog jesli nie 'label55' (czyli plik)
|
|
712 23C0 F0 0B BEQ label55
|
|
713 ; obsluga wyswietlenia nazwy podlatalogu (dopisanie "<SUB-DIR>")
|
|
714 23C2 A2 08 LDX #$08
|
|
715 23C4 label56
|
|
716 23C4 BD 4B 25 LDA SubDirText,X
|
|
717 23C7 8D 48 24 STA GameName+12
|
|
718 23CA CA DEX
|
|
719 23CB 10 F7 BPL label56
|
|
720 23CD label55
|
|
721 23CD 4C 2C 24 JMP GameNamePrint
|
|
722 23D0 LastFilesPageJump
|
|
723 23D0 4C D4 24 JMP LastFilesPage
|
|
724 23D3 label54
|
|
725 23D3 4C 84 24 JMP label59
|
|
726 23D6 label52
|
|
727 23D6 A0 00 LDY #$00
|
|
728 23D8 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
729 23DA 29 18 AND #$18
|
|
730 23DC C9 08 CMP #$08
|
|
731 23DE D0 F3 BNE label54
|
|
732 23E0 A5 CC LDA CurrentDirBufEnd
|
|
733 23E2 85 D4 STA $D4
|
|
734 23E4 A5 CD LDA CurrentDirBufEnd+1
|
|
735 23E6 85 D5 STA $D5
|
|
736 23E8 label65
|
|
737 23E8 A5 D5 LDA $D5
|
|
738 23EA C5 CF CMP $CF
|
|
739 23EC 90 08 BCC label60
|
|
740 23EE D0 E3 BNE label54
|
|
741 23F0 A5 D4 LDA $D4
|
|
742 23F2 C5 CE CMP $CE
|
|
743 23F4 B0 DD BCS label54
|
|
744 ; tu trzebaby sprawdzic * - tyle ze sprawdzaloby sie to przy szukaniu kazdej nazwy
|
|
745 23F6 label60
|
|
746 23F6 A0 00 LDY #$00
|
|
747 23F8 B1 D4 LDA ($D4),Y
|
|
748 23FA C9 2A CMP #'*'
|
|
749 23FC D0 06 BNE CompareNames
|
|
750 23FE 8D 27 21 STA NewColors
|
|
751 2401 20 5E 2B JSR Asteriks
|
|
752 2404 CompareNames
|
|
753 ; Porownanie nazwy pliku do wyswietlenia z nazwa z MSDOS.DAT
|
|
754 2404 A0 0A LDY #$0A ; 8+3 znaki
|
|
755 2406 Checking62
|
|
756 2406 B1 D4 LDA ($D4),Y
|
|
757 2408 D9 3C 24 CMP GameName,Y
|
|
758 240B D0 11 BNE CheckNextName ; jesli to nie ta nazwa sprawdzamy nastepna z bufora dlugich nazw
|
|
759 240D 88 DEY
|
|
760 240E 10 F6 BPL Checking62
|
|
761 ; Wpisanie nazwy "ekranowej" zamiast nazwy pliku
|
|
762 2410 A0 0B LDY #$0B ; przesuniecie o 11 bajtow zeby ominac nazwe DOSowa pliku
|
|
763 2412 ReplacingName
|
|
764 2412 B1 D4 LDA ($D4),Y
|
|
765 2414 99 31 24 STA GameName-$0B,Y ; nadpisujemy nazwe pliku w buforze wyswietlania
|
|
766 2417 C8 INY
|
|
767 2418 C0 2E CPY #$2E
|
|
768 241A 90 F6 BCC ReplacingName
|
|
769 241C B0 0E BCS GameNamePrint
|
|
770 241E CheckNextName
|
|
771 241E A5 D4 LDA $D4
|
|
772 2420 18 CLC
|
|
773 2421 69 2E ADC #$2E
|
|
774 2423 85 D4 STA $D4
|
|
775 2425 90 02 BCC label64
|
|
776 2427 E6 D5 INC $D5
|
|
777 2429 label64
|
|
778 2429 4C E8 23 JMP label65
|
|
779 242C GameNamePrint
|
|
780 242C A5 D9 LDA NamesOnScreen
|
|
781 242E 18 CLC
|
|
782 242F 69 02 ADC #$02
|
|
783 2431 8D 38 24 STA YposGameName
|
|
784 2434 20 46 2A JSR PrintXY
|
|
785 2437 01 .BY $01
|
|
786 2438 YposGameName
|
|
787 2438 02 .BY $02
|
|
788 2439 GameKeySymbol
|
|
789 2439 41 29 20 .BY "A) "
|
|
790 243C GameName
|
|
791 243C 20 20 20 20 20 20 + .BY " "
|
|
792 245F 00 .BY $00
|
|
793 2460 A5 D9 LDA NamesOnScreen
|
|
794 2462 0A ASL
|
|
795 2463 AA TAX
|
|
796 2464 A5 D0 LDA CurrentFileInfoBuff
|
|
797 2466 9D 30 2C STA FirstSectorsTable,X
|
|
798 2469 A5 D1 LDA CurrentFileInfoBuff+1
|
|
799 246B 9D 31 2C STA FirstSectorsTable+1,X
|
|
800 246E A5 D0 LDA CurrentFileInfoBuff
|
|
801 2470 18 CLC
|
|
802 2471 69 17 ADC #$17
|
|
803 2473 85 D0 STA CurrentFileInfoBuff
|
|
804 2475 90 02 BCC label66
|
|
805 2477 E6 D1 INC CurrentFileInfoBuff+1
|
|
806 2479 label66
|
|
807 2479 E6 D9 INC NamesOnScreen
|
|
808 247B A5 D9 LDA NamesOnScreen
|
|
809 247D C9 13 CMP #$13
|
|
810 247F B0 42 BCS ContArrowsPrint ; jest wiecej plikow niz sie zmiescilo na ekranie
|
|
811 2481 4C 73 23 JMP label68
|
|
812 2484 label59
|
|
813 2484 A5 D0 LDA CurrentFileInfoBuff
|
|
814 2486 18 CLC
|
|
815 2487 69 17 ADC #$17
|
|
816 2489 85 D0 STA CurrentFileInfoBuff
|
|
817 248B 90 02 BCC label69
|
|
818 248D E6 D1 INC CurrentFileInfoBuff+1
|
|
819 248F label69
|
|
820 248F 4C 73 23 JMP label68
|
|
821 2492 MainDirKEY
|
|
822 2492 4C D4 21 JMP ReadMainDir
|
|
823 2495 UpDirKEY
|
|
824 2495 A0 02 LDY #$02
|
|
825 2497 B1 CA LDA (CurrentDirBuf),Y
|
|
826 2499 AA TAX
|
|
827 249A 88 DEY
|
|
828 249B 11 CA ORA (CurrentDirBuf),Y
|
|
829 249D F0 37 BEQ KeyboardProc
|
|
830 249F B1 CA LDA (CurrentDirBuf),Y
|
|
831 24A1 A8 TAY
|
|
832 24A2 4C 0A 22 JMP ReadDIR
|
|
833 24A5 EscKEY
|
|
834 ; sprawdzmy czy z Shift
|
|
835 24A5 AD 0F D2 LDA SKSTAT ; jesli jest Shift to czyscimy ekran i do DOS !!!
|
|
836 24A8 29 08 and #$08
|
|
837 24AA D0 06 BNE NoSHIFTEsc
|
|
838 24AC 20 37 21 JSR EditorOpen
|
|
839 24AF 6C 0A 00 JMP (DOSVEC)
|
|
840 24B2 NoSHIFTEsc
|
|
841 24B2 A2 00 LDX #$00
|
|
842 24B4 86 D8 STX $D8
|
|
843 24B6 E8 INX
|
|
844 24B7 86 D7 STX $D7
|
|
845 24B9 ToStartOfDirJump
|
|
846 24B9 4C BC 22 JMP ToStartOfDir
|
|
847 24BC SpaceKEY
|
|
848 24BC A5 D6 LDA LastFilesPageFlag ; jesli wyswietlona zostala ostatnia strona listy
|
|
849 24BE D0 F9 BNE ToStartOfDirJump ; to wyswietlamy liste od poczatku
|
|
850 24C0 4C CD 22 JMP StatusBarPrint ; a jesli nie lecimy z wyswietlaniem dalej
|
|
851 ; Wyswietlenie strzalek pokazujacych ze jest wiecej plikow niz miesci sie na ekranie
|
|
852 24C3 ContArrowsPrint
|
|
853 24C3 20 46 2A JSR PrintXY
|
|
854 24C6 01 15 .BY $01,$15
|
|
855 24C8 1D .BY $1D ; strzalka w dol
|
|
856 24C9 00 .BY $00
|
|
857 24CA 20 46 2A JSR PrintXY
|
|
858 24CD 0E 15 .BY $0E,$15
|
|
859 24CF 1D .BY $1D ; strzalka w dol
|
|
860 24D0 00 .BY $00
|
|
861 24D1 4C D6 24 JMP KeyboardProc
|
|
862 24D4 LastFilesPage
|
|
863 24D4 E6 D6 INC LastFilesPageFlag
|
|
864 24D6 KeyboardProc
|
|
865 24D6 AD 27 21 LDA NewColors
|
|
866 24D9 D0 0D BNE ColorsAlreadySet
|
|
867 24DB A9 C4 LDA #$C4 ; ustawienie koloru tła i liter
|
|
868 24DD 8D C6 02 STA COLPF2S
|
|
869 24E0 8D C8 02 STA COLBAKS
|
|
870 24E3 A9 CA LDA #$CA
|
|
871 24E5 8D C5 02 STA COLPF1S
|
|
872 24E8 ColorsAlreadySet
|
|
873 24E8 20 FD 2A JSR GetKey
|
|
874 24EB 29 7F AND #%01111111 ; eliminujemy invers
|
|
875 24ED F0 E7 BEQ KeyboardProc ; na początku wykluczamy 0 (znak serduszka) - to dla wygody ustalania numeru napedu
|
|
876 24EF C9 3E CMP #$3E ; ">"
|
|
877 24F1 F0 9F BEQ MainDirKEY
|
|
878 24F3 C9 3C CMP #$3C ; "<"
|
|
879 24F5 F0 9E BEQ UpDirKEY
|
|
880 24F7 C9 7E CMP #$7E ; BackSpace
|
|
881 24F9 F0 9A BEQ UpDirKEY
|
|
882 24FB C9 1B CMP #$1B ; Esc
|
|
883 24FD F0 A6 BEQ EscKEY
|
|
884 24FF C9 20 CMP #$20 ; Spacja
|
|
885 2501 F0 B9 BEQ SpaceKEY
|
|
886 ; ----------------
|
|
887 ; sprawdzenie ctrl+A do ctrl+O (kody od $01 do $0f)
|
|
888 2503 C9 10 CMP #$10
|
|
889 2505 B0 06 BCS noCtrlLetter ; jesli kod mniejszy od 16 to naped (0 wykluczylismy na poczatku)
|
|
890 2507 20 AB 2B JSR SeTDriveLetter
|
|
891 250A 4C 65 21 JMP mainprog
|
|
892 250D noCtrlLetter
|
|
893 ; sprawdzenie klawiszy 1-8
|
|
894 250D C9 31 CMP #'1'
|
|
895 250F 90 0D BCC NoNumber
|
|
896 2511 C9 39 CMP #'9'
|
|
897 2513 B0 09 BCS NoNumber
|
|
898 2515 38 SEC
|
|
899 2516 E9 30 SBC #'0'
|
|
900 2518 20 98 2B JSR SeTDriveNR
|
|
901 251B 4C 65 21 JMP mainprog
|
|
902 ; -----------------
|
|
903 251E NoNumber
|
|
904 251E C9 61 CMP #'a' ; czy nie ma capsa
|
|
905 2520 90 02 BCC BigLetters ; mniejsza od 'a' wiec duza - C tu bedzie skasowany
|
|
906 2522 E9 20 SBC #$20 ; tu nie trzeba SEC bo C jest zawsze ustawiony (odejmujemy $20 - przestawiamy z malych na duze)
|
|
907 2524 BigLetters
|
|
908 2524 38 SEC
|
|
909 2525 E9 41 SBC #'A' ; "A" ; czy klawisz A lub wiekszy
|
|
910 2527 C5 D9 CMP NamesOnScreen ; czy mniejszy lub równy ilości plików widocznych na ekranie
|
|
911 2529 B0 AB BCS KeyboardProc ; jesli spoza zakresu wracamy do czekania na klawisz
|
|
912 252B 0A ASL
|
|
913 252C AA TAX
|
|
914 252D BD 30 2C LDA FirstSectorsTable,X
|
|
915 2530 85 D4 STA $D4
|
|
916 2532 BD 31 2C LDA FirstSectorsTable+1,X
|
|
917 2535 85 D5 STA $D5
|
|
918 2537 A0 00 LDY #$00
|
|
919 2539 B1 D4 LDA ($D4),Y
|
|
920 253B 29 20 AND #$20 ; sprawdzamy czy to klatalog czy plik
|
|
921 253D F0 15 BEQ GOtoLoader ; jesli plik to skaczemy do pracedury przygotowujacej loader
|
|
922 ; a jesli katalog, pobieramy poczatek jego mapy sektorow i odczytujemy go na ekran
|
|
923 253F A0 02 LDY #$02
|
|
924 2541 B1 D4 LDA ($D4),Y
|
|
925 2543 AA TAX
|
|
926 2544 88 DEY
|
|
927 2545 B1 D4 LDA ($D4),Y
|
|
928 2547 A8 TAY
|
|
929 2548 4C 0A 22 JMP ReadDIR
|
|
930 254B SubDirText
|
|
931 254B 3C 53 55 42 2D 44 + .BY "<SUB-DIR>"
|
|
932 2554 GOtoLoader
|
|
933 2554 20 47 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka
|
|
934 2557 F0 03 BEQ DiskNotChanged1
|
|
935 2559 4C D4 21 JMP ReadMainDir ; jesli zmieniono to skok na poczatek programu i ponowny odczyt katalogu glownego
|
|
936 255C DiskNotChanged1
|
|
937 255C AD 26 21 LDA FolderTurbo
|
|
938 255F F0 07 BEQ SetTurboOFF
|
|
939 2561 AD 0F D2 LDA SKSTAT ; jesli jest Shift to odpowiednio ustawiamy flage przed samym zaladowaniem pliku !!!
|
|
940 2564 29 08 and #$08
|
|
941 2566 D0 03 BNE NoSHIFT
|
|
942 2568 SetTurboOFF
|
|
943 2568 8D 22 21 STA USmode ; tutaj mamy 0 w A wiec nie potrzeba LDA #0
|
|
944 256B NoSHIFT
|
|
945 256B A0 01 LDY #$01
|
|
946 256D B1 D4 LDA ($D4),Y
|
|
947 256F 8D D7 20 STA .adr loader.FirstMapSectorNr ; przed przepisaniem
|
|
948 2572 8D 43 2A sta blokDanychIO+$A ; od razu do bloku IOCB
|
|
949 2575 C8 INY
|
|
950 2576 B1 D4 LDA ($D4),Y
|
|
951 2578 8D D8 20 STA .adr loader.FirstMapSectorNr+1 ; przed przepisaniem
|
|
952 257B 8D 44 2A sta blokDanychIO+$B ; od razu do bloku IOCB
|
|
953 257E C8 INY
|
|
954 257F B1 D4 LDA ($D4),Y
|
|
955 2581 49 FF EOR #$FF
|
|
956 2583 8D 21 21 STA .adr loader.tempToFileEndL
|
|
957 2586 C8 INY
|
|
958 2587 B1 D4 LDA ($D4),Y
|
|
959 2589 49 FF EOR #$FF
|
|
960 258B 8D 00 20 STA .adr loader.ToFileEndH ; przed przepisaniem
|
|
961 258E C8 INY
|
|
962 258F B1 D4 LDA ($D4),Y
|
|
963 2591 49 FF EOR #$FF
|
|
964 2593 8D 01 20 STA .adr loader.ToFileEndH+1 ; przed przepisaniem
|
|
965 ; wszystko zapamietane mozna robic mape sektorow....
|
|
966 ; skompresowana mapa bedzie tworzona w buforze sektora katalogu
|
|
967 ; czyli DirSectorBuff
|
|
968 ; sektor mapy przed kompresja leci do DirMapSectorBuff
|
|
969 ; UWAGA
|
|
970 ; Zeby dzialala ta ladna procedura Bernaska mapa na poczatku musi
|
|
971 ; zawierac rozkaz przeczytania pierwszego sektora!!!!!
|
|
972 = 2F80 CompressedMap = DirSectorBuff
|
|
973 ; czytamy pierwszy sektor mapy
|
|
974 2596 A0 80 LDY #<DirMapSectorBuff
|
|
975 2598 A2 2D LDX #>DirMapSectorBuff
|
|
976 259A 20 0B 2A Jsr ReadSector
|
|
977 ; pobieramy numer pierwszego sektora pliku i od razu robimy wpis w mapie !!!
|
|
978 259D A9 00 LDA #00
|
|
979 259F 85 82 STA CompressedMapCounter
|
|
980 25A1 85 83 STA CompressedMapCounter+1
|
|
981 25A3 20 6F 26 JSR AddToCompressedMAP
|
|
982 25A6 AD 84 2D LDA DirMapSectorBuff+4
|
|
983 25A9 85 86 STA PrevFileSector
|
|
984 25AB 20 6F 26 JSR AddToCompressedMAP
|
|
985 25AE AD 85 2D LDA DirMapSectorBuff+5
|
|
986 25B1 85 87 sta PrevFileSector+1
|
|
987 25B3 20 6F 26 JSR AddToCompressedMAP
|
|
988 ; Inicjujemy liczniki
|
|
989 25B6 .zpvar MapCounter,CompressedMapCounter, MapCounterMem .word =$80
|
|
990 25B6 .zpvar PrevFileSector, MapPositionMem .word
|
|
991 25B6 .zpvar SectorOffset .word
|
|
992 25B6 .zpvar SectorsCounter .byte
|
|
993 25B6 A9 00 LDA #$00
|
|
994 25B8 85 81 STA MapCounter+1
|
|
995 25BA 85 8C STA SectorsCounter
|
|
996 25BC A9 06 lda #$06
|
|
997 25BE 85 80 STA MapCounter
|
|
998 25C0 GenerateCompressedMap
|
|
999 25C0 18 CLC
|
|
1000 25C1 A9 80 LDA #<DirMapSectorBuff
|
|
1001 25C3 65 80 ADC MapCounter
|
|
1002 25C5 85 88 STA MAPPositionMem
|
|
1003 25C7 A9 2D LDA #>DirMapSectorBuff
|
|
1004 25C9 65 81 ADC MapCounter+1
|
|
1005 25CB 85 89 STA MAPPositionMem+1
|
|
1006 25CD A2 00 LDX #0
|
|
1007 25CF A0 01 LDY #1
|
|
1008 25D1 A1 88 LDA (MAPPositionMem,x)
|
|
1009 25D3 11 88 ORA (MAPPositionMem),y
|
|
1010 25D5 F0 56 BEQ Sector00
|
|
1011 25D7 38 SEC
|
|
1012 25D8 A1 88 LDA (MAPPositionMem,x)
|
|
1013 25DA E5 86 SBC PrevFileSector
|
|
1014 25DC 85 8A STA SectorOffset
|
|
1015 25DE B1 88 LDA (MAPPositionMem),y
|
|
1016 25E0 E5 87 SBC PrevFileSector+1
|
|
1017 25E2 85 8B STA SectorOffset+1
|
|
1018 ; mamy odstep miedzy poprzednim a nastepnym sektorem
|
|
1019 25E4 D0 26 BNE OffsetToBig
|
|
1020 25E6 A5 8A LDA SectorOffset
|
|
1021 25E8 30 22 BMI OffsetToBig ; max przeskok 127 sektorow
|
|
1022 25EA C9 01 CMP #$01
|
|
1023 25EC D0 11 BNE JumpForward
|
|
1024 ; kolejny sektor
|
|
1025 ; zwiekszamy wiec licznik
|
|
1026 25EE E6 8C inc SectorsCounter
|
|
1027 25F0 A5 8C LDA SectorsCounter
|
|
1028 25F2 C9 7F CMP #%01111111
|
|
1029 25F4 D0 2C BNE GetNextMapWord
|
|
1030 ; tu licznik dotarl do konca zerujemy go
|
|
1031 ; dodajemy wpis do skompresowanej mapy i gotowe
|
|
1032 25F6 20 6F 26 JSR AddToCompressedMAP
|
|
1033 25F9 A9 00 LDA #0
|
|
1034 25FB 85 8C STA SectorsCounter
|
|
1035 25FD F0 23 BEQ GetNextMapWord
|
|
1036 ; ominiecie wyznaczonej ilości sektorów (w A)
|
|
1037 25FF JumpForward
|
|
1038 25FF 20 8A 26 JSR FlushBuffer
|
|
1039 2602 A5 8A LDA SectorOffset
|
|
1040 2604 09 80 ORA #%10000000
|
|
1041 2606 20 6F 26 JSR AddToCompressedMAP
|
|
1042 2609 4C 22 26 JMP GetNextMapWord
|
|
1043 ; wyznaczenie skoku do nowego sektora pliku
|
|
1044 260C OffsetToBig
|
|
1045 260C 20 8A 26 JSR FlushBuffer
|
|
1046 260F A9 00 LDA #0
|
|
1047 2611 20 6F 26 JSR AddToCompressedMAP
|
|
1048 2614 A0 00 LDY #00
|
|
1049 2616 B1 88 LDA (MAPPositionMem),y
|
|
1050 2618 20 6F 26 JSR AddToCompressedMAP
|
|
1051 261B A0 01 LDY #01
|
|
1052 261D B1 88 LDA (MAPPositionMem),y
|
|
1053 261F 20 6F 26 JSR AddToCompressedMAP
|
|
1054 2622 GetNextMapWord
|
|
1055 ; zapamietanie numeru obecnego sektora do porownania potem
|
|
1056 2622 A0 00 LDY #00
|
|
1057 2624 B1 88 LDA (MAPPositionMem),y
|
|
1058 2626 85 86 STA PrevFileSector
|
|
1059 2628 C8 INY
|
|
1060 2629 B1 88 LDA (MAPPositionMem),y
|
|
1061 262B 85 87 STA PrevFileSector+1
|
|
1062 262D Sector00
|
|
1063 262D 18 A5 80 69 02 85 + ADW MapCounter #2
|
|
1064 2638 ops01
|
|
1065 ; CPW MapCounter {.adr loader.SecLen} ; a to nie dziala
|
|
1066 2638 A5 81 LDA MapCounter+1
|
|
1067 263A CD A3 20 CMP .adr loader.SecLen+1
|
|
1068 263D D0 05 bne noteqal01
|
|
1069 263F A5 80 LDA MapCounter
|
|
1070 2641 CD A2 20 CMP .adr loader.SecLen
|
|
1071 2644 noteqal01
|
|
1072 2644 F0 03 4C C0 25 JNE GenerateCompressedMap
|
|
1073 ; czytamy nastepny sektor mapy
|
|
1074 ; sprawdzmy czy nie koniec
|
|
1075 2649 AD 80 2D LDA DirMapSectorBuff
|
|
1076 264C 0D 81 2D ORA DirMapSectorBuff+1
|
|
1077 264F F0 45 BEQ EndMakingMap
|
|
1078 2651 AD 80 2D LDA DirMapSectorBuff
|
|
1079 2654 8D 43 2A sta blokDanychIO+$A
|
|
1080 2657 AD 81 2D LDA DirMapSectorBuff+1
|
|
1081 265A 8D 44 2A sta blokDanychIO+$B
|
|
1082 265D A0 80 LDY #<DirMapSectorBuff
|
|
1083 265F A2 2D LDX #>DirMapSectorBuff
|
|
1084 2661 20 0B 2A Jsr ReadSector
|
|
1085 ; zerujemy licznik mapy
|
|
1086 2664 A9 00 LDA #$00
|
|
1087 2666 85 81 STA MapCounter+1
|
|
1088 2668 A9 04 lda #$04
|
|
1089 266A 85 80 STA MapCounter
|
|
1090 266C 4C C0 25 JMP GenerateCompressedMap
|
|
1091 ; dpisanie bajtu z A do mapy sektorow skompresowanej
|
|
1092 266F AddToCompressedMAP
|
|
1093 266F 48 PHA
|
|
1094 ; wyliczamy adresa
|
|
1095 2670 18 CLC
|
|
1096 2671 A5 82 LDA CompressedMapCounter
|
|
1097 2673 69 80 ADC #<CompressedMap
|
|
1098 2675 8D 81 26 STA xxxxbla
|
|
1099 2678 A5 83 LDA CompressedMapCounter+1
|
|
1100 267A 69 2F ADC #>CompressedMap
|
|
1101 267C 8D 82 26 STA xxxxbla+1
|
|
1102 267F 68 PLA
|
|
1103 = 2681 xxxxbla=*+1
|
|
1104 2680 8D FF FF STA $FFFF
|
|
1105 2683 E6 82 INC CompressedMapCounter
|
|
1106 2685 D0 02 BNE noinc013
|
|
1107 2687 E6 83 INC CompressedMapCounter+1
|
|
1108 2689 noinc013
|
|
1109 2689 60 RTS
|
|
1110 268A FlushBuffer
|
|
1111 268A A5 8C LDA SectorsCounter
|
|
1112 268C F0 07 BEQ NoFlush
|
|
1113 268E 20 6F 26 JSR AddToCompressedMAP
|
|
1114 2691 A9 00 LDA #0
|
|
1115 2693 85 8C STA SectorsCounter
|
|
1116 2695 NoFlush
|
|
1117 2695 60 RTS
|
|
1118 2696 EndMakingMap
|
|
1119 2696 20 8A 26 JSR FlushBuffer
|
|
1120 2699 LoaderGo
|
|
1121 2699 A0 00 LDY #$00
|
|
1122 269B 8C 44 02 STY COLDST
|
|
1123 269E A9 01 LDA #$01
|
|
1124 26A0 85 09 STA BOOT
|
|
1125 26A2 AE 00 07 LDX $700
|
|
1126 26A5 E0 53 CPX #'S' ; czy sparta, bo jesli tak, to wylaczamy carta
|
|
1127 26A7 D0 03 BNE NoRunFromDOS
|
|
1128 26A9 8D F8 03 STA $03F8 ; to wylaczalo BASIC !!!
|
|
1129 ; STA $D5EC ; to wylacza SpartaDOS X
|
|
1130 ; STY GINTLK ; i mowi OSowi, ze carta nigdy nie bylo :)
|
|
1131 26AC NoRunFromDOS
|
|
1132 26AC A9 BD LDA #<AfterWormStart
|
|
1133 26AE 85 0C STA DOSINI
|
|
1134 26B0 A9 26 LDA #>AfterWormStart
|
|
1135 26B2 85 0D STA DOSINI+1
|
|
1136 ; LDA #>JRESETCD
|
|
1137 ; STA DOSVEC+1
|
|
1138 ; LDA #<JRESETCD
|
|
1139 ; STA DOSVEC
|
|
1140 ; zapamietanie stanu urzadzen PBI
|
|
1141 26B4 AD 47 02 LDA PDVMASK
|
|
1142 26B7 8D 23 2C STA PDVMASKtemp
|
|
1143 26BA 4C 74 E4 JMP JRESETWM ; wymuszenie cieplego resetu - z ustawionymi odpowiednimi prametrami powrotu
|
|
1144 26BD AfterWormStart
|
|
1145 ; wyznaczamy MEMlo, najpierw dodajemy dlugosc bufora na sektor
|
|
1146 ; do koncowego adresu naszej procedury
|
|
1147 ; odtworzenie stanu PBI
|
|
1148 26BD AD 23 2C LDA PDVMASKtemp
|
|
1149 26C0 8D 47 02 STA PDVMASK
|
|
1150 ; JSR EditorOpen ; zamiast cieplego startu czyszczenie ekranu
|
|
1151 26C3 18 CLC
|
|
1152 26C4 A9 D7 LDA #<TempMEMLO
|
|
1153 26C6 6D A2 20 ADC .adr loader.SecLen
|
|
1154 26C9 8D E7 02 STA MEMLO
|
|
1155 26CC 85 3D STA CompressedMapPos
|
|
1156 ; STA pointerMov2b-1 ; przygotowanie procedury przepisujacej
|
|
1157 ; STA APPMHI ; wlasciwie tu powinno byc to samo co po pozniejszym zwiekszeniu MEMLO !!!!
|
|
1158 26CE A9 07 LDA #>TempMEMLO
|
|
1159 26D0 6D A3 20 ADC .adr loader.SecLen+1
|
|
1160 26D3 8D E8 02 STA MEMLO+1
|
|
1161 26D6 85 3E STA CompressedMapPos+1
|
|
1162 ; STA pointerMov2b
|
|
1163 ; STA APPMHI+1
|
|
1164 ; tu w MEMLO mamy pierwszy wolny bajt za buforem sektora
|
|
1165 ; jest to jednoczesnie adres umieszczenia skompresowanej
|
|
1166 ; mapy sektorow pliku dla loadera ale MINUS 1
|
|
1167 26D8 A5 3D D0 02 C6 3E + DEW CompressedMapPos
|
|
1168 ; teraz trzeba dodac dlugosc skompresowanej mapy bitowej
|
|
1169 ; i wpisac w procedurze przepisujacej turbo (modyfikacja kodu)
|
|
1170 26E0 18 CLC
|
|
1171 26E1 AD E7 02 LDA MEMLO
|
|
1172 ; ADC CompressedMapCounter
|
|
1173 ; STA MEMLO
|
|
1174 26E4 8D 95 27 STA TurboRelocADDR
|
|
1175 26E7 AD E8 02 LDA MEMLO+1
|
|
1176 ; ADC CompressedMapCounter+1
|
|
1177 ; STA MEMLO+1
|
|
1178 26EA 8D 96 27 STA TurboRelocADDR+1
|
|
1179 26ED A9 71 LDA #<JTESTROM
|
|
1180 26EF 85 0C STA DOSINI
|
|
1181 26F1 A9 E4 LDA #>JTESTROM
|
|
1182 26F3 85 0D STA DOSINI+1
|
|
1183 ; DEC BOOT ; przestawiamy z 2 na 1 (z CASINI na DOSINI)
|
|
1184 ; INC $033D ; bajty kontrolne zimnego startu
|
|
1185 ; INC $033E ; zmiana ich wartosci wymusza
|
|
1186 ; DEC $033F ; zimny start po RESET (blokujemy bo niektore gry startujace przez zmiane wektorow i skok do reset nie dzialaja)
|
|
1187 26F5 A2 00 LDX #$00
|
|
1188 26F7 86 08 STX WARMST ; zerowanie WARMST informuje programy ze byl zimny reset a nie cieply (The Last Starfighter)
|
|
1189 ; STX BOOT
|
|
1190 ; przepisanie glownej procedury ladujacej - DWIE STRONY pamieci
|
|
1191 26F9 moveloop1
|
|
1192 26F9 BD 00 20 LDA movedproc,X
|
|
1193 26FC 9D 00 07 STA $0700,X
|
|
1194 26FF BD 00 21 LDA movedproc+$0100,X
|
|
1195 2702 9D 00 08 STA $0800,X
|
|
1196 2705 E8 INX
|
|
1197 2706 D0 F1 BNE moveloop1
|
|
1198 ; przepisanie skompresowanej mapy sektorow pliku za bufor sektora
|
|
1199 /* moveloop2
|
|
1200 DEW CompressedMapCounter ; zmiejszamy licznik dlugasci mapy
|
|
1201 pointerMov2a=*+2
|
|
1202 LDA CompressedMap,x ; kod samomodyfikujacy sie
|
|
1203 pointerMov2b=*+2
|
|
1204 STA $FFFF,x ; kod samomodyfikujacy sie
|
|
1205 LDA CompressedMapCounter
|
|
1206 AND CompressedMapCounter+1
|
|
1207 CMP #$FF ; jesli licznik = -1 to przepisalismy cala mape !!!
|
|
1208 BEQ SectorMapReady
|
|
1209 INX
|
|
1210 BNE moveloop2
|
|
1211 inc pointerMov2a
|
|
1212 inc pointerMov2b
|
|
1213 bne moveloop2
|
|
1214 SectorMapReady
|
|
1215 */
|
|
1215
|
|
1216 2708 20 57 27 JSR ADDspeedProc ; procedura relokujaca procedury turbo (jesli potrzebne) i podnaszaca odpowiednio MEMLO
|
|
1217 270B 20 C7 2B JSR MEMLOprint ; wyswietlenie wartosci MEMLO (moze wyswietlac i inne rzeczy)
|
|
1218
|
|
1219 270E A2 00 LDX #$00
|
|
1220 2710 8A TXA
|
|
1221 ; wstepne czyszczenie (reszte RAM czysci procedura ladujaca - dzieki czemu czysci tez program glowny)
|
|
1222 2711 ClearLoop1
|
|
1223 2711 9D 00 01 STA $0100,X ; STOS !!!
|
|
1224 2714 9D 00 04 STA $0400,X ; bufor magnetofonu (128) i obszar zarezerwowany?? (drugie 128b)
|
|
1225 2717 9D 00 05 STA $0500,X
|
|
1226 271A 9D 00 06 STA $0600,X
|
|
1227 271D E0 80 CPX #$80 ;tylko ponad $80
|
|
1228 271F 90 02 BCC NoZpage
|
|
1229 2721 95 00 STA $00,X ; czyli polowa strony zerowej
|
|
1230 2723 NoZpage
|
|
1231 2723 E8 INX
|
|
1232 2724 D0 EB BNE ClearLoop1
|
|
1233 2726 A2 FF LDX #$FF
|
|
1234 2728 9A TXS ; "wyzerowanie wskaznika STOSU
|
|
1235
|
|
1236 ; a tutaj otwieramy kanal 1 CIO do odczytu
|
|
1237
|
|
1238 2729 A2 10 LDX #16 ; kanal 1
|
|
1239 272B A9 03 LDA #COPN ; rozkaz OPEN
|
|
1240 272D 9D 42 03 STA ICCOM,X ; COMMAND
|
|
1241 2730 A9 04 LDA #$04 ; READ
|
|
1242 2732 9D 4A 03 STA ICAUX1,X
|
|
1243 2735 A9 00 LDA #$00
|
|
1244 2737 9D 4B 03 STA ICAUX2,X
|
|
1245 273A A9 4A LDA # <FileToOpen
|
|
1246 273C 9D 44 03 STA ICBADR,X
|
|
1247 273F A9 27 LDA # >FileToOpen
|
|
1248 2741 9D 45 03 STA ICBADR+1,X
|
|
1249 2744 20 56 E4 JSR CIO
|
|
1250
|
|
1251 2747 4C D9 07 JMP loader.LoadStart ; po przepisaniu
|
|
1252 274A FileToOpen
|
|
1253 274A 48 3A 53 43 4F 52 + .BYTE 'H:SCORCH.XEX',0
|
|
1254 ; Sprawdzenie odpowiednich flag i przepisanie za loaderem procedury obslugi odpowiedniego Turba
|
|
1255 ; na koniec odpowiednie zmodyfikowanie MEMLO
|
|
1256 2757 ADDspeedProc
|
|
1257 2757 AD 22 21 LDA USmode
|
|
1258 275A F0 5F beq NoHappyLoader
|
|
1259 ; wyznaczamy offset procedury
|
|
1260 275C 38 SEC
|
|
1261 275D A9 BC LDA #<HappyUSMovedProc
|
|
1262 275F ED E7 02 SBC MEMLO
|
|
1263 2762 8D 18 2C STA HappyOffset
|
|
1264 2765 A9 27 LDA #>HappyUSMovedProc
|
|
1265 2767 ED E8 02 SBC MEMLO+1
|
|
1266 276A 8D 19 2C STA HappyOffset+1
|
|
1267
|
|
1268 276D A0 00 LDY #0
|
|
1269 276F A2 09 LDX #[$A-1] ;xjsrA - the last
|
|
1270 ; relokujemy skoki pod offset z MEMLO
|
|
1271 2771 HappyRelocate
|
|
1272 2771 38 SEC
|
|
1273 2772 BD 04 2C LDA xjsrTableL,x
|
|
1274 2775 85 32 STA SecBuffer
|
|
1275 2777 BD 0E 2C LDA xjsrTableH,x
|
|
1276 277A 85 33 STA SecBuffer+1
|
|
1277 277C B1 32 LDA (SecBuffer),y
|
|
1278 277E ED 18 2C SBC HappyOffset
|
|
1279 2781 91 32 STA (SecBuffer),y
|
|
1280 2783 C8 INY
|
|
1281 2784 B1 32 LDA (SecBuffer),y
|
|
1282 2786 ED 19 2C SBC HappyOffset+1
|
|
1283 2789 91 32 STA (SecBuffer),y
|
|
1284 278B 88 DEY
|
|
1285 278C CA DEX
|
|
1286 278D 10 E2 BPL HappyRelocate
|
|
1287
|
|
1288 278F A2 FE LDX #[EndHappyUSProc-HappyUSMovedProc-1]
|
|
1289 2791 label72x
|
|
1290 2791 BD BC 27 LDA HappyUSMovedProc,X
|
|
1291 = 2795 TurboRelocADDR=*+1
|
|
1292 2794 9D 00 0A STA $0A00,X
|
|
1293 2797 CA DEX
|
|
1294 2798 E0 FF CPX #$FF
|
|
1295 279A D0 F5 BNE label72x
|
|
1296 279C A0 FF LDY #[EndHappyUSProc-HappyUSMovedProc]
|
|
1297 279E A2 00 LDX #$00
|
|
1298 ; Zwiekszenie Memlo o dlugosc procedury i przelaczenie skoku do niej.
|
|
1299 27A0 label73
|
|
1300 27A0 98 TYA
|
|
1301 27A1 18 CLC
|
|
1302 27A2 6D E7 02 ADC MEMLO
|
|
1303 27A5 8D E7 02 STA MEMLO
|
|
1304 27A8 8A TXA
|
|
1305 27A9 6D E8 02 ADC MEMLO+1
|
|
1306 27AC 8D E8 02 STA MEMLO+1
|
|
1307 27AF AD 95 27 LDA TurboRelocADDR
|
|
1308 27B2 8D 97 07 STA loader.SioJMP+1 ; po przepisaniu
|
|
1309 27B5 AD 96 27 LDA TurboRelocADDR+1
|
|
1310 27B8 8D 98 07 STA loader.SioJMP+2 ; po przepisaniu
|
|
1311 27BB NoHappyLoader
|
|
1312 27BB 60 RTS
|
|
1313
|
|
1314
|
|
1315
|
|
1316 ; UWAGA !!!!!!!!!!!!!!
|
|
1317 ; Ta procedura ma maksymalna dlugosc jaka moze miec!!!!!
|
|
1318 ; powiekszenie jej O BAJT spowoduje ze przekroczy strone
|
|
1319 ; i nie przepisze sie prawidlowo na swoje miejsce !!!!!
|
|
1320 27BC HappyUSMovedProc ;
|
|
1321
|
|
1322 27BC AD 04 03 LDA DBUFA
|
|
1323 27BF 85 32 STA SecBuffer
|
|
1324 27C1 AD 05 03 LDA DBUFA+1
|
|
1325 27C4 85 33 STA SecBuffer+1
|
|
1326
|
|
1327 27C6 AD 08 03 LDA DBYT
|
|
1328 27C9 85 31 STA SecLenUS
|
|
1329
|
|
1330 27CB 78 SEI
|
|
1331 27CC BA TSX
|
|
1332 27CD 86 37 STX StackCopy
|
|
1333 27CF A9 0D LDA #$0D
|
|
1334 27D1 85 34 STA CRETRYZ
|
|
1335 ;command retry on zero page
|
|
1336 27D3 CommandLoop
|
|
1337 = 27D4 HappySpeed = *+1
|
|
1338 27D3 A9 28 LDA #$28 ;here goes speed from "?"
|
|
1339 27D5 8D 04 D2 STA AUDF3
|
|
1340 27D8 A9 34 LDA #$34
|
|
1341 27DA 8D 03 D3 STA PBCTL ;ustawienie linii command
|
|
1342 27DD A2 80 LDX #$80
|
|
1343 27DF DelayLoopCmd
|
|
1344 27DF CA DEX
|
|
1345 27E0 D0 FD BNE DelayLoopCmd
|
|
1346 27E2 8E 06 D2 STX AUDF4 ; zero
|
|
1347 27E5 86 35 STX TransmitError
|
|
1348 ; pokey init
|
|
1349 27E7 A9 23 LDA #$23
|
|
1350 27E9 20 5D 28 xjsr1 JSR SecTransReg
|
|
1351 ;
|
|
1352
|
|
1353 27EC 18 CLC
|
|
1354 27ED AD 00 03 LDA DDEVIC ; tu zawsze jest $31 (przynajmniej powinno)
|
|
1355 27F0 6D 01 03 ADC DUNIT ; dodajemy numer stacji
|
|
1356 27F3 69 FF ADC #$FF ; i odejmujemy jeden (jak w systemie Atari)
|
|
1357 27F5 85 30 STA CheckSum
|
|
1358 27F7 8D 0D D2 STA SEROUT
|
|
1359 27FA AD 02 03 LDA DCOMND
|
|
1360 27FD 20 73 28 xjsr2 JSR PutSIOByte
|
|
1361 2800 AD 0A 03 LDA DAUX1
|
|
1362 2803 20 73 28 xjsr3 JSR PutSIOByte
|
|
1363 2806 AD 0B 03 LDA DAUX2
|
|
1364 2809 20 73 28 xjsr4 JSR PutSIOByte
|
|
1365 280C A5 30 LDA CheckSum
|
|
1366 280E 20 73 28 xjsr5 JSR PutSIOByte
|
|
1367
|
|
1368 2811 waitforEndOftransmission
|
|
1369 2811 AD 0E D2 LDA IRQST
|
|
1370 2814 29 08 AND #$08
|
|
1371 2816 D0 F9 BNE waitforEndOftransmission
|
|
1372
|
|
1373 2818 A9 13 LDA #$13
|
|
1374 281A 20 5D 28 xjsr6 JSR SecTransReg
|
|
1375
|
|
1376 281D A9 3C LDA #$3c
|
|
1377 281F 8D 03 D3 STA PBCTL ;command line off
|
|
1378 ; two ACK's
|
|
1379 2822 A0 02 LDY #2
|
|
1380 2824 DoubleACK
|
|
1381 2824 20 8F 28 xjsr7 JSR GetSIOByte
|
|
1382 2827 C9 44 CMP #$44
|
|
1383 2829 B0 19 BCS ErrorHere
|
|
1384 282B 88 DEY
|
|
1385 282C D0 F6 BNE DoubleACK
|
|
1386
|
|
1387 ;ldy #0
|
|
1388 282E 84 30 STY CheckSum
|
|
1389 2830 ReadSectorLoop
|
|
1390 2830 20 8F 28 xjsr8 JSR GetSIOByte
|
|
1391 2833 91 32 STA (SecBuffer),y
|
|
1392 2835 20 87 28 xjsr9 JSR AddCheckSum
|
|
1393 2838 C8 INY
|
|
1394 2839 C4 31 CPY SecLenUS
|
|
1395 283B D0 F3 BNE ReadSectorLoop
|
|
1396
|
|
1397 283D 20 8F 28 xjsrA JSR GetSIOByte
|
|
1398 2840 C5 30 CMP CheckSum
|
|
1399 2842 F0 0B BEQ EndOfTransmission
|
|
1400 ;error!!!
|
|
1401 2844 ErrorHere
|
|
1402 2844 A0 90 LDY #$90
|
|
1403 2846 84 35 STY TransmitError
|
|
1404 2848 A6 37 LDX StackCopy
|
|
1405 284A 9A TXS
|
|
1406 284B C6 34 DEC CRETRYZ
|
|
1407 284D D0 84 BNE CommandLoop
|
|
1408
|
|
1409 284F EndOfTransmission
|
|
1410 284F A9 00 LDA #0
|
|
1411 2851 8D 07 D2 STA AUDC4
|
|
1412 2854 A5 10 LDA IRQENS
|
|
1413 2856 8D 0E D2 STA IRQEN
|
|
1414 2859 58 CLI
|
|
1415 285A A4 35 LDY TransmitError
|
|
1416 285C 60 RTS
|
|
1417
|
|
1418 285D SecTransReg
|
|
1419 285D 8D 0F D2 STA SKCTL
|
|
1420 2860 8D 0A D2 STA SKSTRES
|
|
1421 2863 A9 38 LDA #$38
|
|
1422 2865 8D 0E D2 STA IRQEN
|
|
1423 2868 A9 28 LDA #$28
|
|
1424 286A 8D 08 D2 STA AUDCTL
|
|
1425 286D A9 A8 LDA #$A8
|
|
1426 286F 8D 07 D2 STA AUDC4
|
|
1427 2872 60 RTS
|
|
1428
|
|
1429 2873 PutSIOByte
|
|
1430 2873 AA TAX
|
|
1431 2874 waitforSerial
|
|
1432 2874 AD 0E D2 LDA IRQST
|
|
1433 2877 29 10 AND #$10
|
|
1434 2879 D0 F9 BNE waitforSerial
|
|
1435
|
|
1436 287B 8D 0E D2 STA IRQEN
|
|
1437 287E A9 10 LDA #$10
|
|
1438 2880 8D 0E D2 STA IRQEN
|
|
1439
|
|
1440 2883 8A TXA
|
|
1441 2884 8D 0D D2 STA SEROUT
|
|
1442
|
|
1443 2887 AddCheckSum
|
|
1444 2887 18 CLC
|
|
1445 2888 65 30 ADC CheckSum
|
|
1446 288A 69 00 ADC #0
|
|
1447 288C 85 30 STA CheckSum
|
|
1448 288E 60 RTS
|
|
1449
|
|
1450 288F GetSIOByte
|
|
1451 288F A2 0A LDX #10 ;acktimeout
|
|
1452 2891 ExternalLoop
|
|
1453 2891 A9 00 LDA #0
|
|
1454 2893 85 36 STA looperka
|
|
1455 2895 InternalLoop
|
|
1456 2895 AD 0E D2 LDA IRQST
|
|
1457 2898 29 20 AND #$20
|
|
1458 289A F0 09 BEQ ACKReceive
|
|
1459 289C C6 36 DEC looperka
|
|
1460 289E D0 F5 BNE InternalLoop
|
|
1461 28A0 CA DEX
|
|
1462 28A1 D0 EE BNE ExternalLoop
|
|
1463 28A3 F0 9F BEQ ErrorHere
|
|
1464 28A5 ACKReceive
|
|
1465 ; zero we have now
|
|
1466 28A5 8D 0E D2 STA IRQST
|
|
1467 28A8 A9 20 LDA #$20
|
|
1468 28AA 8D 0E D2 STA IRQST
|
|
1469 28AD AD 0F D2 LDA SKSTAT
|
|
1470 28B0 8D 0A D2 STA SKSTRES
|
|
1471 28B3 29 20 AND #$20
|
|
1472 28B5 F0 8D BEQ ErrorHere
|
|
1473 ;
|
|
1474 28B7 AD 0D D2 LDA SERIN
|
|
1475 28BA 60 RTS
|
|
1476 28BB EndHappyUSProc
|
|
1477
|
|
1478
|
|
1479 ; Rozkaz DCB "?" pobierrajacy predkosc dla Happy i US-Doubler
|
|
1480 28BB blokDanychIO_GetUSSpeed
|
|
1481 28BB 31 01 3F 40 .BY $31,$01,"?",$40
|
|
1482 28BF D4 27 .WO HappySpeed
|
|
1483 28C1 07 00 01 00 00 0A .BY $07,$00,$01,$00,$00,$0A
|
|
1484 28C7 DirMapEnd
|
|
1485 28C7 4C 93 29 JMP label75
|
|
1486 28CA label39
|
|
1487 28CA 85 DA STA $DA
|
|
1488 28CC A5 D0 LDA CurrentFileInfoBuff
|
|
1489 28CE 85 DB STA $DB
|
|
1490 28D0 A5 D1 LDA CurrentFileInfoBuff+1
|
|
1491 28D2 85 DC STA $DC
|
|
1492 28D4 20 47 2B JSR DiscChangeCheck ; Sprawdzenie czy w miedzyczasie nie zostala zmieniona dyskietka
|
|
1493 28D7 F0 05 BEQ DiscNotChanged2
|
|
1494 28D9 68 PLA
|
|
1495 28DA 68 PLA
|
|
1496 28DB 4C D4 21 JMP ReadMainDir
|
|
1497 28DE DiscNotChanged2
|
|
1498 ; odczyt sektora mapy wskazywanego przez DirMapSec
|
|
1499 28DE A5 D2 LDA DirMapSect
|
|
1500 28E0 8D 43 2A STA blokDanychIO+10
|
|
1501 28E3 A5 D3 LDA DirMapSect+1
|
|
1502 28E5 8D 44 2A STA blokDanychIO+11
|
|
1503 28E8 0D 43 2A ORA blokDanychIO+10
|
|
1504 28EB F0 DA BEQ DirMapEnd
|
|
1505 28ED A2 2D LDX #>DirMapSectorBuff
|
|
1506 28EF A0 80 LDY #<DirMapSectorBuff
|
|
1507 28F1 20 0B 2A JSR ReadSector
|
|
1508 ; zostal wczytany kolejny sektor mapy nalezy wiec zapamietac we wskazniku DirMapSec
|
|
1509 ; numer nastepnego sektora mapy. To 2 pierwsze bajty z bufora na sektor mapy
|
|
1510 28F4 AD 80 2D LDA DirMapSectorBuff
|
|
1511 28F7 85 D2 STA DirMapSect
|
|
1512 28F9 AD 81 2D LDA DirMapSectorBuff+1
|
|
1513 28FC 85 D3 STA DirMapSect+1
|
|
1514 28FE A9 04 LDA #$04
|
|
1515 2900 85 E2 STA InMapPointer ; --
|
|
1516 2902 A9 00 LDA #$00 ; --
|
|
1517 2904 85 E3 STA InMapPointer+1 ; --
|
|
1518 2906 label80
|
|
1519 2906 A4 E2 LDY InMapPointer ; --
|
|
1520 2908 CC A2 20 CPY .adr loader.SecLen ; przed przepisaniem
|
|
1521 290B D0 07 BNE NoNextMapSector ; --
|
|
1522 290D A5 E3 LDA InMapPointer+1 ; --
|
|
1523 290F CD A3 20 CMP .adr loader.Seclen+1 ; --
|
|
1524 2912 F0 CA BEQ DiscNotChanged2
|
|
1525 2914 NoNextMapSector
|
|
1526 ; pobranie numeru nastepnego sektora katalogu z mapy sektorow
|
|
1527 ; tymczasowy adrez na ZP
|
|
1528 2914 A9 80 LDA #<DirMapSectorBuff ; --
|
|
1529 2916 85 E4 STA TempZP ; --
|
|
1530 2918 18 CLC ; --
|
|
1531 2919 A9 2D LDA #>DirMapSectorBuff ; --
|
|
1532 291B 65 E3 ADC InMapPointer+1 ; --
|
|
1533 291D 85 E5 STA TempZP+1 ; --
|
|
1534 291F B1 E4 LDA (TempZP),Y
|
|
1535 2921 8D 43 2A STA blokDanychIO+10
|
|
1536 2924 C8 INY
|
|
1537 2925 B1 E4 LDA (TempZP),Y
|
|
1538 2927 8D 44 2A STA blokDanychIO+11
|
|
1539 292A 0D 43 2A ORA blokDanychIO+10
|
|
1540 292D F0 64 BEQ label75
|
|
1541 ; i zwiekszenie wskaznika mapy o 2
|
|
1542 292F C8 INY
|
|
1543 2930 84 E2 STY InMapPointer
|
|
1544 2932 D0 02 BNE NoIncH ; --
|
|
1545 2934 E6 E3 INC InMapPointer+1 ; --
|
|
1546 2936 NoIncH
|
|
1547 2936 AD E5 02 LDA MEMTOP
|
|
1548 2939 38 SEC
|
|
1549 293A E5 D0 SBC CurrentFileInfoBuff
|
|
1550 293C AD E6 02 LDA MEMTOP+1
|
|
1551 293F E5 D1 SBC CurrentFileInfoBuff+1
|
|
1552 2941 F0 50 BEQ label75
|
|
1553 2943 A4 D0 LDY CurrentFileInfoBuff
|
|
1554 2945 A6 D1 LDX CurrentFileInfoBuff+1
|
|
1555 2947 20 0B 2A JSR ReadSector
|
|
1556 294A A5 D4 LDA $D4
|
|
1557 294C 05 D5 ORA $D5
|
|
1558 294E D0 16 BNE label79
|
|
1559 2950 A0 03 LDY #$03
|
|
1560 2952 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
1561 2954 85 D4 STA $D4
|
|
1562 2956 C8 INY
|
|
1563 2957 B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
1564 2959 85 D5 STA $D5
|
|
1565 295B C8 INY
|
|
1566 295C B1 D0 LDA (CurrentFileInfoBuff),Y
|
|
1567 295E F0 06 BEQ label79
|
|
1568 2960 A9 FF LDA #$FF
|
|
1569 2962 85 D4 STA $D4
|
|
1570 2964 85 D5 STA $D5
|
|
1571 2966 label79
|
|
1572 2966 A5 D0 LDA CurrentFileInfoBuff
|
|
1573 2968 18 CLC
|
|
1574 2969 6D A2 20 ADC .adr loader.SecLen ; przed przepisaniem
|
|
1575 296C 85 D0 STA CurrentFileInfoBuff
|
|
1576 296E A5 D1 LDA CurrentFileInfoBuff+1
|
|
1577 2970 6D A3 20 ADC .adr loader.SecLen+1 ; przed przepisaniem
|
|
1578 2973 85 D1 STA CurrentFileInfoBuff+1
|
|
1579 2975 A5 D4 LDA $D4
|
|
1580 2977 38 SEC
|
|
1581 2978 ED A2 20 SBC .adr loader.SecLen ; przed przepisaniem
|
|
1582 297B 85 D4 STA $D4
|
|
1583 297D A5 D5 LDA $D5
|
|
1584 297F ED A3 20 SBC .adr loader.SecLen+1 ; przed przepisaniem
|
|
1585 2982 85 D5 STA $D5
|
|
1586 2984 B0 80 BCS label80
|
|
1587 2986 A5 D0 LDA CurrentFileInfoBuff
|
|
1588 2988 18 CLC
|
|
1589 2989 65 D4 ADC $D4
|
|
1590 298B 85 D0 STA CurrentFileInfoBuff
|
|
1591 298D A5 D1 LDA CurrentFileInfoBuff+1
|
|
1592 298F 65 D5 ADC $D5
|
|
1593 2991 85 D1 STA CurrentFileInfoBuff+1
|
|
1594 2993 label75
|
|
1595 2993 A5 DC LDA $DC
|
|
1596 2995 C5 D1 CMP CurrentFileInfoBuff+1
|
|
1597 2997 90 0B BCC label81
|
|
1598 2999 D0 17 BNE label82
|
|
1599 299B A5 DB LDA $DB
|
|
1600 299D C5 D0 CMP CurrentFileInfoBuff
|
|
1601 299F 90 03 BCC label81
|
|
1602 29A1 D0 0F BNE label82
|
|
1603 29A3 60 RTS
|
|
1604 29A4 label81
|
|
1605 29A4 A5 DB LDA $DB
|
|
1606 29A6 18 CLC
|
|
1607 29A7 65 DA ADC $DA
|
|
1608 29A9 85 DB STA $DB
|
|
1609 29AB 90 E6 BCC label75
|
|
1610 29AD E6 DC INC $DC
|
|
1611 29AF 4C 93 29 JMP label75
|
|
1612 29B2 label82
|
|
1613 29B2 A5 DB LDA $DB
|
|
1614 29B4 38 SEC
|
|
1615 29B5 E5 DA SBC $DA
|
|
1616 29B7 85 D0 STA CurrentFileInfoBuff
|
|
1617 29B9 A5 DC LDA $DC
|
|
1618 29BB E9 00 SBC #$00
|
|
1619 29BD 85 D1 STA CurrentFileInfoBuff+1
|
|
1620 29BF 60 RTS
|
|
1621 ; odczyt bloku PERCOM i ustalenie rozmiaru pierwszego sektora
|
|
1622 29C0 ReadPERCOM
|
|
1623 29C0 A9 04 LDA #$04
|
|
1624 29C2 8D 45 2A STA DiskRetryCount
|
|
1625 29C5 ReadPERCOMretry
|
|
1626 29C5 A0 E9 LDY #<blokDanychIO_PERCOM
|
|
1627 29C7 A2 29 LDX #>blokDanychIO_PERCOM
|
|
1628 29C9 20 E1 2A JSR Table2DCB
|
|
1629 29CC 20 D6 2A JSR GoSIO
|
|
1630 29CF 30 08 BMI PercomError
|
|
1631 ; blok odczytany - ustawmy dlugosc 1 sektora
|
|
1632 29D1 AD 2A 2C LDA PERCOMdata+6
|
|
1633 29D4 C9 01 CMP #$01 ; jesli dlugosc sektora to 256b - pierwszy sektor ustawiamy na 128
|
|
1634 29D6 F0 06 BEQ Set1Sect128 ; w pozostalych wypadkach zostawiamy jak jest
|
|
1635 29D8 60 RTS
|
|
1636 29D9 PercomError
|
|
1637 29D9 CE 45 2A DEC DiskRetryCount
|
|
1638 29DC D0 E7 BNE ReadPERCOMretry
|
|
1639 ; blok nieodczytany - dlugosc 1 sektora na $80
|
|
1640 29DE Set1Sect128
|
|
1641 29DE A9 00 LDA #$00
|
|
1642 29E0 8D 2A 2C STA PERCOMdata+6
|
|
1643 29E3 A9 80 LDA #$80
|
|
1644 29E5 8D 2B 2C STA PERCOMdata+7
|
|
1645 29E8 60 RTS
|
|
1646 29E9 blokDanychIO_PERCOM
|
|
1647 29E9 31 01 4E 40 .BY $31,$01,$4E,$40
|
|
1648 29ED 24 2C .WO PERCOMdata
|
|
1649 29EF 0A 00 0C 00 01 00 .BY $0A,$00,12,$00,$01,$00
|
|
1650 ; wczytuje pierwszy sektor dysku pod adres zawarty w X(starszy) i Y(mlodszy)
|
|
1651 29F5 ReadFirstSect
|
|
1652 29F5 A9 01 LDA #$01
|
|
1653 29F7 8D 43 2A STA blokDanychIO+10
|
|
1654 29FA A9 00 LDA #$00
|
|
1655 29FC 8D 44 2A STA blokDanychIO+11
|
|
1656 29FF AD 2A 2C LDA PERCOMdata+6
|
|
1657 2A02 8D 42 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b
|
|
1658 2A05 AD 2B 2C LDA PERCOMdata+7
|
|
1659 2A08 4C 14 2A JMP ReadSector1
|
|
1660 ; Wczytuje sektror ustalajac jego dlugosc na podstawie blokDanychIO_Loader (SecLen)
|
|
1661 ; reszta danych jak nizej (A nie wazne)
|
|
1662 2A0B ReadSector
|
|
1663 2A0B AD A3 20 LDA .adr loader.SecLen+1 ; --- obsluga sektorow ponad 256b
|
|
1664 2A0E 8D 42 2A STA blokDanychIO+9 ; --- obsluga sektorow ponad 256b
|
|
1665 2A11 AD A2 20 LDA .adr loader.SecLen ; przed przepisaniem
|
|
1666 2A14 ReadSector1
|
|
1667 2A14 8D 41 2A STA blokDanychIO+8
|
|
1668 2A17 8E 3E 2A STX blokDanychIO+5
|
|
1669 2A1A 8C 3D 2A STY blokDanychIO+4
|
|
1670 2A1D A9 04 LDA #$04
|
|
1671 2A1F 8D 45 2A STA DiskRetryCount
|
|
1672 2A22 DiskReadRetry
|
|
1673 2A22 A0 39 LDY #<blokDanychIO
|
|
1674 2A24 A2 2A LDX #>blokDanychIO
|
|
1675 2A26 20 E1 2A JSR Table2DCB
|
|
1676 2A29 20 D6 2A JSR GoSIO
|
|
1677 2A2C 30 01 BMI label85
|
|
1678 2A2E 60 RTS
|
|
1679 2A2F label85
|
|
1680 2A2F CE 45 2A DEC DiskRetryCount
|
|
1681 2A32 D0 EE BNE DiskReadRetry
|
|
1682 2A34 68 PLA
|
|
1683 2A35 68 PLA
|
|
1684 2A36 4C 93 21 JMP ErrorDisplay
|
|
1685 2A39 blokDanychIO
|
|
1686 2A39 31 01 52 40 .BY $31,$01,$52,$40
|
|
1687 2A3D 80 2D .WO DirMapSectorBuff
|
|
1688 2A3F 0A 00 80 00 01 00 .BY $0A,$00,$80,$00,$01,$00
|
|
1689 2A45 DiskRetryCount
|
|
1690 2A45 00 .BY $00
|
|
1691 2A46 PrintXY
|
|
1692 2A46 68 PLA
|
|
1693 2A47 85 C8 STA $C8
|
|
1694 2A49 68 PLA
|
|
1695 2A4A 85 C9 STA $C9
|
|
1696 2A4C A9 00 LDA #$00
|
|
1697 2A4E 85 DF STA $DF
|
|
1698 2A50 20 C8 2A JSR label87
|
|
1699 2A53 48 PHA
|
|
1700 2A54 20 C8 2A JSR label87
|
|
1701 2A57 85 DE STA $DE
|
|
1702 2A59 0A ASL
|
|
1703 2A5A 0A ASL
|
|
1704 2A5B 18 CLC
|
|
1705 2A5C 65 DE ADC $DE
|
|
1706 2A5E 0A ASL
|
|
1707 2A5F 0A ASL
|
|
1708 2A60 26 DF ROL $DF
|
|
1709 2A62 0A ASL
|
|
1710 2A63 26 DF ROL $DF
|
|
1711 2A65 18 CLC
|
|
1712 2A66 65 58 ADC SAVMSC
|
|
1713 2A68 85 DE STA $DE
|
|
1714 2A6A A5 DF LDA $DF
|
|
1715 2A6C 65 59 ADC SAVMSC+1
|
|
1716 2A6E 85 DF STA $DF
|
|
1717 2A70 68 PLA
|
|
1718 2A71 A8 TAY
|
|
1719 2A72 label92
|
|
1720 2A72 20 C8 2A JSR label87
|
|
1721 2A75 C9 00 CMP #$00
|
|
1722 2A77 F0 48 BEQ label88
|
|
1723 2A79 C9 7D CMP #$7D
|
|
1724 2A7B F0 21 BEQ label89
|
|
1725 2A7D A2 00 LDX #$00
|
|
1726 2A7F 86 E0 STX $E0
|
|
1727 2A81 C9 80 CMP #$80
|
|
1728 2A83 66 E0 ROR $E0
|
|
1729 2A85 29 7F AND #$7F
|
|
1730 2A87 C9 20 CMP #$20
|
|
1731 2A89 B0 04 BCS label90
|
|
1732 2A8B 09 40 ORA #$40
|
|
1733 2A8D D0 07 BNE label91
|
|
1734 2A8F label90
|
|
1735 2A8F C9 60 CMP #$60
|
|
1736 2A91 B0 03 BCS label91
|
|
1737 2A93 38 SEC
|
|
1738 2A94 E9 20 SBC #$20
|
|
1739 2A96 label91
|
|
1740 2A96 05 E0 ORA $E0
|
|
1741 2A98 91 DE STA ($DE),Y
|
|
1742 2A9A C8 INY
|
|
1743 2A9B 4C 72 2A JMP label92
|
|
1744 2A9E label89
|
|
1745 2A9E 98 TYA
|
|
1746 2A9F 48 PHA
|
|
1747 2AA0 A5 58 LDA SAVMSC
|
|
1748 2AA2 85 E0 STA $E0
|
|
1749 2AA4 A9 03 LDA #$03
|
|
1750 2AA6 AA TAX
|
|
1751 2AA7 18 CLC
|
|
1752 2AA8 65 59 ADC SAVMSC+1
|
|
1753 2AAA 85 E1 STA $E1
|
|
1754 2AAC A0 BF LDY #$BF
|
|
1755 2AAE A9 00 LDA #$00
|
|
1756 2AB0 label93
|
|
1757 2AB0 91 E0 STA ($E0),Y
|
|
1758 2AB2 88 DEY
|
|
1759 2AB3 C0 FF CPY #$FF
|
|
1760 2AB5 D0 F9 BNE label93
|
|
1761 2AB7 C6 E1 DEC $E1
|
|
1762 2AB9 CA DEX
|
|
1763 2ABA 10 F4 BPL label93
|
|
1764 2ABC 68 PLA
|
|
1765 2ABD A8 TAY
|
|
1766 2ABE 4C 72 2A JMP label92
|
|
1767 2AC1 label88
|
|
1768 2AC1 A5 C9 LDA $C9
|
|
1769 2AC3 48 PHA
|
|
1770 2AC4 A5 C8 LDA $C8
|
|
1771 2AC6 48 PHA
|
|
1772 2AC7 60 RTS
|
|
1773 2AC8 label87
|
|
1774 2AC8 E6 C8 INC $C8
|
|
1775 2ACA D0 02 BNE label94
|
|
1776 2ACC E6 C9 INC $C9
|
|
1777 2ACE label94
|
|
1778 2ACE A2 00 LDX #$00
|
|
1779 2AD0 A1 C8 LDA ($C8,X)
|
|
1780 2AD2 60 RTS
|
|
1781 2AD3 GoErrorDisp
|
|
1782 2AD3 4C 93 21 JMP ErrorDisplay
|
|
1783 ; Skok do Sio lub procedury Turbo
|
|
1784 2AD6 GoSIO
|
|
1785 2AD6 AC 22 21 LDY USmode
|
|
1786 2AD9 F0 03 BEQ StandardSpeed
|
|
1787 2ADB 4C BC 27 JMP HappyUSMovedProc ; mozna skakac do tej procki
|
|
1788 2ADE StandardSpeed
|
|
1789 2ADE 4C 59 E4 JMP JSIOINT
|
|
1790 ; Przepisuje 12 bajtow z adresy podanego w X(starszy) i Y(mlodszy)
|
|
1791 ; do bloku kontroli transmisji szeregowej DCB
|
|
1792 2AE1 Table2DCB
|
|
1793 2AE1 8C EA 2A STY IOtableAddr+1
|
|
1794 2AE4 8E EB 2A STX IOtableAddr+2
|
|
1795 2AE7 A2 0B LDX #$0B
|
|
1796 2AE9 IOtableAddr
|
|
1797 2AE9 BD FF FF LDA $FFFF,X
|
|
1798 2AEC 9D 00 03 STA DDEVIC,X
|
|
1799 2AEF CA DEX
|
|
1800 2AF0 10 F7 BPL IOtableAddr
|
|
1801 2AF2 60 RTS
|
|
1802 2AF3 Close1
|
|
1803 2AF3 A2 10 LDX #$10
|
|
1804 2AF5 CloseX
|
|
1805 2AF5 A9 0C LDA #$0C
|
|
1806 2AF7 9D 42 03 STA ICCMD,X
|
|
1807 2AFA 4C 56 E4 JMP JCIOMAIN
|
|
1808 2AFD GetKey
|
|
1809 2AFD A2 10 LDX #$10
|
|
1810 2AFF A9 03 LDA #$03
|
|
1811 2B01 9D 42 03 STA ICCMD,X
|
|
1812 2B04 A9 04 LDA #$04
|
|
1813 2B06 9D 4A 03 STA ICAX1,X
|
|
1814 2B09 A9 00 LDA #$00
|
|
1815 2B0B 9D 4B 03 STA ICAX2,X
|
|
1816 2B0E 9D 49 03 STA ICBUFL+1,X
|
|
1817 2B11 A9 FF LDA #$FF
|
|
1818 2B13 9D 48 03 STA ICBUFL,X
|
|
1819 2B16 A9 44 LDA #<Kdriver
|
|
1820 2B18 9D 44 03 STA ICBUFA,X
|
|
1821 2B1B A9 2B LDA #>Kdriver
|
|
1822 2B1D 9D 45 03 STA ICBUFA+1,X
|
|
1823 2B20 20 56 E4 JSR JCIOMAIN
|
|
1824 2B23 30 1C BMI GKeyError
|
|
1825 2B25 A2 10 LDX #$10
|
|
1826 2B27 A9 00 LDA #$00
|
|
1827 2B29 9D 48 03 STA ICBUFL,X
|
|
1828 2B2C 9D 49 03 STA ICBUFL+1,X
|
|
1829 2B2F A9 07 LDA #$07
|
|
1830 2B31 9D 42 03 STA ICCMD,X
|
|
1831 2B34 20 56 E4 JSR JCIOMAIN
|
|
1832 2B37 30 08 BMI GKeyError
|
|
1833 2B39 48 PHA
|
|
1834 2B3A 20 F3 2A JSR Close1
|
|
1835 2B3D 30 02 BMI GKeyError
|
|
1836 2B3F 68 PLA
|
|
1837 2B40 60 RTS
|
|
1838 2B41 GKeyError
|
|
1839 2B41 4C D3 2A JMP GoErrorDisp
|
|
1840 2B44 Kdriver
|
|
1841 2B44 4B 3A 9B .BY "K:",$9B
|
|
1842 2B47 DiscChangeCheck
|
|
1843 2B47 A0 80 LDY #<DirMapSectorBuff
|
|
1844 2B49 A2 2D LDX #>DirMapSectorBuff
|
|
1845 2B4B 20 F5 29 JSR ReadFirstSect
|
|
1846 2B4E A2 7F LDX #$7F
|
|
1847 2B50 label98
|
|
1848 2B50 BD 00 2D LDA FirstSectorBuff,X
|
|
1849 2B53 DD 80 2D CMP DirMapSectorBuff,X
|
|
1850 2B56 D0 05 BNE ChangedD
|
|
1851 2B58 CA DEX
|
|
1852 2B59 10 F5 BPL label98
|
|
1853 2B5B A9 00 LDA #$00
|
|
1854 2B5D ChangedD
|
|
1855 2B5D 60 RTS
|
|
1856 ; obsluga gwiazdki
|
|
1857 ; w komorkach $D4 $D5 jest adres linii z pliku MSDOS.DAT zaczynajacej sie od *
|
|
1858 ; w Y jest ) - X moze lepiej nie ruszac :)
|
|
1859 2B5E Asteriks
|
|
1860 2B5E A0 0B LDY #11 ; pierwszy HEX za nazwa pliku (czyli pierwsze znaki dlugiej nazwy)
|
|
1861 2B60 20 7C 2B JSR GetHexNumber
|
|
1862 2B63 8D C5 02 STA COLPF1S ; literki
|
|
1863 2B66 C8 INY
|
|
1864 2B67 20 7C 2B JSR GetHexNumber
|
|
1865 2B6A 8D C6 02 STA COLPF2S ; tlo
|
|
1866 2B6D C8 INY
|
|
1867 2B6E 20 7C 2B JSR GetHexNumber
|
|
1868 2B71 8D C8 02 STA COLBAKS ; ramka
|
|
1869 2B74 C8 INY
|
|
1870 2B75 20 7C 2B JSR GetHexNumber
|
|
1871 2B78 8D 26 21 STA FolderTurbo ; znacznik turbo (00 bez turbo , 01 tak jak bylo)
|
|
1872 2B7B 60 RTS
|
|
1873 ; pobiera z pod adresu wskazanago przez ($D4),Y dwa kolejne znaki liczby HEX
|
|
1874 ; i zamienia na bajt w A
|
|
1875 2B7C GetHexNumber
|
|
1876 2B7C 20 8C 2B JSR GetHEX4bits
|
|
1877 2B7F 0A ASL
|
|
1878 2B80 0A ASL
|
|
1879 2B81 0A ASL
|
|
1880 2B82 0A ASL
|
|
1881 2B83 85 E4 STA TempZP ; zmienna potrzebna tylko przy jakims chwilowym obliczeniu, wiec tu sie przyda.
|
|
1882 2B85 C8 INY
|
|
1883 2B86 20 8C 2B JSR GetHEX4bits
|
|
1884 2B89 05 E4 ORA TempZP
|
|
1885 2B8B 60 RTS
|
|
1886 2B8C GetHEX4bits
|
|
1887 2B8C B1 D4 LDA ($D4),Y
|
|
1888 2B8E 38 SEC
|
|
1889 2B8F E9 30 SBC #'0'
|
|
1890 2B91 C9 0A CMP #$0A ; sprawdzmy czy cyfra
|
|
1891 2B93 90 02 BCC IsNumber
|
|
1892 2B95 E9 07 SBC #7 ; Carry jest ustawiony, a miedzy 9 i A jest jeszcze 7 znakow
|
|
1893 2B97 IsNumber
|
|
1894 2B97 60 RTS
|
|
1895 ; Ustawia numer satcji wg A
|
|
1896 2B98 SeTDriveNR
|
|
1897 2B98 C9 09 CMP #$09
|
|
1898 2B9A B0 0F BCS SetDriveLetter ; jesli wieksze lub rowne od 9 to litera zamiast cyfry
|
|
1899 2B9C 20 BA 2B JSR SeTblokDanychDrive
|
|
1900 2B9F 18 CLC
|
|
1901 2BA0 69 B0 ADC #'0'+$80 ; dodajemy do kodu cyfry 0
|
|
1902 2BA2 8D D5 22 STA DriveDisp1
|
|
1903 2BA5 A9 C4 LDA #'D'+$80 ; literka D przed numerem napedu
|
|
1904 2BA7 8D D4 22 STA DriveDisp1-1
|
|
1905 2BAA 60 RTS
|
|
1906 2BAB SeTDriveLetter
|
|
1907 2BAB 20 BA 2B JSR SeTblokDanychDrive
|
|
1908 2BAE 18 CLC
|
|
1909 2BAF 69 C0 ADC #'A'+$7F ; $7f bo to $80 - 1 , a kod litery A trzeba zmniejszyc o 1 i dodac numer napedu
|
|
1910 2BB1 8D D5 22 STA DriveDisp1
|
|
1911 2BB4 A9 A0 LDA #' '+$80 ; literka D przed numerem napedu - tutaj spacja
|
|
1912 2BB6 8D D4 22 STA DriveDisp1-1
|
|
1913 2BB9 60 RTS
|
|
1914 2BBA SeTblokDanychDrive
|
|
1915 2BBA 8D 9B 20 STA .adr loader.blokDanychIO_Loader+1 ; przed przepisaniem
|
|
1916 2BBD 8D 3A 2A STA blokDanychIO+1
|
|
1917 2BC0 8D BC 28 STA blokDanychIO_GetUSSpeed+1
|
|
1918 2BC3 8D EA 29 STA blokDanychIO_PERCOM+1
|
|
1919 2BC6 60 RTS
|
|
1920 ; wyswietlenie na czystm ekranie info zaraz przed rozpoczeciem ladowania pliku
|
|
1921 2BC7 MEMLOprint
|
|
1922 2BC7 AD E7 02 LDA MEMLO
|
|
1923 2BCA 48 PHA
|
|
1924 2BCB 4A LSR
|
|
1925 2BCC 4A LSR
|
|
1926 2BCD 4A LSR
|
|
1927 2BCE 4A LSR
|
|
1928 2BCF 20 28 21 JSR bin2AsciiHex
|
|
1929 2BD2 8D 00 2C STA MEMLOvalue+2
|
|
1930 2BD5 68 PLA
|
|
1931 2BD6 20 28 21 JSR bin2AsciiHex
|
|
1932 2BD9 8D 01 2C STA MEMLOvalue+3
|
|
1933 2BDC AD E8 02 LDA MEMLO+1
|
|
1934 2BDF 48 PHA
|
|
1935 2BE0 4A LSR
|
|
1936 2BE1 4A LSR
|
|
1937 2BE2 4A LSR
|
|
1938 2BE3 4A LSR
|
|
1939 2BE4 20 28 21 JSR bin2AsciiHex
|
|
1940 2BE7 8D FE 2B STA MEMLOvalue
|
|
1941 2BEA 68 PLA
|
|
1942 2BEB 20 28 21 JSR bin2AsciiHex
|
|
1943 2BEE 8D FF 2B STA MEMLOvalue+1
|
|
1944 2BF1 20 46 2A JSR PrintXY
|
|
1945 2BF4 1C 17 .BY 28,23
|
|
1946 2BF6 4D 45 4D 4C 4F 3A + .BY "MEMLO: $"
|
|
1947 2BFE MEMLOvalue
|
|
1948 2BFE 30 30 30 30 .BY "0000"
|
|
1949 2C02 00 .BY $00
|
|
1950 2C03 60 RTS
|
|
1951
|
|
1952 ; Tablica adresow wszystkich rozkazow skokow w procedurze Turbo
|
|
1953
|
|
1954 2C04 xjsrTableL
|
|
1955 2C04 EA FE 04 .BY <[xjsr1+1],<[xjsr2+1],<[xjsr3+1]
|
|
1956 2C07 0A 0F .BY <[xjsr4+1],<[xjsr5+1]
|
|
1957 2C09 1B 25 31 .BY <[xjsr6+1],<[xjsr7+1],<[xjsr8+1]
|
|
1958 2C0C 36 3E .BY <[xjsr9+1],<[xjsrA+1]
|
|
1959 2C0E xjsrTableH
|
|
1960 2C0E 27 27 28 .BY >[xjsr1+1],>[xjsr2+1],>[xjsr3+1]
|
|
1961 2C11 28 28 .BY >[xjsr4+1],>[xjsr5+1]
|
|
1962 2C13 28 28 28 .BY >[xjsr6+1],>[xjsr7+1],>[xjsr8+1]
|
|
1963 2C16 28 28 .BY >[xjsr9+1],>[xjsrA+1]
|
|
1964 ; miejsce na wyliczony offset o jaki przesuwamy procedure
|
|
1965 2C18 HappyOffset
|
|
1966 2C18 00 00 .WO $0000
|
|
1967 ; kody gestosci do wyswietlenia na ekranie - takie poziome kreski od chudej do grubej :)
|
|
1968 2C1A DensityCodes
|
|
1969 2C1A F3 E4 F1 .by +$80,"sdq"
|
|
1970 ;.by "SDQ"
|
|
1971 ;.by $0e,$15,$a0
|
|
1972 2C1D ONtext
|
|
1973 2C1D CF CE A0 .BY +$80,"ON "
|
|
1974 2C20 OFFtext
|
|
1975 2C20 CF C6 C6 .BY +$80,"OFF"
|
|
1976 ; miejsce na przechowanie stanu urzadzen PBI (przez reset)
|
|
1977 2C23 PDVMASKtemp
|
|
1978 2C23 00 .BY $00
|
|
1979 ; miejsce na blok PERCOM
|
|
1980 2C24 PERCOMdata
|
|
1981 ; miejsce na tablice trzymajaca numery pierwszych sektorow map bitoeych plikow aktualnie wyswietlanych na liscie
|
|
1982 = 2C30 FirstSectorsTable=*+12 ; omijamy 12b na percom
|
|
1983 ; zostawiamy $30 bajtow wolnego
|
|
1984
|
|
1985 = 2D00 FirstSectorBuff=[[>[*+$2f+12]]+1]*$100 ; ($80 bajtow) ustawienie na granicy strony ale po ominieciu $30 i 12 bajtow
|
|
1986 = 2D00 ProgramEnd=FirstSectorBuff
|
|
1987 = 2D80 DirMapSectorBuff=FirstSectorBuff+$80 ; tutaj aktualny sektor mapy sektorow katalogu
|
|
1988 = 2F80 DirSectorBuff=FirstSectorBuff+$280 ; tutaj sektor katalogu
|
|
1989 2C24 FirstRun
|
|
1990 ; odnotowujemy stan Shift z Bootowania
|
|
1991 2C24 AD 0F D2 LDA SKSTAT
|
|
1992 2C27 29 08 and #$08
|
|
1993 2C29 D0 03 BNE NoSHIFTboot
|
|
1994 2C2B 8D 25 21 STA BootShift ; w A jest 0 wiec nie trzeba LDA #0
|
|
1995 2C2E NoSHIFTboot
|
|
1996 ; Sprawdzamy czy jest basic i ustawiamy status na ekranie
|
|
1997 2C2E AD 01 D3 LDA PORTB
|
|
1998 2C31 29 02 AND #$02
|
|
1999 2C33 D0 0B BNE BrakBasica
|
|
2000 ; jest Basic
|
|
2001 2C35 A0 02 LDY #$2
|
|
2002 2C37 BASstatprint
|
|
2003 2C37 B9 1D 2C LDA ONtext,y
|
|
2004 2C3A 99 F0 22 STA BASstatus,y
|
|
2005 2C3D 88 DEY
|
|
2006 2C3E 10 F7 bpl BASstatprint
|
|
2007 2C40 BrakBasica
|
|
2008 ; Sprawdzamy istnienie QMEGa
|
|
2009 2C40 A0 06 ldy #$06 ; bo 6 znaków w ROMie testujemy
|
|
2010 2C42 testQMEGloop
|
|
2011 2C42 B9 01 C0 LDA $C001,y
|
|
2012 2C45 D9 75 2C CMP QMEGstring,y
|
|
2013 2C48 D0 13 bne brakQMEGa
|
|
2014 2C4A 88 dey
|
|
2015 2C4B 10 F5 bpl testQMEGloop
|
|
2016 ; jest QMEG
|
|
2017 2C4D A9 00 LDA #0
|
|
2018 2C4F 8D 23 21 STA QMEG
|
|
2019 2C52 A0 02 LDY #$2
|
|
2020 2C54 Qstatprint
|
|
2021 2C54 B9 1D 2C LDA ONtext,y
|
|
2022 2C57 99 E8 22 STA QMEGstatus,y
|
|
2023 2C5A 88 DEY
|
|
2024 2C5B 10 F7 bpl Qstatprint
|
|
2025 2C5D brakQMEGa
|
|
2026 ; kombinacja z dodaniem identyfikatara i odjeciem 1 - bo tak dziwnie OS robi
|
|
2027 2C5D AD 00 03 LDA DDEVIC
|
|
2028 2C60 18 clc
|
|
2029 2C61 6D 01 03 ADC DUNIT
|
|
2030 2C64 38 sec
|
|
2031 2C65 E9 01 SBC #$01
|
|
2032 2C67 29 0F AND #$0F ; zapamietanie numeru urzadzenia
|
|
2033 2C69 8D 24 21 STA BootDrive
|
|
2034 2C6C 20 98 2B JSR SeTDriveNR
|
|
2035 2C6F 20 37 21 JSR EditorOpen
|
|
2036 2C72 4C 65 21 JMP mainprog
|
|
2037 2C75 QMEGstring
|
|
2038 2C75 51 4D 45 47 2D 4F + .BY "QMEG-OS",0
|
|
2039 2C7D 48 53 20 70 72 6F + .BY "HS procedures for Happy/US-Doubler, big sectors loader and compressed file map by Pecus & Pirx 2010-05-26"
|
|
2040 ;.OPT List
|
|
2041
|
|
2042
|
|
2043 = 0080 MAPCOUNTER
|
|
2043 = 0082 COMPRESSEDMAPCOUNTER
|
|
2043 = 0084 MAPCOUNTERMEM
|
|
2043 = 0086 PREVFILESECTOR
|
|
2043 = 0088 MAPPOSITIONMEM
|
|
2043 = 008A SECTOROFFSET
|
|
2043 = 008C SECTORSCOUNTER
|
|
2043 org $02e0
|
|
2044 02E0-02E1> 99 26 .WO LoaderGo
|
|
2045 ; .WO START
|
|
2046 ; na koniec pliku dwa bajty $00 bez naglowka (dla bootloadera)
|
|
2047 ; OPT h-
|
|
2048 ; org $0000
|
|
2049 ; .WO $0000
|
|
2050
|