diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3fe740d --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +/.DS_Store +/.tmp +/.vscode +/Build/ +/Debug/ +/Icon/ +/SP_Core.code-workspace +/RUN/ +/Docs/ diff --git a/Docs/FORMATS/HOBETA.MSG b/Docs/FORMATS/HOBETA.txt similarity index 100% rename from Docs/FORMATS/HOBETA.MSG rename to Docs/FORMATS/HOBETA.txt diff --git a/Docs/FORMATS/fdd.hdr b/Docs/FORMATS/fdd.txt similarity index 100% rename from Docs/FORMATS/fdd.hdr rename to Docs/FORMATS/fdd.txt diff --git a/Docs/FORMATS/fdi.hdr b/Docs/FORMATS/fdi.txt similarity index 100% rename from Docs/FORMATS/fdi.hdr rename to Docs/FORMATS/fdi.txt diff --git a/Docs/FORMATS/info_guide/OLZH.$W! b/Docs/FORMATS/info_guide/OLZH.$W! deleted file mode 100644 index 8944b18..0000000 --- a/Docs/FORMATS/info_guide/OLZH.$W! +++ /dev/null @@ -1 +0,0 @@ - Оптимальный LZH From : hrumer@gorny.ru  >>Игорь Павлов ведёт проект 7-zip, от него в конференции я >>узнал про алгоритм optimal lzh - когда выбирается >>действительно оптимальный способ подбора строк при уже >>существующем дереве кодов длин и расстояний. DB>ХАЧУэтот алгоритм. Держи! Этот алгоритм реально нужен каждому пакеру на спектруме. Я дол- жен был его реализовать для всех хрумов,хрустов и лазеркомпактов три-четыре года назад. Айяйяй в общем. Для "намертво" зашитых кодов, как это сделано в большинстве пакеров на спеке, этот алгоритм принесёт около, боюсь сказать,2-20%.На пакерах типа RIPдо примерно1-10%.Это навскидку. Конечно, памяти много надо на паковку, тормозить будет серьёзно, но есть различные варианты - на куски какой длины разбить файл и прочее.Да хоть на PC можно паковать. --------хрум-------- Игорь Павлов писал в RU.COMPRESS в 1999 году. Алгоритм оптимального Lempel-Ziv-Huffman кодирования ---------------------------------------------------- 1) Поиск совпадений в словарю осуществляется для каждого смещения. При поиске дополнительно собираем информацию об оптимальных (по расстоянию) совпадениях с длинами от2до длины максимального совпадения. Offsets[] = Get_Longest_And_Other_Good_Matches(); // Offsets.Size = length of longest match. // Offsets[i] = back offset in dictionary for match with len=i. BYTE Get_Current_Literal(); // returns current byte 2) Всегда можем посчитать, сколько предположительно бит займёт любой вариант (match/literal) на основе информации о предыдущих huffman блоках: int Get_Match_Huffman_Price(int Length, int Offset); // Length = length of match // Offset = offset of match; // Result = number of bits for coding this match; int Get_Literal_Huffman_Price(BYTE Literal); // Result = number of bits for coding this Literal; 3) Cтроим оптимальную последовательность кодов на много ходов вперёд. Есть большой массив a[]: a[i] = {  int Price;// Цена пути в битах,чтобы добраться до i-го байта.  struct  {  int Prev;// Позиция,откуда мы прыгаем в текущую(=i) позицию  // для Literal: Prev = i - 1  // для Match'а с длиной Length: Prev = i - Length  int Offset;// Смещ. в буфере(словаре)назад в случае Мatch'а  // для записи Мatch'а от Prev до i  } } a) Для всех элементов a[] устанавливаем Price = бесконечность. b) for(int i=0; i < Big_Value; i++) {  // Существуют некоторые условия досрочного вых. из этого цикла  // Получаем массив Offsets[2..Longest_match_length] смещений в  // буфере (словаре) назад, смотри 1).  Offsets[] = Get_Longest_And_Other_Good_Matches();  for(int Len = 1; Len < Offsets[].Length; Len++)  // Len=1 means Literal  {  // Определяем цену в битах рассматриваемого "прыжка" на Len  // символов вперёд  if (Len == 1) // it's a literal  aPrice = Get_Literal_Huffman_Price(Get_Current_Literal());  else  aPrice = Get_Match_Huffman_Price(Len, Offsets[Len]);  // и вычисляем цену нового кандидата в a[i + Len].  aNewPrice = a[i].Price + aPrice;  if (aNewPrice < a[i + Len].Price )  // Если выгодно старый путь (старая цена может быть даже  // равна бесконечности,т.е.вообще ещё нет пути) заменить  // новым, то меняем a[i + Len], чтобы он указывал на i  {  a[i + Len].Price = aNewPrice;  a[i + Len].Prev = i;  a[i + Len].Offset = Offsets[Len];  }  } } c) Двигаясь по a[] от конца, собираем "оптимальные" match/literal последовательности и кодируем их. End. --------хрум-------- >>В общем, мое отношение смотри выше, но вот есть же другая >>интересная вещь - просто поддержать распаковкуLZMAна >>спектруме. Правда, мне кажется, будет неудобно использовать >>распаковщикLZMAдля программ на спектруме. DB>Но можно применить для журналов или больших справочников. DB>Например,Open Lettersна одном диске ;) >>PS. Перечитал твоё письмо и понял, что исходники тебе >>прислали... DB>Там без поллитры не въедешь -1021файл,3.4мегабайта DB>исходников. Мусорка. Ну, поллитра не проблема :). Там и с поллитрой не въедешь. Ты не пробовал изучить просто декодер, тот, который в файле \SRC\7zip\Compress\LZMA_C\lzmadecode.c,там всего23кб :). \ No newline at end of file diff --git a/Docs/FORMATS/info_guide/alasmtxt.txt b/Docs/FORMATS/info_guide/alasmtxt similarity index 100% rename from Docs/FORMATS/info_guide/alasmtxt.txt rename to Docs/FORMATS/info_guide/alasmtxt diff --git a/Docs/FORMATS/info_guide/grfview.txt b/Docs/FORMATS/info_guide/grfview.txt deleted file mode 100644 index d20a43f..0000000 --- a/Docs/FORMATS/info_guide/grfview.txt +++ /dev/null @@ -1,106 +0,0 @@ - -╙ЄшышЄр GRFVIEW яЁхфэрчэрўхэр фы  яЁюёьюЄЁр ьюэюїЁюьэ√ї шыш -ЎтхЄэ√ї (ьєы№ЄшъюыюЁэ√ї) ърЁЄшэюъ т ЇюЁьрЄх CP/M-ЁхфръЄюЁр GRAF -т Ёхцшьх 640x200. ┬ ёрьющ ёЁхфх CP/M фрээ√х ърЁЄшэъш шьх■Є Ёрё- -°шЁхэшх BLK, юфэръю т OS TASiS юэю чрЁхчхЁтшЁютрэю чр фЁрщтхЁрьш -фшёъют√ї єёЄЁющёЄт ш, ўЄюс√ шчсхцрЄ№ яєЄрэшЎ√, чфхё№ шь с√ыю -яЁшётюхэю "ётюсюфэюх" Ёрё°шЁхэшх GRF - яЁюшчтюфэр  юЄ эрчтрэш  -ЁхфръЄюЁр. ╧ю¤Єюьє, яЁш яхЁхэюёх ърЁЄшэюъ шч CP/M т TASiS эх чр- -сєф№Єх ёьхэшЄ№ Ёрё°шЁхэшх! - -╬Єъєфр ьюцэю Ёрчфюс√Є№ GRF/BLK-Їрщы√? - -1) ═рЁшёютрЄ№ ёрьюёЄю Єхы№эю т уЁрЇшўхёъюь ЁхфръЄюЁх GRAF. - -2) ╤ъюэтхЁЄшЁютрЄ№ т CP/M шч шёїюфэ√ї ╠╬═╬╒╨╬╠═█╒(!) PCX-Їрщыют -яЁш яюью∙ш ёяхЎшры№эющ, яЁшырур■∙хщё  ъ ЁхфръЄюЁє єЄшышЄ√ -PCXBLK.COM. ╤рью-ёюсющ, Єръшь ёяюёюсюь ьюцэю яюыєўшЄ№ Єюы№ъю ью- -эюїЁюьэ√х ърЁЄшэъш. ═ю шї ьюцэю тЁєўэє■ ЁрёъЁрёшЄ№ тёх т Єюь цх -ЁхфръЄюЁх. - -3) ╤ъюэтхЁЄшЁютрЄ№ т RetroX (ЁхфръЄюЁ -> Import Picture -> Settings -> -ZX Clones Special -> TurboATM Multicolor Polychrome)... р яюёъюы№ъє ёюїЁрэ Є№ -юэ эх єьххЄ, Єю ёфхырЄ№ ёъЁшэ°юЄ, юсЁхчрЄ№ ърЁЄшэъє (°шЁшэр фюыцэр фхышЄ№ё  -эр 8, р т√ёюЄр эр 2), ёюїЁрэшЄ№ т ЇюЄю°юях т ЇюЁьрЄх bmp 8bpp (0-щ ЎтхЄ -цхырЄхы№эю яЁшэєфшЄхы№эю чрфрЄ№ ў╕Ёэ√ь), яюЄюь ёъюэтхЁЄшЁютрЄ№ єЄшышЄющ -RetroX to GRF. - - ╘╬╨╠└╥ BLK(GRF)-╘└╔╦└ - ===================== - - ╤ьх∙хэшх ╩юы-тю ╟эрўхэшх - ============ ======== ============ - #0000 #30(16x3) ╧рышЄЁр. ╧ЁхфёЄрты хЄ ёюсющ 16 ЄЁюхъ - чэрўхэшщ GRB-ЎтхЄют (шьхээю т Єръюь - яюЁ фъх), яЁхфёЄртыхээ√ї т тшфх ёшь- - тюыют ASCII: - - "0"(#30) - ЎтхЄ (G,R шыш B) т√ъы■ўхэ - "1"(#31) - ЎтхЄ эшчъющ шэЄхэёштэюёЄш - "2"(#32) - ЎтхЄ т Ёхцшьх BRIGHT 0 - "3"(#33) - ЎтхЄ т Ёхцшьх BRIGHT 1 - ╦■сюх фЁєуюх чэрўхэшх яЁшЁртэштрхЄё  - єЄшышЄющ GRFVIEW ъ "3". - - #0030(*) #03 ╠хЄър "GRF" - ючэрўрхЄ, ўЄю чр эхщ - ёыхфє■Є фтр чэрўр∙шї срщЄр - - #0033(*) #01 ╨хъюьхэфєхь√х рЄЁшсєЄ√ (INK & PAPER) - чрфэхую Їюэр, эр ъюЄюЁ√щ эрырурхЄё  - шчюсЁрцхэшх. └ъЄєры№эю фы  ърЁЄшэюъ, - яю ЁрчьхЁє ьхэ№°шї 640x200. - - #0034(*) #01 ╨хъюьхэфєхь√щ ЎтхЄ сюЁф■Ёр (#00-#0F) - ╠юцхЄ с√Є№ ръЄєры№эю яЁш шёяюы№чютр- - эшш эхёЄрэфрЁЄэющ ярышЄЁ√. - - #0035 #4B ═х шёяюы№чєхЄё . ╠юцхЄ с√Є№ чрсшЄю - ы■с√ь ьєёюЁюь. - - #0080(**) #01 X-ъююЁфшэрЄр (0-79) ыхтюую тхЁїэхую - єуыр т√тюфшьющ ърЁЄшэъш, шчьхЁ хьр  - т ёЄюысЎрї (1 ёЄыс= 8 яшъё= 1 срщЄ) - - #0081(**) #01 Y-ъююЁфшэрЄр (0-199) ыхтюую тхЁїэхую - єуыр т√тюфшьющ ърЁЄшэъш, шчьхЁ хьр  - т ёЄЁюўърї (1 ёЄЁ = 1 яшъёхы№) - - #0082 #01 WIDTH - °шЁшэр ърЁЄшэъш т ёЄюысЎрї - (юЄ 1 фю 80) - - #0083 #01 HIGH - т√ёюЄр ърЁЄшэъш т ёЄЁюўърї - (юЄ 1 фю 200) - - #0084 WIDTH*HIGH ╨рёЄЁ ьюэюїЁюьэюую шчюсЁрцхэш . - ╧ЁхфёЄрты хЄ ёюсющ яюёыхфютрЄхы№- - эюёЄ№ ёыхтр эряЁртю ёЄюысЎют юЄ - 1 фю x (x = WIDTH), ёюёЄю ∙шї шч - y срщЄют ърцф√щ (y = HIGH), ёўшЄр  - ётхЁїє тэшч. - -#84+WIDTH*HIGH #nnnn ╨рёЄЁ рЄЁшсєЄют. ╧юыэр  рэрыюуш  - ЁрёЄЁр ьюэюїЁюьэюую шчюсЁрцхэш  яю - ёЄЁєъЄєЁх, ё Єющ ыш°№ ЁрчэшЎхщ, ўЄю - юэ яЁшырурхЄё  т єяръютрээюь яю ьх- - Єюфє RLE тшфх. ╥ю хёЄ№, яЁхфёЄрты хЄ - шч ёхс  яюёыхфютрЄхы№эюёЄ№ фтєїсрщЄ- - э√ї ёыют, яхЁт√щ срщЄ т ърцфюь шч - ъюЄюЁ√ї ючэрўрхЄ ъюышўхёЄтю (1-255) - яюёыхфютрЄхы№эю шфє∙шї юфшэръют√ї - срщЄют рЄЁшсєЄют, р тЄюЁющ срщЄ - - ёюсёЄтхээю, ёрью чэрўхэшх рЄЁшсєЄр. - ----------------------------------- -╧Ёшьхўрэш : - -*) ═╬┬╬┬┬┼─┼═╚┼ ёяхЎшры№эю фы  єЄшышЄ√ GRFVIEW. ┬ юЁшушэрых - -эхшёяюы№чєхь√щ єўрёЄюъ. ╠юцхЄ с√Є№ чрсшЄ ы■с√ь ьєёюЁюь. - -**) ═хюс чрЄхы№э√х ярЁрьхЄЁ√ X ш Y ърЁЄшэъш, юёюсхээю фы  єЄшыш- -Є√ GRFVIEW, уфх шчюсЁрцхэшх ртЄюьрЄшўхёъш ЎхэЄЁшЁєхЄё , т ёююЄ- -тхЄёЄтшш ёю ётюшьш урсрЁшЄрьш. - -**************************************************************** -  2006, ЇхтЁры№. ╥шьюэшэ ╠ръёшь/NedoPC group -**************************************************************** -P.S. ╤ЄрЁЄют√щ рфЁхё COM-Їрщыр т TASiS - 24000DEC diff --git a/Docs/FORMATS/scl.hdr b/Docs/FORMATS/scl.txt similarity index 100% rename from Docs/FORMATS/scl.hdr rename to Docs/FORMATS/scl.txt diff --git a/Docs/FORMATS/scr.hdr b/Docs/FORMATS/scr.txt similarity index 100% rename from Docs/FORMATS/scr.hdr rename to Docs/FORMATS/scr.txt diff --git a/Docs/FORMATS/sna b/Docs/FORMATS/sna.txt similarity index 100% rename from Docs/FORMATS/sna rename to Docs/FORMATS/sna.txt diff --git a/Docs/FORMATS/tap.hdr b/Docs/FORMATS/tap.txt similarity index 100% rename from Docs/FORMATS/tap.hdr rename to Docs/FORMATS/tap.txt diff --git a/Docs/FORMATS/trd.hdr b/Docs/FORMATS/trd.txt similarity index 100% rename from Docs/FORMATS/trd.hdr rename to Docs/FORMATS/trd.txt diff --git a/Docs/FORMATS/z80.hdr b/Docs/FORMATS/z80.txt similarity index 100% rename from Docs/FORMATS/z80.hdr rename to Docs/FORMATS/z80.txt diff --git a/Docs/FORMATS/zxword_driver b/Docs/FORMATS/zxword_driver.txt similarity index 100% rename from Docs/FORMATS/zxword_driver rename to Docs/FORMATS/zxword_driver.txt diff --git a/Docs/FORMATS/zxzip.hdr b/Docs/FORMATS/zxzip.txt similarity index 100% rename from Docs/FORMATS/zxzip.hdr rename to Docs/FORMATS/zxzip.txt diff --git a/Docs/SPECTRUM.CFG b/Docs/SPECTRUM.CFG deleted file mode 100644 index ec2e18f..0000000 --- a/Docs/SPECTRUM.CFG +++ /dev/null @@ -1,11 +0,0 @@ -Sprinter ZX -c:\zx\roms\SP_128.BIN -c:\zx\roms\SP__48.BIN -c:\zx\roms\SP_TRD.BIN -c:\zx\roms\SP_EXP.BIN -c:\zx\roms\SP_EXP.BIN -c:\zx\roms\SP_EXP2.BIN -/turbo /7FFD /ret-fn -; - - diff --git a/For_4x.asm b/For_4x.asm new file mode 100644 index 0000000..f9c8c48 --- /dev/null +++ b/For_4x.asm @@ -0,0 +1,215 @@ +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + INCLUDE 'Shared_Includes/structures/FileSystem.inc' +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + +; in: HL - CLUSTER +; out: HL:IX - SECTOR +; Вначале должна быть выполнена инициализация BPB 4x +CLUSTER_TO_SECTOR: + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) + EX DE,HL + LD HL,(SYS_PAGE.MSD_DAT_SEC) + LD (.MSD_DAT_SEC),HL + LD HL,(SYS_PAGE.MSD_DAT_SEC2) + LD (.MSD_DAT_SEC2),HL + EX DE,HL + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + ; + LD DE,0 ;!FIXIT for FAT32 + DEC HL + DEC HL + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + ; + RRA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D +.MSD_DAT_SEC+1: LD DE,0 ;first data sector ;!FIXIT а если начальный сектор > #FFFF + XOR A + ADD IX,DE +.MSD_DAT_SEC2+1: + LD DE,0 + ADC HL,DE + ;!TODO а надо ли проверять переполнение HL:IX? + RET +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + + +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; +SET_IMAGE_DIR_SECTOR: + LD HL,ONE_FILE + LD DE,TMP_BUFF + LD A,FAT_ATTR.DIRECTORY + LD BC,Dss.F_First.FATname + RST ToDSS + RET C + ; + LD HL,(TMP_BUFF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + CALL CLUSTER_TO_SECTOR + LD (RESET_TO_ZX.DIR_SEC_L),IX + LD (RESET_TO_ZX.DIR_SEC_H),HL + RET +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + + +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; +SET_CURRENT_HDD: +.NUMBER+1: LD A,#FF + CP #FF + LD C,BIOS.HDD_INIT + JP Z,ToBIOS + LD C,BIOS.HDD_PART ; IDE-1/IDE-2 + JP ToBIOS +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; +BPB_SetUp: LD A,SYS_PAGE + LD HL,SYS_PAGE.MS_BPB + LD C,BIOS.HDD_READ_BPB + RST ToBIOS +.PARAMS: IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,(SYS_PAGE.MS_BPB+FORM_CODE) + CP #F0 + JP C,.ERROR_BPB + + LD DE,SYS_PAGE.MS_BPB+FAT_ID + LD HL,.FAT1_MSG + LD B,4 +.L1: LD A,(DE) + CP ' ' + JR NZ,.L11 + INC DE + JR .L1 +.L11: CP (HL) + JR NZ,.PC_DOS + + INC HL + INC DE + DJNZ .L1 + LD A,(DE) + CP '6' + LD HL,#81FF ; FAT16 флаг + JR Z,.FAT + CP '2' + JP NZ,.ERROR_BPB + +.PC_DOS: LD HL,#01FF ; FAT12 флаг +.FAT: LD (SYS_PAGE.FAT_FLAG),HL + + LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек + LD (SYS_PAGE.MSD_SECS),A + + LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS) + LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2) +.NO_LD_SPECIAL: LD BC,0 + LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS) + + ADD IX,DE + ADC HL,BC + + LD (SYS_PAGE.MSD_FAT_SEC),IX ; начальный сектор FAT + LD (SYS_PAGE.MSD_FAT_SEC2),HL ; начальный сектор FAT + + LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT + LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs +.NEXT_ADD: + ADD IX,DE + ADC HL,BC + DEC A + JR NZ,.NEXT_ADD + LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR + LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора + LD A,B + RL C + RLA + RL C + RLA + RL C + RLA + LD C,A + LD B,0 ; BC - число файловых записей в секторе + LD (SYS_PAGE.FilesPerSector),A + LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей + + EX DE,HL + DEC HL + XOR A +.NEXT_ADD2: + INC A + JR Z,.ERROR_BPB + SBC HL,BC + JR NC,.NEXT_ADD2 + EX DE,HL + + LD E,A ; A - число секторов в DIR + LD BC,0 + LD D,B + LD (SYS_PAGE.SectorsPerCluster),A + + ADD IX,DE ; Начало DATA area + ADC HL,BC + + LD (SYS_PAGE.MSD_DAT_SEC),IX + LD (SYS_PAGE.MSD_DAT_SEC2),HL + + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора + ; D = 0 + LD H,D + LD L,D + LD E,D + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) + LD D,A + XOR A +.NEXT_ADD3: + ADD HL,BC ; Вычисление длины кластера + ADC A,E + DEC D + JR NZ,.NEXT_ADD3 + + LD (SYS_PAGE.CLUSTER_LEN),HL + LD B,E + LD C,A + LD (SYS_PAGE.CLUSTER_LEN2),BC + ; + ; DE=0 + EX DE,HL ;LD HL,0 + LD BC,(SYS_PAGE.MS_BPB+S_P_T) + LD A,(SYS_PAGE.MS_BPB+H_P_S) +.BPB_L1: ; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР + ADD HL,BC + DEC A + JR NZ,.BPB_L1 + LD (SYS_PAGE.S_X_H),HL + ; + EX AF,AF' + OUT (SLOT3),A + AND A + RET + ; +.ERROR_BPB: + EX AF,AF' + OUT (SLOT3),A + SCF + RET + ; +.FAT1_MSG: DB "FAT1" +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 80b60f7..a0e68ce 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 80b60f7294ce3eee958a0c4e9a6f29577cee496f +Subproject commit a0e68ce3a19bd47537585e49bfbf5e45fab197a1 diff --git a/ZXMODE/ZXMODE.FRT b/ZXMODE/ZXMODE.FRT new file mode 100644 index 0000000..ce69977 --- /dev/null +++ b/ZXMODE/ZXMODE.FRT @@ -0,0 +1,177 @@ +\ \\\\ menu program for spectrum.exe \\\\ \ + +VARIABLE MAIN-X +VARIABLE CURS-M +VARIABLE MENU +VARIABLE ITEMS +VARIABLE EXE-POINT +VARIABLE PLACE-M + +: M-CB 10 COLOR ! ; +: M-C0 07 COLOR ! ; +: M-C1 70 COLOR ! ; +: M-C2 30 COLOR ! ; +: M-C3 3F COLOR ! ; +: M-C4 01 COLOR ! ; + + : CLSM M-CB 100 SET_POS 17 0 DO CLL CR LOOP ; + + : MENU" CREATE , , ," ; + : ITEM" , ," BL WORD FIND IF NAME> , ELSE ABORT" no word!" THEN ; + : END-MENU 0 , ; + +\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \ + +19 CONSTANT LEN-F + + : EDIT-FNAME EXE-POINT @ PLACE-M @ OVER C@ LEN-F - + SET_POS C@+ + LEN-F - LEN-F 1- (EXPECT) ; + : EDIT-CNAME EXE-POINT @ PLACE-M @ OVER C@ 0D - + SET_POS C@+ + 0D - 0C (EXPECT) ; + : NO-ESC ; + : H-LINE M-C3 1800 SET_POS CLL 1801 SET_POS ; + + : NEW-MENU M-C1 PLACE-M @ SET_POS EXE-POINT @ C@+ TYPE MENU ! CLSM ; + + : M-EXIT M-C0 CLS BYE ; + + : RET-MAIN MAIN-X @ MENU @ = IF M-EXIT THEN + H-LINE ." Ret to Main " MAIN-X @ NEW-MENU ; + +: NO-FN H-LINE ." no function " ; + +1 0E1B MENU" TRDS TRD files " +1 ITEM" Disk A: testfile.trd " EDIT-FNAME +1 ITEM" Disk B: " EDIT-FNAME +1 ITEM" Disk C: " EDIT-FNAME +1 ITEM" Disk D: " EDIT-FNAME +1 ITEM" Main Menu " RET-MAIN +END-MENU + +1 21B MENU" ROMS ROM Menu " +1 ITEM" BASIC48 basic48.bin " EDIT-FNAME +1 ITEM" BASIC128 basic128.bin " EDIT-FNAME +1 ITEM" TR-DOS trdos5s.bin " EDIT-FNAME +1 ITEM" EXPANSION exp.bin " EDIT-FNAME +1 ITEM" BIOS1 exp.bin " EDIT-FNAME +1 ITEM" BIOS2 exp2.bin " EDIT-FNAME +1 ITEM" Main Menu " RET-MAIN +END-MENU + +1 414 MENU" CONFIG Options Menu " +1 ITEM" Turbo Yes " NO-FN +1 ITEM" Sprinter ports Yes " NO-FN +1 ITEM" Port 1FFD Yes " NO-FN +1 ITEM" Port 7FFD Yes " NO-FN +1 ITEM" 512Kb Memory No " NO-FN +1 ITEM" Original Int No " NO-FN +1 ITEM" Scorpion Int No " NO-FN +1 ITEM" 312 screen lines No " NO-FN +1 ITEM" Start TR-DOS No " NO-FN +1 ITEM" Install only No " NO-FN +1 ITEM" Reset to ZX Yes " NO-FN +1 ITEM" Main Menu " RET-MAIN +END-MENU + +1 D03 MENU" STAN Standards " +1 ITEM" Sprinter ZX " NO-FN +1 ITEM" ZX Spectrum " NO-FN +1 ITEM" Pentagon 128 " NO-FN +1 ITEM" Scorpion 256 " NO-FN +1 ITEM" Pentagon 512 " NO-FN +1 ITEM" Main Menu " RET-MAIN +END-MENU + +1 512 MENU" SPEC Specials " +1 ITEM" Save your MODE " NO-FN +1 ITEM" Save utility " NO-FN +1 ITEM" Main Menu " RET-MAIN +END-MENU + +: START-ZX H-LINE ." Start SPECTRUM.EXE" ; +: STANDARD H-LINE ." Choose standard mode" STAN NEW-MENU ; +: CONFIG-ZX H-LINE ." Set Spectrum MODE options" CONFIG NEW-MENU ; +: ROM-SET H-LINE ." Set Spectrum ROM files" ROMS NEW-MENU ; +: TRD-FILES H-LINE ." Set TR-DOS disk images" TRDS NEW-MENU ; +: SPECIALS H-LINE ." Special functions" SPEC NEW-MENU ; + +1 203 MENU" MAIN Main Menu " ( pos,curs,"name" ) +1 ITEM" Mode: Sprinter ZX " EDIT-CNAME +1 ITEM" Start " START-ZX ( type "name" word ) +1 ITEM" Standard modes " STANDARD +1 ITEM" Options " CONFIG-ZX +1 ITEM" ROM files " ROM-SET +1 ITEM" Disk image files " TRD-FILES +1 ITEM" Specials " SPECIALS +1 ITEM" Exit " M-EXIT +END-MENU + +MAIN MAIN-X ! + +: CURS-TYPE CURS-M @ 0= + IF GET_POS PLACE-M ! DUP EXE-POINT ! C@+ M-C2 TYPE M-C1 ELSE C@+ TYPE THEN + -1 CURS-M +! 1 ITEMS +! ; + +: HEAD ( len -> ) GET_POS SWAP M-C1 C" ╔ EMIT 0 DO C" ═ EMIT LOOP C" ╗ EMIT 100 + SET_POS ; +: TEXT ( len -> ) GET_POS OVER M-C1 C" ║ EMIT CURS-TYPE C" ║ EMIT M-C4 ." ▒▒" 100 + SET_POS ; +: LINE ( len -> ) GET_POS SWAP M-C1 C" ╟ EMIT 0 DO C" ─ EMIT LOOP C" ╢ EMIT M-C4 ." ▒▒" 100 + SET_POS ; +: ENDS ( l->) GET_POS OVER M-C1 C" ╚ EMIT 0 DO C" ═ EMIT LOOP C" ╝ EMIT M-C4 ." ▒▒" + 102 + SET_POS 2 + C" ▒ SWAP 0 DO DUP EMIT LOOP DROP ; + +MAIN MENU ! + +: PRINT-MENU COLOR @ M-C1 ITEMS 0! EXE-POINT 0! + MENU @ + DUP @ SET_POS 2 + + DUP @ CURS-M ! 2 + + DUP C@ HEAD TEXT DUP C@ LINE DUP C@ SWAP C@+ + + BEGIN DUP @ 0<> WHILE + 2 + TEXT C@+ + 2 + REPEAT + DROP ENDS COLOR ! ; + + + : CURS-UP MENU @ 2 + DUP @ 1- 1 MAX SWAP ! ; + : CURS-DN MENU @ 2 + DUP @ 1+ ITEMS @ 1- MIN SWAP ! ; + : CURS-HOME 1 MENU @ 2 + ! ; + : CURS-END ITEMS @ 1- MENU @ 2 + ! ; + + : EXE-MENU M-C0 EXE-POINT @ ?DUP IF C@+ + @ EXECUTE THEN ; + + : KEY-MENU WAIT-KEY + +DUP [ SYS-ID 011B AND SYS-ID NOT 011B AND OR ] LITERAL = IF DROP RET-MAIN EXIT THEN ( ESC ) +DUP [ SYS-ID 4400 AND SYS-ID NOT 4400 AND OR ] LITERAL = IF DROP RET-MAIN EXIT THEN ( F10 ) +DUP [ SYS-ID 5200 AND SYS-ID NOT 5000 AND OR ] LITERAL = IF DROP CURS-DN EXIT THEN ( Down ) +DUP [ SYS-ID 5800 AND SYS-ID NOT 4800 AND OR ] LITERAL = IF DROP CURS-UP EXIT THEN ( Up ) +DUP [ SYS-ID 280D AND SYS-ID NOT 1C0D AND OR ] LITERAL = IF DROP EXE-MENU EXIT THEN ( Up ) +\ DUP [ SYS-ID D400 AND SYS-ID NOT 7300 AND OR ] LITERAL = IF DROP W-LEFT EXIT THEN ( ) +\ DUP [ SYS-ID 5400 AND SYS-ID NOT 4B00 AND OR ] LITERAL = IF DROP -POS EXIT THEN ( <- ) +\ DUP [ SYS-ID 5600 AND SYS-ID NOT 4D00 AND OR ] LITERAL = IF DROP +POS EXIT THEN ( -> ) +\ DUP [ SYS-ID 0F09 AND SYS-ID NOT 0F09 AND OR ] LITERAL = IF DROP TAB+ EXIT THEN ( tab ) +\ DUP [ SYS-ID 8F09 AND SYS-ID NOT 0F00 AND OR ] LITERAL = IF DROP TAB- EXIT THEN ( ESC-W ! + +TRUE H-FLAG ! +07 COLOR ! + +MAKE LOOP-M +\ PC> INC-END SAVE-SYSTEM _test.com +\ SP> INC-END SAVE-SYSTEM zxmode.exe + +CLS LOOP-M +BYE + diff --git a/ZXMODE/_HELP.FRT b/ZXMODE/_HELP.FRT new file mode 100755 index 0000000..95cf5a0 --- /dev/null +++ b/ZXMODE/_HELP.FRT @@ -0,0 +1,19 @@ +\ !! DO NOT EDIT THIS FILE !! +M-C0 100 SET_POS +CLL CR +CLL .( This is a help page ┐) +CLL .( └───────────────────┘) +CLL CR +CLL .( Main keys: F1 - help F10 - Terminate program) +CLL .( Down - cursor DOWN Up - cursor UP) +CLL .( Home - cursor to 1-st line End - cursor to last) +CLL .( Enter - Execute ESC - Exit from menu) +CLL CR +CLL .( Special keys: Ctrl+left - Shift menu Left) +CLL .( Ctrl+right - Shift menu Right) +CLL .( Ctrl+PageUp - Shift menu Up) +CLL .( Ctrl+PageDown - Shift menu Down) +CLL CR +CLL .( --*** press any key ***--) CLL CR +M-CB WAIT-KEY MENU @ NEW-MENU + diff --git a/Docs/changes.txt b/changes.txt similarity index 100% rename from Docs/changes.txt rename to changes.txt diff --git a/macroses/accelerator.a80 b/macroses/accelerator.a80 deleted file mode 100644 index f8171a6..0000000 --- a/macroses/accelerator.a80 +++ /dev/null @@ -1,71 +0,0 @@ -; Макросы акселератора для красоты)) - -;--------[выключить акселератор]-------- - MACRO ACC_Off - ld b,b - ENDM -;--------------------------------------- - -;---------[режим приема байта]---------- - MACRO ACC_SetBlockSize - ld d,d -; включает акселератор в режим приема -; байта размера блока далее следует -; команда типа LD A,dat, где dat и будет -; новым размером блока. Если размер -; блока был установлен ранее, его можно -; не устанавливать. - ENDM -;--------------------------------------- - -;-------[заполнение одним байтом]------- - MACRO ACC_FillOneByte - ld c,c -; Операция Fill. Последующая команда -; типа LD (HL),A приведет к заполнению -; указанного ранее количества байт -; значением A - ENDM -;--------------------------------------- - -;----[заполнение вертикальных линий]---- -;Операция Fill для графического экрана. - MACRO ACC_FillScreenOneByte - ld e,e -; Последующая команда типа LD (HL),A -; приведет к заполнению значением A -; вертикальных линий экрана указанным -; ранее количеством байт - ENDM -;--------------------------------------- - -;----------[копирование блока]---------- - MACRO ACC_CopyBlock - ld l,l -; Последующая команда типа LD A,(HL) -; приведет к заполнению ОЗУ акселератора -; данными из адреса (HL), а команда типа -; LD (DE),A приведет к перезаписи данных -; из ОЗУ акселератора в основное или -; видео-ОЗУ. - ENDM -;--------------------------------------- - -;---[копирование графического блока]---- - MACRO ACC_CopyScreenBlock - ld a,a -; копирование блока для граф. экрана. -; Последующая команда типа LD A,(HL) -; приведет к заполнению ОЗУ акселератора -; данными из адреса (HL), а команда типа -; LD (DE),A приведет к перезаписи данных -; из ОЗУ акселератора в видео-ОЗУ -; вертикальными линиями. - ENDM -;--------------------------------------- - -;--------------[Reserved]--------------- - MACRO ACC_Reserved - LD H,H - ENDM -;--------------------------------------- \ No newline at end of file diff --git a/macroses/macros.a80 b/macroses/macros.a80 deleted file mode 100644 index b8fc631..0000000 --- a/macroses/macros.a80 +++ /dev/null @@ -1,73 +0,0 @@ -; - MACRO FRAM_ON - IN A,(FastRAM_ON) - IF Emulator - PUSH BC - PUSH AF - LD BC,#1FFD - XOR A - OUT (C),A - OUT (FastRam_BANK0),A - POP AF - POP BC - ENDIF - ENDM - - MACRO FRAM_OFF - IN A,(FastRAM_OFF) - IF Emulator - PUSH BC - PUSH AF - LD BC,#1FFD - LD A,1 - OUT (C),A - XOR A - OUT (FastRam_BANK0),A - POP AF - POP BC - ENDIF - ENDM -; -; - MACRO PrintProc - - MODULE PrintF -;--------------------------------------- -printstr: -; в рег. HL адрес на печатаемый буфер - LD C,Dss.PChars - jp ToDSS -;--------------------------------------- - -;--------------------------------------- -; в рег. A число печатаемое как hex -printhex: - LD D,A - RRCA - RRCA - RRCA - RRCA - AND #0F - ADD A,#30 - CP #3A - JR C,.PRNH1 - ADD A,7 -.PRNH1: - CALL .PRINT_CHAR - LD A,D - AND #0F - ADD A,#30 - CP #3A - JP C,.PRINT_CHAR - ADD A,7 - JP .PRINT_CHAR -; в регистре A символ для печати -.PRINT_CHAR: - LD BC,#0182 - JP ToBIOS -;--------------------------------------- - ENDMODULE - - ENDM -; -; \ No newline at end of file diff --git a/param.txt b/param.txt new file mode 100644 index 0000000..d6afdb3 --- /dev/null +++ b/param.txt @@ -0,0 +1,10 @@ +Строка 1: Scorpion 256 +Строка 2: c:\zx\roms\SC_128.BIN +Строка 3: c:\zx\roms\SC__48.BIN +Строка 4: c:\zx\roms\SC_TRD.BIN +Строка 5: c:\zx\roms\SC_EXP.BIN +Строка 6: c:\zx\roms\SC_EXP.BIN +Строка 7: c:\zx\roms\SP_EXP2.BIN +Строка 8: /turbo /sprinter /7FFD /1FFD /ret-zx /load-pal +Строка 9: c:\zx\palette\komod.pal +Строка 10: ; \ No newline at end of file diff --git a/spectrum.asm b/spectrum.asm index 241c290..58e00be 100644 --- a/spectrum.asm +++ b/spectrum.asm @@ -1,37 +1,42 @@ -/* - - .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. - | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | - | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | | - | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| | - | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | | - | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | | - | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | | - | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| | - | | | || | | || | | || | | || | | || | | || | | || | | | - | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' | - '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' - - */ -/* -To do: - SYS: - [ ] - задавать CONFIG_DE перед запуском спектрума и в перехватчике ресета - images: - [+] - Load SCL image - [ ] - Load TAP image - [ ] - Load SNA file + ; - features: - [ ] - When image filename exist, then instead of SPECTRUM.CFG loads image_filename.cfg if exist too - [ ] - Выдавать сообщения на языке установленном в CMOS - [ ] - Менять спектрумовскую палитру +; .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. +; | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | +; | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | | +; | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| | +; | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | | +; | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | | +; | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | | +; | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| | +; | | | || | | || | | || | | || | | || | | || | | || | | | +; | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' | +; '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' +; + +/* + SYS + [x] - задаётся CONFIG_DE перед запуском спектрума и в перехватчике ресета (для более гладкой совместимости со старым софтом Sp97) + [x] - поддержка новых образов vROM + [x] - в конфиге можно пропустить загрузку с HDD выбранных vROM, они пропускаются если перед путём стоит ";" + [x] - проверять метку ZX, если мы не грузим 3 основных vROM + [x] - добавлена совместимость с демо ATARIN, успользующей неполную дешифрацию порта AY + [x] - перед входом в режим спектрума текущим устанавливается полный путь к папке с которогй загружался образ TRD +; + Images + [+] - Load SCL image + [ ] - Load TAP image + [ ] - Load SNA file +; + Features + [+] - Если выбрано ret-zx,то при нажатии на пробел сразу после CAD вернёт в DSS + [*] - Менять спектрумовскую палитру + [ ] - Выдавать сообщения на языке установленном в CMOS */ ; ; Compilation parameters ;*************************************** - DEVICE SPRINTER + DEVICE SPRINTER ; MMU 2 e, 0 ; нулевая страница в банку 2 и проверка на границы ; OUTPUT './Build/new.bin' ;*************************************** @@ -39,9 +44,11 @@ To do: ; ; Defines section ;*************************************** - ifndef DEBUG : define DEBUG 0 : endif - ifndef EMULATOR 0 : define EMULATOR 0 : endif - define EXE_HEADER 1 + IFNDEF DEBUG : DEFINE DEBUG 0 : ENDIF + IFNDEF EMULATOR 0 : DEFINE EMULATOR 0 : ENDIF + DEFINE EXE_HEADER 1 + DEFINE App_EXE_Version 1 + DEFINE NEW_MEMORY_LOGIC 1 ; define NEED_LOADER 1 ; define NeedSafePort_Y 0 ;*************************************** @@ -50,1128 +57,1561 @@ To do: ; ; Included constants section ;*************************************** - include 'Shared_Includes/constants/sp2000.inc' - include 'Shared_Includes/constants/dss_equ.inc' - include 'Shared_Includes/constants/BIOS_equ.inc' + INCLUDE 'Shared_Includes/constants/sp2000.inc' + INCLUDE 'Shared_Includes/constants/dss_equ.inc' + INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' ;*************************************** ; ; ; Included macroses section ;*************************************** - include 'Shared_Includes/macroses/macros.z80' - include 'Shared_Includes/macroses/accelerator.z80' + INCLUDE 'Shared_Includes/macroses/macros.z80' + INCLUDE 'Shared_Includes/macroses/accelerator.z80' ;*************************************** ; ; Included LUA section ;*************************************** - includelua + INCLUDELUA ;*************************************** ; + DEFINE EXEinfoMACRO + MACRO _mEXEinfo + BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX + BYTE 'Spectrum launcher' + BYTE ' by Ivan Mak and ' + BYTE ' Anatoliy ' + BYTE ' Belyanskiy, ' + BYTE ' Sprinter Team ' + ENDM + ; ; Standart EQU section ;*************************************** -org_addr EQU #8000+CLP_Buffer -code_addr EQU BEGIN -stack_point EQU #BFFE -stack_buffer EQU 64 -program_start EQU BEGIN +org_addr EQU #8000+CLP_Buffer +code_addr EQU BEGIN +stack_point EQU #C000 +stack_buffer EQU 64 +program_start EQU BEGIN +Loader_length EQU 0 ;*************************************** ; ; ; Program EQU section ;*************************************** -NAME_CFG_LINE EQU 0 -BASIC128_LINE EQU 2 -BASIC_48_LINE EQU 4 -TRDOS_LINE EQU 6 -EXP_LINE EQU 8 -BIOS_LINE EQU 10 -BIOS2_LINE EQU 12 -OPTIONS_LINE EQU 14 +FULL_FILE_NAME_LENGTH EQU 256 ; длина строки пути к файлу +MAX_LINE_LENGTH EQU 120 ; длина строки CFG файла + + +CFG_FILE_LINES EQU 13 +.NAME EQU 1 +.BASIC128 EQU 2 +.BASIC_48 EQU 3 +.TRDOS EQU 4 +.ZXEXP EQU 5 +.ZXBIOS1 EQU 6 +.ZXBIOS2 EQU 7 +.BASIC128_2 EQU 8 +.BASIC_48_2 EQU 9 +.TRDOS_2 EQU 10 +.ZXEXP_2 EQU 11 +.OPTIONS EQU 12 +.PALETTE EQU 13 + +;OPTIONS_LINE EQU (CFG_FILE_LINES-1)*2 ;*************************************** ; ; ; Program EQU section ;*************************************** - INCLUDE 'version.inc' + INCLUDE 'version.inc' ;*************************************** ; ; ; Code start section ;[]-------------------------------------------------------------------[] - IF EXE_HEADER - include 'Shared_Includes/constants/EXE_Header.z80' - ORG org_addr - ELSE - ORG org_addr - CLP_Buffer - ENDIF + IF EXE_HEADER + INCLUDE 'Shared_Includes/constants/EXE_Header.z80' + ORG org_addr + ELSE + ORG org_addr-CLP_Buffer + ENDIF +;███████████████████████████████████████████████████████████████████████; +;███████████████████████████████████████████████████████████████████████; +BEGIN: LD (LINE_X),IX -BEGIN: - LD (LINE_X),IX + LD HL,START_MSG + LD C,Dss.PChars + RST ToDSS + ; + ; + LD C,Dss.Version + RST ToDSS + SCF + LD HL,256*DSS_MIN_VERS.vers + DSS_MIN_VERS.modf + SBC HL,DE + JR C,.goodVers + LD HL,DSS_MIN_VERS.build - 1 + SBC HL,BC + JR NC,ERROR_OLD_DSS + ; + ; + +.goodVers: IN A,(SLOT3) + LD (SAVE_SLOT3),A + ; + ; + ;!TODO + ;LD HL,SPECTRUM_HOME_DIR + ;LD BC,Dss.AppInfo.EXE_HomeDir + ;RST ToDSS + ;; + ;LD C,Dss.CurDisk + ;RST ToDSS + ;ADD A,'A' + ;LD (USER_CURRENT_DRV),A + ;; + ;LD HL,USER_CURRENT_DIR + ;LD C,Dss.CurDir + ;RST ToDSS + ; +; JR PARSE_CMD_LINE + CALL PARSE_CMD_LINE + CALL READ_CNF_FILE + ; SetUp ZX + CALL PARSE_PARAMETERS + CALL SHOW_MESSAGE_ZXMODE + CALL COUNT_vROM_PAGES + PUSH AF + ; Очищаем память, если ROM_BIN > 0 + LD BC,BIOS.ZX_MEMORY_MANAGER.FreeZXvPages.vROM + CALL NC,ToBIOS + ; Выделяем страницы под vRAM + LD A,(PARAMS.No_run + 2) + AND A + CALL NZ,GET_vRAM_PAGES + JR C,Error_NoMemForSPpages + POP AF + ; Выделяем страницы под vROM, если ROM_BIN > 0 + JR C,.skip_vROM + LD A,(ZX_vROM_COUNT) + LD B,A + LD C,BIOS.GetMem + RST ToBIOS + JR C,Error_NoMemForSPpages + LD (ZX_vROM_BLK),A + ; Маппим страницы vROM, если ROM_BIN > 0 + LD HL,BUFFER_RAM_PAGES + LD C,BIOS.GetMemBlkPages + RST ToBIOS + CALL LOAD_vROM_BIN +.skip_vROM: ; если norun, то дальше не надо + LD A,(PARAMS.No_run + 2) + AND A + LD HL,MSG_EXIT1 + JP Z,EXIT_ALL + ; грузим палитру и образ диска, если надо + CALL LOAD_IMAGE_FILE + CALL LOADING_PALETTE + CALL SHOW_MESSAGE_OK_CFG_NAME + JP PREPARE_TO_ZXMODE +;███████████████████████████████████████████████████████████████████████; - LD HL,START_MSG - LD C,5Ch - RST ToDSS - IN A,(SLOT3) - LD (SAVE_SLOT3),A - JP COMAND_LINE -ERROR_FILE: - LD HL,ERROR_FILE_MSG_X - LD C,5Ch - RST ToDSS - LD HL,ONE_FILE - LD C,5Ch - RST ToDSS +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +Error_NoMemForSPpages: + LD HL,NO_MEM_MSG + LD B,DSS_Error.sys.NOT_ENOUGH_MEMORY + JR ERROR_FILE.prn_msg + ; ; +ERROR_FILE: LD HL,ERROR_FILE_MSG_X + LD C,Dss.PChars + RST ToDSS + ; + ; LD A,(FILE_HANDLE) + ; LD C,Dss.Close + ; RST ToDSS + ; + LD HL,ONE_FILE + LD B,DSS_Error.sys.FILE_NOT_FOUND +.prn_msg: PUSH BC + LD C,Dss.PChars + RST ToDSS + ; + LD A,(vROM_LOAD_BIN.need_free) + OR A + JR Z,.skip_free + ; + LD A,(ZX_vROM_BLK) + LD C,BIOS.FreeMem + RST ToBIOS + ; +.skip_free: LD HL,ERROR_FILE_MSG + POP BC + JR EXIT_NOW + ; ; +ERROR_ZX_FLAG: LD HL,MSG_NO_ZX_FLAG + JR EXIT_NOW + ; ; +ERROR_OLD_DSS: LD HL,MSG_OLD_DSS + JR EXIT_NOW + ; ; +EXIT_ALL: LD B,DSS_Error.sys.NO_ERROR + JR EXIT_NOW + ; ; +END_CNF_ERROR: LD HL,ERROR_CNF + LD B,DSS_Error.sys.UNKNOWN_FORMAT +EXIT_NOW: PUSH BC + LD C,Dss.PChars + RST ToDSS + ; + LD BC,BIOS.ZX_MEMORY_MANAGER.FreeZXvPages.vRAM + RST ToBIOS + POP BC +.loop: LD C,Dss.Exit + RST ToDSS + JR .loop + ; ; +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; - LD HL,ERROR_FILE_MSG - JP EXIT_ALL -END_CNF_ERROR: - LD HL,ERROR_CNF -; JP EXIT_ALL -EXIT_ALL: -; PUSH HL -;---------------------[test!!!!!]------- - ; LD A,0 - ; LD C,BIOS.EMM_FN3 - ; RST ToBIOS ; освободить e: - ; LD A,(SAVE_SLOT3) - ; OUT (SLOT3),A -;--------------------------------------- +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; out B - old ROM-page +SET_ROM: DI ;!FIXIT оставить одно DI в начале + LD C,BIOS.SET_PORTS + JP ToBIOS +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; -; POP HL - LD C,Dss.PChars - RST ToDSS -;---------------------[test!!!!!]------- +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; Чтение образа TRD/SCL в рамдрайв +READ_IMAGE: LD DE,ONE_FILE + LD BC,FULL_FILE_NAME_LENGTH + LDIR + LD HL,ONE_FILE - ; ld a,(CurDisk_Save) - ; ld c,Dss.ChDisk - ; RST ToDSS - ; jr nc,1f + LD A,Dss.Open.R + LD C,Dss.Open + RST ToDSS + RET C - ; ld hl,ERROR_FILE2_MSG - ; LD C,Dss.PChars - ; RST ToDSS -;--------------------------------------- + LD (IMAGE_HANDLER),A + ; [x] 31/01/2024 поддержка переключения диска/раздела в TR-DOS + LD HL,ONE_FILE + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + JR C,.no_change_Disk + AND 8 ;!HARDCODE В строке указано имя диска + JR Z,.currentDisk + ; + LD C,Dss.CurDisk + RST ToDSS + JR C,.no_change_Disk + JR .getInfoDRV + ; +.currentDisk: LD A,(ONE_FILE) + SUB "A" + ; +.getInfoDRV: ; Настраиваем HDD + OR #80 + LD HL,TMP_BUFF + LD BC,Dss.DskInfo + RST ToDSS + ; + LD B,4 ;!HARDCODE номер нужного параметра + LD DE,0 + LD HL,TMP_BUFF +.loop_param: ADD HL,DE + LD E,(HL) + INC HL + DJNZ .loop_param + ; check HDD + LD A,(HL) + CP DRIVE_CODES.SPRINTER.HDD + JR C,.no_change_Disk + CP DRIVE_CODES.SPRINTER.HDD + 4 + 1 + JR NC,.no_change_Disk + ; + LD A,%0000'0011 + AND (HL) + LD D,A + INC HL + LD A,(HL) + RLCA + RLCA + ; + OR D + AND #0F + ; + LD (SET_CURRENT_HDD.NUMBER),A + OR DRIVE_CODES.TRDOS.HDD + LD (RESET_TO_ZX.CURRENT_DIR_DRIVE),A + ; + ; [x] поддержка переключения папки образа для режима ZX + ; Выделяем путь до папки с образом + LD HL,ONE_FILE + LD BC,ONE_FILE.Size + XOR A + CPIR + DEC HL + DEC HL + PUSH HL + LD HL,ONE_FILE.Size - 2 + SBC HL,BC + LD B,H + LD C,L + POP HL + LD A,'\' ; + CPDR + INC HL + LD (HL),0 + PUSH HL + ; устанавливаем и инитим винт + ; LD A,SYS_PORT.BIOS + ; OUT (SYS_PORT.ROM),A + CALL SET_CURRENT_HDD + ; LD A,SYS_PORT.BIOS + ; OUT (SYS_PORT.RAM),A + ; парсим для расчётов BPB + CALL BPB_SetUp + ; запоминаем сектор директории + CALL SET_IMAGE_DIR_SECTOR + POP HL + LD (HL),'\' ; + ;;;;;;;;; + ; +.no_change_Disk:; + LD A,(IMAGE_FLAG) + AND A + JR Z,.Load_TRD -1: LD BC,Dss.Exit - RST ToDSS + DEC A ; check if SCL + JP Z,Load_SCL + ;jp Error_Flag ;!!!!!!!!!!!!!!!! -COMAND_LINE: - LD HL,(LINE_X) - LD A,(HL) - AND A - JR Z,NO_FIL - DEC A - JR Z,NO_FIL +.Load_TRD: LD A,(IMAGE_HANDLER) + LD HL,0 + LD IX,0 + LD BC,Dss.Move_FP.FrEnd + RST ToDSS ; найти длину файла + RET C - INC HL - INC HL + PUSH IX + POP DE - CALL FIND_FILES + CALL Get_RAM_Disk_E + RET C + JP Load_IMAGE_File +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; - LD HL,(CNF_NAME) - LD A,Spec_Page - CALL READ_FILE_1 - JP NC,CONTINUE - -NO_FIL: - LD HL,CNF_FILE - LD A,Spec_Page - CALL READ_FILE_1 - JR C,ERROR_FILE - JP CONTINUE - -FIND_FILES: - PUSH HL - - LD (X_FILE),HL - LD DE,0 - LD (IMAGE_FLAG),DE - LD (IMAGE_NAME),DE - LD (CNF_NAME),DE - LD B,A - JR NO_NEXT - -FIND_T_LOOP: - LD A,(HL) - INC HL - CP "." - CALL Z,POINT_F - CP 20h - CALL Z,BLANK_X - CP 9 - CALL Z,BLANK_X - CP 10 - CALL Z,BLANK_X1 - CP 13 - CALL Z,BLANK_X1 - JR Z,END_NO_IMAGE - -NO_NEXT: - DJNZ FIND_T_LOOP - -END_NO_IMAGE: - POP HL - LD A,(CNF_NAME+1) - AND A - RET NZ - LD A,(IMAGE_NAME+1) - AND A - LD DE,(X_FILE) - JR Z,CNF_ALL - LD DE,CNF_FILE -CNF_ALL: - LD (CNF_NAME),DE - RET - -BLANK_X: - LD (X_FILE),HL ; найден пробел, имя файла - снова -BLANK_X1: - DEC HL - LD (HL),0 - INC HL - RET -;------------------------------------[v] -POINT_F: - LD A,(HL) +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; hl:de - размер файла в байтах +Get_RAM_Disk_E: LD A,D + ADD A,A + ADC HL,HL + ADD A,A + ADC HL,HL - CP 't' - JR Z,.TRD - CP 'T' - JR Z,.TRD + LD A,D + AND #3F + OR E + JR Z,.skip_inc + INC HL + ;HL - длина файла в страницах +.skip_inc: LD A,H + AND A + JR NZ,ERROR_NO_MEM + LD A,L + AND A + JR Z,ERROR_NO_MEM + PUSH AF + ; [x] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS +.free_disk: DI + ;!TEST + ;XOR A ; RAM-Drive E: + ;LD C,BIOS.FreeMemRMD + ;RST ToBIOS ; освободить e: + ; + POP BC + ;!TEST + ;LD B,A ; запросить память у bios-а + ;XOR A ; RAM-Drive E: + ;LD C,BIOS.GetMemRMD ; и подсоединить к e: + LD C,BIOS.GetMem + ; + RST ToBIOS + JR C,ERROR_NO_MEM + LD (Load_IMAGE_File.MEM_BLK),A + RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; - CP 's' - JR Z,.SCL - CP 'S' - JR Z,.SCL - CP 'z' - JR Z,.CNF - CP 'Z' - JR Z,.CNF -.exit: - DEC HL - LD A,(HL) - INC HL - RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +Load_IMAGE_File: + LD A,(IMAGE_HANDLER) + LD HL,0 + LD IX,0 + LD BC,Dss.Move_FP.FrStart + RST ToDSS ; установить указатель на 0 + RET C -.SCL: - ld de,IMAGE_FLAG - ld a,1 - ld (de),a -.TRD: - LD DE,(X_FILE) - LD (IMAGE_NAME),DE - JR .exit + LD HL,MSG_LOAD_IMAGE ; loading image + LD C,Dss.PChars + RST ToDSS -.CNF: - LD DE,(X_FILE) - LD (CNF_NAME),DE - JR .exit -;------------------------------------[^] +.MEM_BLK+1: LD A,0 -LINE_ZX: DB "ZX Spectrum PAGES",0 -LEN_LINE_ZX EQU $-LINE_ZX +.load_loop: PUSH AF + OUT (SLOT3),A + + LD A,(IMAGE_HANDLER) + LD HL,#C000 ; грузить 16k + LD DE,#4000 + LD C,Dss.Read + RST ToDSS + JR C,ERROR_IN_READ + + LD HL,PROGRES_IND ; loading progress + LD C,Dss.PChars + RST ToDSS + + DI + POP AF +.scl_read_next: LD C,BIOS.GetMemPageNext + RST ToBIOS + + CP #FF + JR NZ,.load_loop + + LD HL,PROGRES_100 ; loading 100% + LD C,Dss.PChars + RST ToDSS + + LD A,(IMAGE_HANDLER) + LD C,Dss.Close ; закрыть файл + RST ToDSS + + RET C +.Set_RAM_Dsk_EtoA: + DI + XOR A + LD BC,0*256+BIOS.RAMD_TO_DRV ; назначить e: на a: + RST ToBIOS + AND A + RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +ERROR_IN_READ: POP AF + JR ERROR_IMAGE_X + +ERROR_NO_MEM: LD HL,MSG_NO_MEM + LD C,Dss.PChars + RST ToDSS +ERROR_IMAGE_X: LD A,(IMAGE_HANDLER) + LD C,Dss.Close ; закрыть файл + RST ToDSS + SCF + RET +SAV_PG3X: DB 0 ; !FIXIT перенести +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +READ_FILE_1: LD DE,ONE_FILE + LD BC,FULL_FILE_NAME_LENGTH + LDIR + LD HL,ONE_FILE + OUT (SLOT3),A + ; READ_FILE: + LD A,Dss.Open.R + LD C,Dss.Open + RST ToDSS + RET C ; ошибка, если нет файла + ; + LD (FILE_HANDLE),A + LD A,(FILE_HANDLE) + ; + LD HL,#C000 + LD DE,#4000 + LD C,Dss.Read + RST ToDSS + RET C ; ошибка при чтении + ; + PUSH DE + LD A,(FILE_HANDLE) + LD C,Dss.Close + RST ToDSS + POP DE ; длина считанных данных + RET ; ошибка при закрытии или Ok +FILE_HANDLE: DB 0 ; !FIXIT перенести + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +FIRST_PREPARE: LD A,CNF_PORT.CNF_0 + OUT (SYS_PORT.RAM),A + ; restore HOLD port + LD D,CMOS_CELL.ScreenPosition + LD C,BIOS.CMOS_RD + RST ToBIOS + JR C,.next + LD B,A + LD A,ACEX.HOLD + LD C,BIOS.SET_PORTS + RST ToBIOS + ; +.next: LD A,high ZXKeys.Line_7 + IN A,(ZXKeys) + AND #1F + CP #1E + RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +EXIT_TO_DSS: DI + LD SP,stack_point + + CALL FIRST_PREPARE + JP Z,RESET_TO_ZX.cont + +.cont: ;LD A,(Spec_Page.page_0) + ;OUT (SLOT0),A + LD A,(Spec_Page.page_3) + OUT (SLOT3),A + + XOR A + LD BC,3*256+BIOS.SET_PAL_INIT ; SET IBM PAL + RST ToBIOS + + ;!TEST; [ ] 05/11/2023 очищать рамдиски при выходе + LD A,(PARAMS.RMD_Keep+2) + AND A + JR NZ,.next + ; очистка рамдисков + LD BC,256*SYS_PAGE.RAMD_KEYS.NUM + BIOS.FreeMemRMD +.loop: PUSH BC + LD A,B + DEC A + RST ToBIOS + POP BC + DJNZ .loop + ; +.next: ;!TEST; [ ] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD + LD BC,BIOS.SWAP_RAM_DRIVES.Sp2000 + RST ToBIOS + ; + + + ; LD A,Dss.SetVMod.txt80x32 ; OPEN_TXT + ; LD BC,0*256+Dss.SetVMod + ; RST ToDSS + ; + ; LD A,#20 + ; LD DE,0 + ; LD HL,#2050 + ; LD BC,7*256+Dss.Clear + ; RST ToDSS + +BACKTXT: ; +.VMODE+1: LD A,#00 +.mode+2: LD BC,0*256+Dss.SetVMod + RST ToDSS + ; + LD A,(.VMODE) + CP %1000'0000 + JR NC,.EXIT + ; + LD IX,PlaceForTXTscreen +.WinMax+1: LD HL,#2050 + LD DE,#0000 + IN A,(SLOT2) + LD B,A + LD C,BIOS.WIN_RESTORE + XOR A + DI + RST ToBIOS + ; +.CURS+1: LD DE,#0000 + LD C,Dss.Locate + RST ToDSS +.EXIT: ; + ; LD BC,Dss.K_SETUP.ClearSIObuff + ; RST ToDSS + LD HL,MSG_ZX_EXIT + JP EXIT_ALL + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +PREPARE_TO_ZXMODE: + LD C,Dss.GetVMod + RST ToDSS + ; A - VMODE, B - SCREEN PAGE +SAVETXT: LD (BACKTXT.VMODE),A + EX AF,AF' + LD A,B + LD (BACKTXT.mode),A + EX AF,AF' + CP %1000'0000 + JR NC,.EXIT + SUB #02 + JR C,.EXIT + ; + PUSH AF + LD C,BIOS.LP_GET_PLACE + RST ToBIOS + LD (BACKTXT.CURS),DE + POP AF + LD IX,PlaceForTXTscreen + LD HL,#2050 + OR A + JR NZ,.next + LD L,#28 +.next: LD (BACKTXT.WinMax),HL + LD DE,#0000 + IN A,(SLOT2) + LD B,A + LD C,BIOS.WIN_COPY + XOR A + DI + RST ToBIOS +.EXIT: ; + +;!TEST; [ ] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD +SETUP_RAM_DRIVES: + LD BC,BIOS.SWAP_RAM_DRIVES.ZX + RST ToBIOS + ; запуск с файлом для рамдиска? + LD A,(Load_IMAGE_File.MEM_BLK) + OR A + JR Z,.skip + ; проверяем драйв перед переназначением + XOR A + LD C,BIOS.GET_RAMD_ST + RST ToBIOS + OR A + JR Z,.set_block + ; освободить рамдиск + XOR A + LD C,BIOS.FreeMemRMD + RST ToBIOS + ; set disk e: +.set_block: LD A,(Load_IMAGE_File.MEM_BLK) + LD B,A + XOR A + LD C,BIOS.BLK_TO_RAMD + RST ToBIOS +.skip: ; + ; ; +;!FIXIT переделать на функцию биоса +SET_RELOAD_PROG: + ; DI + ; LD A,Spec_Page + ; OUT (SLOT3),A + + ; LD A,"Z" + ; LD (#FFFE),A + ; LD A,"X" + ; LD (#FFFF),A + + ; LD A,(PARAMS.Ret_fn+2) + ; AND A + ; LD DE,RESET_TO_ZX ; адрес программы перезапуска для ret-zx + ; JR Z,.NO_RET_FN + ; LD DE,EXIT_TO_DSS ; адрес программы перезапуска для ret-fn + ; +.NO_RET_FN: ;LD (#FFF4),DE ; адрес программы возврата + ;IN A,(SLOT0) + ;LD (#FFF0),A ; DOS-PAGE + ;IN A,(SLOT1) + ;LD (#FFF1),A + ;IN A,(SLOT2) ; сохранить страницу + ;LD (#FFF2),A ; программы для возврата + ;LD A,(SAVE_SLOT3) + ;LD (#FFF3),A + ; LD B,A + ; LD A,(PARAMS.Ret_zx+2) + ; XOR B + ; JR Z,RESET_TO_ZX + ; ; + ; LD A,ACEX.Config_PG.Sp2000_SoftRestartSet + ; LD BC,BIOS.RST_CONF.CUSTOM + ; RST ToBIOS +;░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░; +RESET_TO_ZX: DI + LD SP,stack_point ; #BFF0 + + CALL FIRST_PREPARE + JP Z,EXIT_TO_DSS.cont + + ; [x] фикс неполной дешифрации порта #FFFD (пишут в #C0FD) +.cont: ; LD A,#FF + ; LD HL,%00'010'1'1110'1101 + ; LD DE,%10'111'1'1111'1111 ; CNF_0, CNF_1 + ; LD BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG + ; RST ToBIOS + ; + ; [x] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD + ; LD BC,BIOS.SWAP_RAM_DRIVES.ZX + ; RST ToBIOS + ; + ; LD A,(PARAMS.Ret_zx+2) + ; LD B,A + ; LD A,(PARAMS.Ret_fn+2) + ; XOR B + ; LD B,A + ; LD A,ACEX.RET_PORT + ; CALL SET_ROM ; включить возврат + + LD A,(PARAMS.Ret_fn+2) + AND A + LD DE,RESET_TO_ZX ; адрес программы перезапуска для ret-zx + JR Z,.NO_RET_FN + LD DE,EXIT_TO_DSS ; адрес программы перезапуска для ret-fn +.NO_RET_FN: LD B,A + LD A,(PARAMS.Ret_zx+2) + XOR B + JR Z,.NO_RST_HDL + ; + LD A,ACEX.Config_PG.Sp2000_SoftRestartSet + LD BC,BIOS.RST_CONF.CUSTOM + RST ToBIOS +.NO_RST_HDL: + + ; [ ] + LD A,SYS_PAGE + OUT (SLOT3),A +.DIR_SEC_L+1: LD HL,0 + LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL +.DIR_SEC_H+1: LD HL,0 + LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL +.CURRENT_DIR_DRIVE+1: + LD A,#FF + LD (SYS_PAGE.CURRENT_DIR_DRIVE),A + LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A + ;!TODO в BIOS? + LD BC,SP_SND.CBL.SYS_PORT + XOR A + OUT (C),A ; CBL-off + ; + ;[ ] 1/02/2024 режим спектрума работает с любыми каналами и основными разделами + CALL SET_CURRENT_HDD + ; + XOR A ; reg A' for GOTO_SPECTRUM + EX AF,AF' + ; + LD A,(PARAMS.LD_Pal+2) + INC A + JR NZ,Skip_Load_Palette + ; + LD HL,PlaceForPalette + 0 + LD A,4 + CALL SET_PAL + ; + LD HL,PlaceForPalette + 1024 + LD A,5 + CALL SET_PAL + ; + LD HL,PlaceForPalette + 2048 + LD A,6 + CALL SET_PAL + ; + LD HL,PlaceForPalette + 3072 + LD A,7 + CALL SET_PAL + ; + LD A,%0000'0100 ; set custom palette + EX AF,AF' +Skip_Load_Palette: + EX AF,AF' + LD HL,(PARAMS.Int_sc+2) + ADD A,L + LD HL,(PARAMS.Int_or+2) + OR L + LD HL,(PARAMS.Lines312+2) + ADD A,L + EX AF,AF' + ; port all mode + LD A,(PARAMS.Int_or+2) + AND A + LD B,#FA ; original waits on + JR NZ,Set_Next_Par + LD B,#FE +Set_Next_Par: ; SYS_PORT/CNF_PORT + XOR A + LD HL,(PARAMS.Turbo+2) + ADD A,L + LD HL,(PARAMS.Sprinter+2) + ADD A,L + LD HL,(PARAMS.P_7FFD+2) + ADD A,L + LD HL,(PARAMS.P_1FFD+2) + ADD A,L + LD HL,(PARAMS.Mem512+2) + ADD A,L + LD E,A + ; Start ROM + LD HL,(PARAMS.To_trd+2) + LD D,L + ; vROM & vRAM + LD HL,(ZX_vROM_BLK) + ; RESERVED + EX AF,AF' + ; + LD C,BIOS.GOTO_SPECTRUM + RST ToBIOS + ;!FIXIT сделать обработчик +.di_halt: DI + HALT + JR .di_halt +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +SET_PAL: LD DE,0 + LD BC,#FF*256 + BIOS.PIC_SET_PAL + JP ToBIOS +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +MAKE_FULL_NAME: LD HL,(CNF_NAME) + LD (.mode),HL + LD DE,ONE_FILE + LD C,Dss.GSwitch + RST ToDSS + ; + LD HL,ONE_FILE + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + ; + OR 2 + CP 3 ; only "FileName.ext"? + LD HL,(CNF_NAME) + JR Z,.get_app_path + RET + ; +.def_cnf: LD HL,CNF_FILE + LD (.mode),HL + ; +.get_app_path: LD HL,ONE_FILE + LD BC,Dss.AppInfo.EXE_HomeDir + RST ToDSS + ; + LD HL,ONE_FILE + LD BC,12 ;!HARDCODE filename length + XOR A + CPIR + DEC HL + EX DE,HL + ; +.mode+1: LD HL,0 + LD BC,12 ;!HARDCODE filename length + LDIR + XOR A + LD (DE),A + LD HL,ONE_FILE + RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +PARSE_CMD_LINE: LD HL,(LINE_X) + LD A,(HL) + AND A + JR Z,.NO_FILE + DEC A + JR Z,.NO_FILE + ; + INC HL + INC HL + CALL FIND_FILES + + CALL MAKE_FULL_NAME + LD A,SHARED_PAGE + CALL READ_FILE_1 + JR NC,.exit + ; +.NO_FILE: CALL MAKE_FULL_NAME.def_cnf + LD A,SHARED_PAGE + CALL READ_FILE_1 + JP C,ERROR_FILE + ; +.exit: LD (LEN_CNF),DE ; CNF файл прочитан, DE - длина CNF + RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + +FIND_FILES: PUSH HL + LD (X_FILE),HL + LD DE,0 + LD (IMAGE_FLAG),DE + LD (IMAGE_NAME),DE + LD (CNF_NAME),DE + LD B,A + JR .NO_NEXT + ; +.PARSING_LOOP: LD A,(HL) + INC HL + CP "." + CALL Z,.CHOOSE_FILE + CP " " + CALL Z,.BLANK_X + CP "\t" + CALL Z,.BLANK_X + CP "\n" + CALL Z,.BLANK_X1 + CP "\r" + CALL Z,.BLANK_X1 + JR Z,.END_NO_IMAGE +.NO_NEXT: DJNZ .PARSING_LOOP + ; +.END_NO_IMAGE: POP HL + LD A,(CNF_NAME+1) + AND A + RET NZ + LD A,(IMAGE_NAME+1) + AND A + LD DE,(X_FILE) + JR Z,.CNF_ALL + LD DE,CNF_FILE +.CNF_ALL: LD (CNF_NAME),DE + RET + ; +.BLANK_X: LD (X_FILE),HL ; найден пробел, имя файла - снова +.BLANK_X1: DEC HL + LD (HL),0 + INC HL + RET + ; ; +.CHOOSE_FILE: LD A,(HL) + AND %1101'1111 + ; TRD file + CP 'T' + JR Z,.TRD + ; SCL file + CP 'S' + JR Z,.SCL + ; ZX file + CP 'Z' + JR NZ,.unknown + ; +.CNF: LD DE,(X_FILE) + LD (CNF_NAME),DE +.unknown: DEC HL + LD A,(HL) + INC HL + RET + ; +.SCL: LD DE,IMAGE_FLAG + LD A,1 + LD (DE),A +.TRD: LD DE,(X_FILE) + LD (IMAGE_NAME),DE + JR .unknown +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +READ_CNF_FILE: LD HL,#C000 + LD DE,ADDRESS_LINES + LD C,CFG_FILE_LINES + ; +.LOOP_A: LD B,MAX_LINE_LENGTH ; длина строки + EX DE,HL + LD (HL),E + INC HL + LD (HL),D + INC HL + EX DE,HL + ; +.LOOP_L: LD A,(HL) + CP "\r" + JR Z,.N_LINE + CP "\n" + JR Z,.N_LINE + AND A + JP Z,END_CNF_ERROR + INC HL + DJNZ .LOOP_L + ; +.N_LINE: LD (HL),0 +.N_LINE2: INC HL + LD A,(HL) + CP "\r" + JR Z,.N_LINE2 + CP "\n" + JR Z,.N_LINE2 + DEC C + JR NZ,.LOOP_A + RET +; выделено 8 строк в CNF +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + MACRO vROM_LOAD romLine;,pageNumber +.RomLine = (romLine-1)*2 + LD DE,(ADDRESS_LINES+.RomLine) + CALL vROM_LOAD_BIN + ENDM +; +LOAD_vROM_BIN: LD A,#FF + LD (vROM_LOAD_BIN.need_free),A + ; + EXX + LD HL,BUFFER_vROM_PAGES.Pages + EXX + LD HL,BUFFER_RAM_PAGES + vROM_LOAD CFG_FILE_LINES.BASIC128 ;, #42 2-я строка - имя файла BASIC128 + vROM_LOAD CFG_FILE_LINES.BASIC_48 ;, #43 3-я строка - имя файла BASIC 48 + vROM_LOAD CFG_FILE_LINES.TRDOS ;, #44 4-я строка - имя файла TR-DOS + vROM_LOAD CFG_FILE_LINES.ZXEXP ;, #45 5-я строка - имя файла EXPANSION + vROM_LOAD CFG_FILE_LINES.ZXBIOS1 ;, #46 6-я строка - имя файла BIOS + vROM_LOAD CFG_FILE_LINES.ZXBIOS2 ;, #47 7-я строка - имя файла BIOS2 + vROM_LOAD CFG_FILE_LINES.BASIC128_2 ;, ??? 8-я строка - имя файла + vROM_LOAD CFG_FILE_LINES.BASIC_48_2 ;, ??? 9-я строка - имя файла + vROM_LOAD CFG_FILE_LINES.TRDOS_2 ;, ??? 10-я строка - имя файла + vROM_LOAD CFG_FILE_LINES.ZXEXP_2 ;, ??? 11-я строка - имя файла + LD HL,BUFFER_vROM_PAGES + LD A,(ZX_vROM_BLK) + LD (HL),A + LD BC,BIOS.ZX_MEMORY_MANAGER.SetCustomVroms + RST ToBIOS + ;!TODO check error + XOR A + LD (vROM_LOAD_BIN.need_free),A + RET + ; +vROM_LOAD_BIN: EX DE,HL + LD A,(HL) + CP ';' + EX DE,HL + JR Z,.skip_load + ; +.go_load: LD A,(HL) ;BUFFER_RAM_PAGES.ROM + EXX + LD (HL),A + ;INC HL + PUSH HL + EXX + PUSH HL + EX DE,HL + CALL READ_FILE_1 ; A - RAM page + POP HL + ; LD A,(HL) + INC HL + ; + EXX + POP HL + ; LD (HL),A + EXX + ; + LD A,SHARED_PAGE + OUT (SLOT3),A + JP C,ERROR_FILE + ; +.skip_load: EXX + INC HL + EXX + RET + ; +.need_free: DB 0 +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +LOAD_IMAGE_FILE: + LD HL,(IMAGE_NAME) + LD A,H + OR L + RET Z + ; + LD C,SLOT3 + IN B,(C) + PUSH BC + ; + CALL READ_IMAGE + ; + POP BC + OUT (C),B + RET NC + JP ERROR_FILE +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +;!TEST palette load +LOADING_PALETTE: + LD A,(PARAMS.LD_Pal+2) + INC A + RET NZ + ; + LD HL,( ADDRESS_LINES + ((CFG_FILE_LINES.PALETTE-1)*2) ) + LD A,(HL) + CP ';' + RET Z + ; + LD DE,ONE_FILE + LD BC,FULL_FILE_NAME_LENGTH + LDIR + LD HL,ONE_FILE + ; + LD A,Dss.Open.R + LD C,Dss.Open + RST ToDSS + JP C,ERROR_FILE ; ошибка, если нет файла + LD (FILE_HANDLE),A + ; + LD HL,PlaceForPalette + LD DE,1024*4 ;!HARDCODE + LD C,Dss.Read + RST ToDSS + JP C,ERROR_FILE ; ошибка при чтении + ;!TEST протестить DSS на этом. Если файл 4096 и читать 4096, то в A будет #FF + ;OR A + ;JP NZ,ERROR_FILE + ; + LD A,(FILE_HANDLE) + LD C,Dss.Close + JP ToDSS +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +SHOW_MESSAGE_ZXMODE: + LD HL,MSG_MODE + LD C,Dss.PChars + RST ToDSS + ; + LD HL,(ADDRESS_LINES + (CFG_FILE_LINES.NAME-1)*2) + LD C,Dss.PChars + RST ToDSS + LD HL,CR_LINE + LD C,Dss.PChars + RST ToDSS + RET +SHOW_MESSAGE_OK_CFG_NAME: + ; файлы считаны + LD HL,MSG_NORMAL + LD C,Dss.PChars + RST ToDSS + ; + ; LD HL,(ADDRESS_LINES + (CFG_FILE_LINES.NAME-1)*2) + ; LD C,Dss.PChars + ; RST ToDSS + ; ; + ; LD HL,CR_LINE + ; LD C,Dss.PChars + ; RST ToDSS + LD A,(SAVE_SLOT3) + OUT (SLOT3),A + RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +PARSE_PARAMETERS:; parameters parsing + LD A,SHARED_PAGE + OUT (SLOT3),A + LD HL,(ADDRESS_LINES + (CFG_FILE_LINES.OPTIONS-1)*2 ) ; строка параметров +.LOOP_1: LD A,(HL) + CP '/' + JR Z,.PARAM_TEST + OR A ; CP 0 + ;JR Z,INIT_vROM_PAGES + RET Z + CP "\r" + ;JR Z,INIT_vROM_PAGES + RET Z + CP "\n" + ;JR Z,INIT_vROM_PAGES + RET Z + INC HL + JR .LOOP_1 + ; +.PARAM_TEST: INC HL + PUSH HL + LD IX,PARAMS +.NEXT_PAR: LD E,(IX) + LD D,(IX+1) +.LOOP_2: LD A,(DE) + CP (HL) + JR NZ,.PARAM_E1 + INC HL + INC DE + JR .LOOP_2 +.PARAM_E1: CP #FF + JR NZ,.NO_PAR + LD A,(HL) + CP " " + JR Z,.PARAM_E2 + CP 0 + JR Z,.PARAM_E2 + CP "\r" + JR Z,.PARAM_E2 +.NO_PAR: POP HL + PUSH HL + INC IX + INC IX + INC IX + INC IX + LD A,(IX+1) + AND A + JR NZ,.NEXT_PAR + POP HL + JR .LOOP_1 + ; +.PARAM_E2: EX (SP),HL ; новое HL - сохраняется! + LD A,(IX+3) + LD (IX+2),A ; parameter alternate! + LD L,(IX) + LD H,(IX+1) + LD C,Dss.PChars + RST ToDSS + ; + POP HL + JR .LOOP_1 +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + +;----------------[Выделение/освобождение страниц спектрума]-------------; +;вход: рег B: +; FN 0x +; 0 - зарезервировано +; 1 - выделение памяти Pentagon 48k. 3 страницы +; 2 - выделение памяти Pentagon 128k. 2+6 страницы +; 3 - выделение памяти Pentagon 512k. 2+30 страницы +; 4 - выделение памяти Scorpion 256k. 2+6+8 страницы +; 5..15 - зарезервированы +; FN 1x +; 16 - получить рамблоки инициализированных vROM и VRAM +; 17..31 - зарезервированы +; FN 2x ;!TODO +; 32 - зарезервировано +; 33 - выделение памяти Spectrum 48k и инит 1-й страниц vROM +; 34 - выделение памяти Pentagon 128k и инит 3-х страниц vROM +; 35 - выделение памяти Pentagon 512k и инит 3-х страниц vROM +; 36 - выделение памяти Scorpion 256k и инит 3-х страниц vROM +; 33..63 - зарезервированы +; FN 4x +; 64 - освободить рамблоки vROM и vRAM +; 65..127 - зарезервированы +; FN 8x +; 128 - инициализировать свой набор страниц vROM +; +; рег HL: при рег B[7]=1 адрес страниц (11 шт): +; byte1 - RAM block ID, byte2..11 - страницы для vROM - ZXSlot: 1,2,3(=0),расширенная +; рег A: номер ZX TASK пока что всегда ноль!!! +;выход: CF = 0: HL - номера рамблоков для режимов 0..16. H=vRAM, L=vROM +; CF = 1: A - номер ошибки +; +;если стэк находится в третьем слоте, то вызов с выключенными прерываниями +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +GET_vRAM_PAGES: CALL .check_params + LD C,BIOS.ZX_MEMORY_MANAGER + RST ToBIOS + RET C + LD (ZX_vRAM_BLK),A + RET + +.check_params: XOR A + LD HL,PARAMS.P_7FFD + 2 + LD DE,4 + LD B,3 +.loop: ADD A,(HL) + ADD HL,DE + DJNZ .loop + ; + LD B,high BIOS.ZX_MEMORY_MANAGER.GetMem.Pent512 + CP #80 + RET NC + ; + LD B,high BIOS.ZX_MEMORY_MANAGER.GetMem.Pent48 + CP #70 + RET NC + ; + LD B,high BIOS.ZX_MEMORY_MANAGER.GetMem.Pent128 + CP #40 + RET NC + ; + LD B,high BIOS.ZX_MEMORY_MANAGER.GetMem.Scorp + RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +COUNT_vROM_PAGES: + LD BC,10*256 + 0 ;!HARDCODE всего страниц vROM 10, счётчик - 0 + LD HL,ADDRESS_LINES + CFG_FILE_LINES.BASIC128 - 1 + LD A,';' +.loop: INC HL + LD E,(HL) + INC HL + LD D,(HL) + ; + EX DE,HL + CP (HL) + EX DE,HL + JR Z,.next + INC C +.next: DJNZ .loop + LD A,C + LD (ZX_vROM_COUNT),A + SUB 1 ; если 0 - то не меняем набор + RET NC + ; CHECK_ZX_FLAG + LD BC,SLOT3 + IN B,(C) + LD A,Spec_Page + OUT (C),A + LD HL,(Spec_Page.flag_Z) + LD DE,'Z'+'X'*256 + ; + XOR A + SBC HL,DE + OUT (C),B + SCF ; ROM файлов 0, метка ZX есть + RET Z + JP ERROR_ZX_FLAG +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; MACRO vROM_set dcp_port +; LD A,dcp_port +; CALL SET_DCP_PORT +; ENDM +; ; +; INIT_vROM_PAGES: +; LD HL,BUFFER_RAM_PAGES.ROM +; vROM_set ACEX.vROM.BASIC_128 +; vROM_set ACEX.vROM.BASIC_48 +; vROM_set ACEX.vROM.TR_DOS +; vROM_set ACEX.vROM.ZX_EXPANSION +; vROM_set ACEX.vROM.ZX_BIOS_1 +; vROM_set ACEX.vROM.ZX_BIOS_2 +; vROM_set ACEX.vROM.BASIC_128_2 +; vROM_set ACEX.vROM.BASIC_48_2 +; vROM_set ACEX.vROM.TR_DOS_2 +; vROM_set ACEX.vROM.ZX_EXPANSION_2 + +; LD HL,(IMAGE_NAME) +; LD A,H +; OR L +; JP Z,.SKIP_IMAGE + +; LD C,SLOT3 +; IN B,(C) +; PUSH BC + +; CALL READ_IMAGE +; POP BC +; OUT (C),B +; JP C,ERROR_FILE +; ; +; .SKIP_IMAGE: LD A,(PARAMS.No_run+2) +; AND A +; RET NZ +; ; +; LD HL,MSG_EXIT1 +; LD BC,SLOT3 +; IN B,(C) +; LD A,Spec_Page +; OUT (C),A +; ; !FIXIT когда будет процедура в биосе переделать под неё +; LD A,"Z" +; LD (Spec_Page.flag_Z),A +; LD A,"X" +; LD (Spec_Page.flag_X),A +; ; +; OUT (C),B +; ; +; SCF +; RET +; ; +; SET_DCP_PORT: LD B,(HL) ; page +; INC HL +; INC B +; DEC B +; RET Z +; ; +; PUSH HL +; CALL SET_ROM +; POP HL +; RET +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + + + +; +;----------------------------------------------------------------------; + INCLUDE 'For_4X.asm' +;----------------------------------------------------------------------; +; + + +; +;----------------------------------------------------------------------; + IF NEW_MEMORY_LOGIC +BUFFER_RAM_PAGES: + BLOCK 10,#FF ; !HARDCODE количество портов эмулятора ПЗУ +.Size EQU $-BUFFER_RAM_PAGES +BUFFER_vROM_PAGES: +.BlockID: BYTE 0 +.Pages: BLOCK 10,#FF ; !HARDCODE количество портов эмулятора ПЗУ +.Size EQU $-BUFFER_RAM_PAGES + ELSE +BUFFER_RAM_PAGES: +.ROM: DB #42, #43, #44, #45, #46, #47 +;.RAM: BLOCK 16 ; 256 кб +.Size EQU $-BUFFER_RAM_PAGES +.end_marker: BYTE #FF + ENDIF +;----------------------------------------------------------------------; +; + + +;----------------------------------------------------------------------; +LINE_ZX: DZ 'ZX Spectrum PAGES' +LEN_LINE_ZX EQU $-LINE_ZX ;********************************************* -MSG_EXIT1: - db 13,10,"EXIT without run",13,10,0 -MSG_EXIT2: - db 13,10,"Выход без запуска" -CR_LINE: - db 13,10,0 +MSG_EXIT1: DB 13,10, "EXIT without run",13,10,0 +;MSG_EXIT2: DB 13,10, "Выход без запуска" +CR_LINE: DB 13,10,0 +START_MSG: DB 13,10, 'SPECTRUM launcher v',SP_VERSION,'. (c) Sprinter Team.' + DB 13,10,BUILD_DATE,' - ',__TIME__ + DB 13,10, 'Keys: ',0 +ERROR_FILE_MSG_X: DB 13,10, "Error in file: ",0 +;ERROR_FILE2_MSG_X: DB 13,10, "Ошибка в файле: ",0 +ERROR_FILE_MSG: DB 13,10, "Unable to work.",0 +;ERROR_FILE2_MSG: DB 13,10, "Работа невозможна.",0 +ERROR_CNF: DB 13,10, "Unexpected CNF file end.",0 +;ERROR_CNF2: DB 13,10, "Неожиданный конец CNF файла.",0 +NO_MEM_MSG: DB 13,10, "Not enough free memory pages for ZX mode." + DB 13,10, "Clear the memory and restart spectrum.exe again.",0 +;NO_MEM_MSG2: DB 13,10, "Специальные страницы уже заняты." +; DB 13,10, "Очистите память и перезапустите spectrum.exe снова.",0 +MSG_NORMAL: DB 13,10, "All files has been read successfully.\r\n",0 +;MSG_NORMAL2: DB 13,10, "Все файлы считаны нормально.\r\n\r\n",0 +MSG_MODE: DB "\r\nMODE: ",0 +; DB "Конфигурация: ",0 +MSG_NO_MEM: DB 13,10, "No memory space for image or",0 +;MSG_NO_MEM2: DB 13,10, "Не хватает памяти для образа или",0 +MSG_LOAD_IMAGE: DB 13,10, "Image loading: ",0 +;MSG_LOAD_IMAGE2: +; DB 13,10, "Загрузка образа: ",0 +MSG_ZX_EXIT: DB 13,10, "EXIT from Spectrum mode",13,10,0 +;MSG_ZX_EXIT2: DB 13,10, "EXIT from ZX mode",0 +MSG_NO_ZX_FLAG: DB 13,10, 'Error: Necessary ROM images are missing in the CNF file and in RAM!!!' + DB 13,10, ' Run "spectrum.exe norun.zx" with the required set of ZX ROMs.',13,10,0 +MSG_OLD_DSS: DB 13,10, 'To run this version of SPECTRUM launcher you need DSS v',NEED_MIN_DSS_VERSION,' or higher.',13,10,0 +PROGRES_IND: DB '░',0 ; 176 +PROGRES_100: DB ' 100%',13,10,0 -START_MSG: - db 13,10,'SPECTRUM launcher v',SP_VERSION,'.' - db 13,10,'(c) Sprinter Team.' - db 13,10,'Written by Ivan Mak.' - db 13,10,'Modified by Anatoliy Belyanskiy.' - db 13,10,BUILD_DATE,' - ', __TIME__, 13, 10, 0 - -ERROR_FILE_MSG_X: - db 13,10,"Error in file: ",0 -ERROR_FILE2_MSG_X: - db 13,10,"Ошибка в файле: ",0 -ERROR_FILE_MSG: - db 13,10,"Unable to work.",0 -ERROR_FILE2_MSG: - db 13,10,"Работа невозможна.",0 - -ERROR_CNF: - db 13,10,"Unexpected CNF file end.",0 -ERROR_CNF2: - db 13,10,"Неожиданный конец CNF файла.",0 - -NO_MEM_MSG: - db 13,10,"The spesial pages are already used." - db 13,10,"Clear memory and restart spectrum.exe again.",0 -NO_MEM_MSG2: - db 13,10,"Специальные страницы уже заняты." - db 13,10,"Очистите память и перезапустите spectrum.exe снова.",0 - -MSG_NORMAL: - db 13,10,"All files has been read successfully.",13,10 - db "MODE: ",0 -MSG_NORMAL2: - db 13,10,"Все файлы считаны нормально.",13,10 - db "Конфигурация: ",0 -MSG_NO_MEM: - db 13,10,"No memory space for image or",0 -MSG_NO_MEM2: - db 13,10,"Не хватает памяти для образа или",0 -MSG_LOAD_IMAGE: - db 13,10,"Image loading: ",0 -MSG_LOAD_IMAGE2: - db 13,10,"Загрузка образа: ",0 - -MSG_ZX_EXIT: - db 13,10,"EXIT from Spectrum configuration",0 -MSG_ZX_EXIT2: - db 13,10,"EXIT from ZX mode",0 - -PROGRES_IND: - db '░',0 ; 176 - -MEM_BLK: BYTE 0 +ZX_vROM_COUNT: BYTE 0 +ZX_vROM_BLK: BYTE 0 +ZX_vRAM_BLK: BYTE 0 +; LINE_X: WORD 0 X_FILE: WORD 0 CNF_NAME: WORD 0 -IMAGE_FLAG: BYTE 0 ; 0 - trd, scl - 1, sna - 2, tap - 3 +IMAGE_FLAG: BYTE 0 ; 0 - trd, scl - 1, sna - 2, tap - 3 IMAGE_NAME: WORD 0 -IMAGE_HANDLER: BYTE 0 +IMAGE_HANDLER: BYTE 0 SAVE_SLOT3: BYTE 0 LEN_CNF: WORD 0 -A_LINES: WORD 0,0,0,0,0,0,0,0 +ADDRESS_LINES: BLOCK CFG_FILE_LINES*2,0 ;********************************************* - -CONTINUE: ; CNF файл прочитан, DE - длина CNF - LD (LEN_CNF),DE - - LD HL,#C000 - LD DE,A_LINES - LD C,8 -LOOP_A: - LD B,120 ; строки не более 120 символов - EX DE,HL - LD (HL),E - INC HL - LD (HL),D - INC HL - EX DE,HL -LOOP_L: - LD A,(HL) - CP 13 - JR Z,N_LINE - CP 10 - JR Z,N_LINE - CP 0 - JP Z,END_CNF_ERROR - INC HL - DJNZ LOOP_L - -N_LINE: - LD (HL),0 - INC HL - LD A,(HL) - CP 13 - JR Z,N_LINE - CP 10 - JR Z,N_LINE - DEC C - JR NZ,LOOP_A - -; выделено 8 строк в CNF -;************************************* - - LD HL,(A_LINES+BASIC128_LINE) ; 2-я строка - имя файла BASIC128 - LD A,#42 - CALL READ_FILE_1 - LD A,Spec_Page - OUT (SLOT3),A - JP C,ERROR_FILE - - LD HL,(A_LINES+BASIC_48_LINE) ; 3-я строка - имя файла BASIC 48 - LD A,#43 - CALL READ_FILE_1 - LD A,Spec_Page - OUT (SLOT3),A - JP C,ERROR_FILE - - LD HL,(A_LINES+TRDOS_LINE) ; 4-я строка - имя файла TR-DOS - LD A,#44 - CALL READ_FILE_1 - LD A,Spec_Page - OUT (SLOT3),A - JP C,ERROR_FILE - - LD HL,(A_LINES+EXP_LINE) ; 5-я строка - имя файла EXPANSION - LD A,#45 - CALL READ_FILE_1 - LD A,Spec_Page - OUT (SLOT3),A - JP C,ERROR_FILE - - LD HL,(A_LINES+BIOS_LINE) ; 6-я строка - имя файла BIOS - LD A,#46 - CALL READ_FILE_1 - LD A,Spec_Page - OUT (SLOT3),A - JP C,ERROR_FILE - - LD HL,(A_LINES+BIOS2_LINE) ; 7-я строка - имя файла BIOS2 - LD A,#47 - CALL READ_FILE_1 - LD A,Spec_Page - OUT (SLOT3),A - JP C,ERROR_FILE - -; файлы считаны -;************************************* - - LD HL,MSG_NORMAL - LD C,Dss.PChars - RST ToDSS - - LD HL,(A_LINES+NAME_CFG_LINE) - LD C,Dss.PChars - RST ToDSS - - LD HL,CR_LINE - LD C,Dss.PChars - RST ToDSS - -; LD A,(SAVE_SLOT3) -; OUT (SLOT3),A - -;************************************* - - LD A,Spec_Page - OUT (SLOT3),A - LD HL,(A_LINES+OPTIONS_LINE) ; строка параметров - -LOOP_PAR1: - LD A,(HL) - CP "/" - JR Z,PARAM_TEST - CP 0 - JR Z,PARAM_END - CP 13 - JR Z,PARAM_END - CP 10 - JR Z,PARAM_END - INC HL - JR LOOP_PAR1 - -PARAM_TEST: - INC HL - PUSH HL - - LD IX,PARAMS -NEXT_PAR: - LD E,(IX) - LD D,(IX+1) - -LOOP_PAR2: - LD A,(DE) - CP (HL) - JR NZ,PARAM_E1 - INC HL - INC DE - JR LOOP_PAR2 - -PARAM_E1: - CP 255 - JR NZ,NO_PAR - LD A,(HL) - CP 20h - JR Z,PARAM_E2 - CP 0 - JR Z,PARAM_E2 - CP 13 - JR Z,PARAM_E2 -NO_PAR: - POP HL - PUSH HL - INC IX - INC IX - INC IX - INC IX - LD A,(IX+1) - AND A - JR NZ,NEXT_PAR - POP HL - JR LOOP_PAR1 - -PARAM_E2: - EX (SP),HL ; новое HL - сохраняется! - - LD A,(IX+3) - LD (IX+2),A ; parameter alternate! - - LD L,(IX) - LD H,(IX+1) - - LD C,Dss.PChars - RST ToDSS - - POP HL - JR LOOP_PAR1 - -;************************************ - -PARAM_END: - - LD A,#E2 ; ROM-ID - BASIC 128 - LD B,#42 ; page - CALL SET_ROM - - LD A,#E3 ; ROM-ID - BASIC 48 - LD B,#43 ; page - CALL SET_ROM - - LD A,#E1 ; ROM-ID - TR-DOS - LD B,#44 ; page - CALL SET_ROM - - LD A,#E0 ; ROM-ID - EXPANSION - LD B,#45 ; page - CALL SET_ROM - - LD A,#EB ; ROM-ID - BIOS-1 - LD B,#46 ; page - CALL SET_ROM - - LD A,#EF ; ROM-ID - BIOS-2 - LD B,#47 ; page - CALL SET_ROM - - LD HL,(IMAGE_NAME) - LD A,H - OR L - JP Z,SKIP_IMAGE - - LD C,SLOT3 - IN B,(C) - PUSH BC - - CALL READ_IMAGE - POP BC - OUT (C),B - JP C,ERROR_FILE - -SKIP_IMAGE: - LD A,(No_run_+2) - AND A - LD HL,MSG_EXIT1 - JP Z,EXIT_ALL - - JP SET_RELOAD_PROG - -; LD HL,MSG_NORMAL -; JP EXIT_ALL - -;*************************************************** - -; JP 0 - -;******************************************** - -SET_ROM: - ; out B - old ROM-page - DI - -; PUSH BC -; PUSH AF - -; LD A,CNF_0 -; OUT (SYS_PORT.ON),A -; LD A,10h -; LD BC,7FFDh -; OUT (C),A - -; POP AF -; POP BC - -; LD C,0F8h -; CALL 3D13h - -; PUSH BC -; PUSH AF - -; LD A,0 -; LD BC,7FFDh -; OUT (C),A -; LD A,CNF_0 -; OUT (SYS_PORT.OFF),A +;----------------------------------------------------------------------; ; -; POP AF -; POP BC -; RET - EX AF,AF' - IN A,(SLOT3) - PUSH AF - - LD A,DCP_PAGE ; установить новую - OUT (SLOT3),A - - LD A,(#C400) ; сохранить то что было - LD L,A - LD A,(#C600) - LD H,A - - EX AF,AF' ; страница - - LD (#C400),A ; установить порт ROM - LD (#C600),A - EX AF,AF' - - LD A,B - LD BC,0 - EX AF,AF' - IN A,(C) - EX AF,AF' - OUT (C),A ; установить новый ROM - EX AF,AF' - LD B,A - - LD A,L - LD (#C400),A ; вернуть порт - LD A,H - LD (#C600),A ; вернуть порт - - POP AF - OUT (SLOT3),A - - RET - -;******************************************** -READ_IMAGE: - LD DE,ONE_FILE - LD BC,128 - LDIR - LD HL,ONE_FILE - - LD A,1 - LD C,Dss.Open - RST ToDSS - RET C - - LD (IMAGE_HANDLER),A - - ld a,(IMAGE_FLAG) - and a - jr z,.Load_TRD - - CP 1 ; check if SCL - jp z,Load_SCL -; jp Error_Flag ;!!!!!!!!!!!!!!!! - -.Load_TRD: - LD A,(IMAGE_HANDLER) - LD C,Dss.Move_FP - LD B,2 - LD HL,0 - LD IX,0 - RST ToDSS ; найти длину файла - RET C - - PUSH IX - POP DE - -;--------------[new_code]--------------- - call Get_RAM_Disk_E - ret c - - jp Load_IMAGE_File -;--------------------------------------- -Get_RAM_Disk_E: -; hl:de - размер файла в байтах - LD A,D - ADD A,A - ADC HL,HL - ADD A,A - ADC HL,HL - - LD A,D - AND 3Fh - OR E - JR Z,.skip_inc - INC HL -.skip_inc: ; HL - длина файла в страницах - LD A,H - AND A - JR NZ,ERROR_NO_MEM - LD A,L - AND A - JR Z,ERROR_NO_MEM - PUSH AF -;*************************************** -; освободить ram-disk e: -.free_disk: - DI - LD A,0 - LD C,BIOS.EMM_FN3 - RST ToBIOS ; освободить e: -;!!!!!!!!!!!!!!!!!!!!!! ; назначать другой рамдрайв, свободный? -;*************************************** - POP AF - LD B,A ; запросить память у bios-а - LD A,0 - LD C,BIOS.EMM_FN2 ; и подсоединить к e: - RST ToBIOS - JR C,ERROR_NO_MEM - LD (MEM_BLK),A - -;--------------[new_code]--------------- - ret -;--------------------------------------- - -Load_IMAGE_File: - LD A,(IMAGE_HANDLER) - LD C,Dss.Move_FP - LD B,0 - LD HL,0 - LD IX,0 - RST ToDSS ; установить указатель на 0 - RET C - - LD HL,MSG_LOAD_IMAGE ; loading image - LD C,Dss.PChars - RST ToDSS - - LD A,(MEM_BLK) - -.load_loop: - PUSH AF - OUT (SLOT3),A - - LD A,(IMAGE_HANDLER) - LD HL,#C000 ; грузить 16k - LD DE,#4000 - LD C,Dss.Read - RST ToDSS - JR C,ERROR_IN_READ - - LD HL,PROGRES_IND ; loading progress - LD C,Dss.PChars - RST ToDSS - - DI - POP AF -.scl_read_next: - LD C,BIOS.GetMemPageNext - RST ToBIOS - - CP #FF - JR NZ,.load_loop - - LD HL,CR_LINE ; loading - LD C,Dss.PChars - RST ToDSS - - LD A,(IMAGE_HANDLER) - LD C,Dss.Close ; закрыть файл - RST ToDSS - - RET C -; ret - -Set_RAM_Dsk_EtoA: - DI - LD A,0 - LD B,0 - LD C,BIOS.RAMD_TO_DRV ; назначить e: на a: - RST ToBIOS - AND A - RET - -ERROR_IN_READ: - POP AF - JR ERROR_IMAGE_X - -ERROR_NO_MEM: - LD HL,MSG_NO_MEM - LD C,Dss.PChars - RST ToDSS -ERROR_IMAGE_X: - LD A,(IMAGE_HANDLER) - LD C,Dss.Close ; закрыть файл - RST ToDSS - SCF - RET - -SAV_PG3X: db 0 -;******************************************** -READ_FILE_1: - LD DE,ONE_FILE - LD BC,128 - LDIR - LD HL,ONE_FILE - OUT (SLOT3),A - -READ_FILE: - - LD A,1 - LD C,Dss.Open - RST ToDSS - RET C ; ошибка, если нет файла - - LD (FILE_HANDLE),A - LD A,(FILE_HANDLE) - - LD HL,0C000h - LD DE,4000h - LD C,Dss.Read - RST ToDSS - RET C ; ошибка при чтении - - PUSH DE - - LD A,(FILE_HANDLE) - LD C,Dss.Close - RST ToDSS - - POP DE ; длина считанных данных - RET ; ошибка при закрытии или Ok - -FILE_HANDLE: db 0 - -;******************************************** -;******************************************** - -EXIT_TO_DSS: - DI - LD SP,#BFF0 - LD A,CNF_0 - OUT (SYS_PORT.OFF),A - - ld a,(#FFF0) - out (SLOT0),a - - LD B,3 ; IBM_PAL - LD A,0 - LD C,#A6 ; SET_standard_PAL - RST ToBIOS - - LD A,3 ; OPEN_TXT - LD B,0 - LD C,#50 - RST ToDSS - - LD C,#56 ; CLS - LD DE,0 - LD HL,#2050 - LD B,7 - LD A,#20 - RST ToDSS - - LD HL,MSG_ZX_EXIT - JP EXIT_ALL - -SET_RELOAD_PROG: - DI - - LD A,Spec_Page - OUT (SLOT3),A - - LD A,"Z" - LD (#FFFE),A - LD A,"X" - LD (#FFFF),A - - LD A,(Ret_fn_+2) - AND A - LD DE,RESET_TO_ZX ; адрес программы перезапуска для ret-zx - JR Z,NO_RET_FN - LD DE,EXIT_TO_DSS ; адрес программы перезапуска для ret-fn - -NO_RET_FN: - LD (#FFF4),DE ; адрес программы возврата - IN A,(SLOT0) - LD (#FFF0),A ; DOS-PAGE - IN A,(SLOT1) - LD (#FFF1),A ; - IN A,(SLOT2) ; сохранить страницу - LD (#FFF2),A ; программы для возврата - IN A,(SLOT3) - LD (#FFF3),A ; - -;******************************************** - -RESET_TO_ZX: - DI - LD SP,#BFF0 - - ld a,high ZXKeys.Line_7 - in a,(ZXKeys) - and #1F - cp #1E - jr z,EXIT_TO_DSS - - LD A,CNF_0 - OUT (SYS_PORT.ON),A ; System-page on & CNF = 0 - -;-------------[TEST ATARIN]------------- -; #c0fd - +#05ED -; фикс неполной дешифрации порта #FFFD (пишут в #C0FD) -; [x] добавлен порт #C0FD во все карты портов - - ld bc,SLOT3 - in b,(c) - - ld a,DCP_PAGE - out (c),a - -; !HARDCODE далее всё наскоряк и захардкожено -; !TODO переделать под новую функцию дешифрации - ld a,#90 ; AY-8910-port (FFFD) - ld hl,#C000 + #05ED ; CNF 0 - ld (hl),a - - ld h,#c0 + #15 ; CNF 1 - ld (hl),a - - ld h,#c0 + #25 ; CNF 2 - ld (hl),a - - ld h,#c0 + #35 ; CNF 3 - ld (hl),a - - out (c),b -;--------------------------------------- - - LD A,(Ret_zx_+2) - LD B,A - LD A,(Ret_fn_+2) - XOR B - LD B,A - LD A,Conf_port.RET_PORT - CALL SET_ROM ; включить возврат - - LD A,CNF_3 - OUT (SYS_PORT.ON),A ; System-page on & CNF = 3 - - XOR A - OUT (BorderColor),A ; border-0 - OUT (RGADR),A ; Screen-page = 0 - OUT (RGMOD),A ; Screen-mode-page = 0 - LD BC,1FFDh - OUT (C),A ; Scorpion-port = 0 - LD BC,7FFDh - OUT (C),A ; pentagon-port = 0 - - LD A,(Int_or_+2) - AND A - LD A,#FA ; original waits on - JR NZ,ORIG1 - LD A,#FE -ORIG1: - LD BC,Port_All_Mode - OUT (C),A ; ACC-Off - - LD BC,CBL.SYS_PORT - LD A,0 - OUT (C),A ; CBL-off - - LD A,#12 ; FDD-720 - LD C,BIOS.FN_TURBO - RST #18 - -;---------------[test!!!!!]------------- - LD C,BIOS.HDD_PART ; IDE-1/IDE-2 - LD A,0 ; --> IDE-1 - RST #18 -;--------------------------------------- - -;****************************** - XOR A ; Set ZX-Palette - LD B,2 - LD C,#A6 - RST 18h - - LD A,(Int_or_+2) - AND A ; 3 - JR NZ,Original - LD A,(Int_sc_+2) ; 1/2 -Original: - LD C,#F2 ; -> INT for Pentagon or Scorpion - RST #18 - - LD HL,#4000 ; clear ZX-Spectrum screen - LD DE,#4001 - LD BC,#1AFF - LD (HL),L - LDIR - - LD HL,#4104 ; Screen-1 - LD BC,#0480 - LD E,0 - RST #18 - - LD HL,#5104 ; Screen-2 - LD BC,#0480 - LD E,0 - RST #18 - - XOR A - OUT (RGADR),A - OUT (RGMOD),A -;************************************************ -; Инициализация страниц - - DI - LD A,0 - OUT (SLOT0),A - LD A,5 - OUT (SLOT1),A - - XOR A - LD BC,#1FFD - OUT (C),A ; #1FFD - LD B,#7F -LOOP_P1: - OUT (C),A ; #7FFD - OUT (SLOT3),A - INC A - CP 8 - JR NZ,LOOP_P1 - - LD B,#1F - LD A,#10 - OUT (C),A ; #1FFD - LD A,8 - LD B,#7F -LOOP_P2: - OUT (C),A ; #7FFD - OUT (SLOT3),A - INC A - CP 16 - JR NZ,LOOP_P2 - XOR A - OUT (C),A ; #7FFD - LD B,#1F - OUT (C),A ; #1FFD - -; Все RAM, кроме BANK2 - в ней программа! -;*********************************************** - - LD HL,PROG_STARTS - LD BC,PROG_STARTS.Length - LD DE,#FF00 ;!!!!!!!!!! - LDIR - - LD A,(Line312_+2) - OUT (Port_VSYNC),A - - LD A,(P_7FFD_+2) ; - Pentagon off - LD BC,#7FFD - OUT (C),A - - LD A,(Turbo__+2) ; 3 - turbo - - LD HL,(Sprint_+2) ; +04h - Sprinter-ZX - ADD A,L ; +0Ch - Scorpion/Pentagon - - LD HL,(P_1FFD_+2) ; +40h - Scorpion port off - ADD A,L - - LD HL,(Mem512_+2) ; +80h - Pentagon-512 on - ADD A,L - - LD E,A - LD A,(To_trd_+2) - LD D,A -; - JP #FF00 ;!!!!!!!!!! - -;*************************************** -PROG_STARTS: - LD A,2 - OUT (SLOT2),A - LD A,E - OUT (SYS_PORT.OFF),A ; System-port - LD A,D - AND A - JP Z,0 - LD A,#10 - LD BC,#7FFD - OUT (C),A - LD HL,0 - PUSH HL - JP #3D29 ; RESET to TR-DOS - -.Length EQU $-PROG_STARTS - ASSERT PROG_STARTS.Length < #100, 'PROG_STARTS too big!!!' -; -; ; Если параметр задан, то выбирается значение Y -PARAMS:; Y / N ; тут значения для ключей записываются как 16 бит значение, значит обратный порядок байтов -Turbo__: dw Turbo_, #0302 ; включить TURBO -Line312_ dw Lines312, #6141 ; включить 312 строк -Sprint_: dw Sprint, #040C ; включить Sprinter -P_7FFD_: dw P_7FFD, #0030 ; включить 7FFD -P_1FFD_: dw P_1FFD, #0040 ; включить 1FFD -Mem512_: dw Mem512, #8000 ; включить 512k -To_trd_: dw To_trd, #0100 ; вoйти в TR-DOS -Int_sc_: dw Int_sc, #0102 ; включить INT "по-скорпионовски" -No_run_: dw no_run, #00FF ; не запускать -Int_or_: dw Int_or, #0300 ; включить INT "Original" -Ret_zx_: dw Ret_zx, #4100 ; включить возврат в ZX страница (#41) должна совпадать с ret_fn_ -Ret_fn_: dw Ret_fn, #4100 ; включить возврат в FN страница (#41) должна совпадать с ret_zx_ - dw 0,0 ; end marker - -Turbo_: db "turbo", 255,0 -Lines312: db "lines312", 255,0 -Sprint: db "sprinter", 255,0 -P_7FFD: db "7FFD", 255,0 -P_1FFD: db "1FFD", 255,0 -Mem512: db "mem512", 255,0 -Int_sc: db "int-sc", 255,0 -To_trd: db "to-trdos", 255,0 -no_run: db "no-run", 255,0 -Int_or: db "origin", 255,0 -Ret_zx: db "ret-zx", 255,0 -Ret_fn: db "ret-fn", 255,0 +PARAMS:; Y / N ; тут значения для ключей записываются как 16 бит значение, значит обратный порядок байтов +.Turbo: DW ._Turbo, #0302 ; включить TURBO +.Lines312 DW ._Lines312, #8000 ; включить 312 строк +.Sprinter: DW ._Sprinter, #040C ; включить Sprinter +.P_7FFD: DW ._P_7FFD, #0030 ; включить 7FFD ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ +.P_1FFD: DW ._P_1FFD, #0040 ; включить 1FFD ░░не менять порядок, используется в GET_vRAM_PAGES░░ +.Mem512: DW ._Mem512, #8000 ; включить 512k ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ +.To_trd: DW ._To_trd, #0200 ; вoйти в TR-DOS +.Int_sc: DW ._Int_sc, #0102 ; включить INT "по-скорпионовски" +.Int_or: DW ._Int_or, #0300 ; включить INT "Original" +.No_run: DW ._no_run, #00FF ; не запускать +.Ret_zx: DW ._Ret_zx, #4100 ; включить возврат в ZX страница (#41) должна совпадать с ret_fn_ +.Ret_fn: DW ._Ret_fn, #4100 ; включить возврат в FN страница (#41) должна совпадать с ret_zx_ +.LD_Pal: DW ._LD_Pal, #FF00 +.RMD_Keep: DW ._RMD_Keep, #FF00 ; [x] 05/11/2023 очищать рамдиски при выходе + DW 0,0 ; end marker +; +._Turbo: DB "turbo", 255,0 +._Lines312: DB "lines312", 255,0 +._Sprinter: DB "sprinter", 255,0 +._P_7FFD: DB "7FFD", 255,0 +._P_1FFD: DB "1FFD", 255,0 +._Mem512: DB "mem512", 255,0 +._Int_sc: DB "int-sc", 255,0 +._To_trd: DB "to-trdos", 255,0 +._no_run: DB "no-run", 255,0 +._Int_or: DB "origin", 255,0 +._Ret_zx: DB "ret-zx", 255,0 +._Ret_fn: DB "ret-fn", 255,0 +._LD_Pal: DB "load-pal", 255,0 +._RMD_Keep: DB "RMD-Keep", 255,0 ;!TEST; [ ] 05/11/2023 очищать рамдиски при выходе ;ZX_PROG_LEN EQU $-RELOAD_PROG ;/Turbo /Lines312 /Sprinter /7FFD /1FFD /Mem512 /Int-Sc /To-TRDOS /no-run /origin /ret-zx /ret-fn -CNF_FILE: db "SPECTRUM.CFG",0 -ONE_FILE: ds 128 +CNF_FILE: DB "SPECTRUM.CFG",0 +.Size EQU $-CNF_FILE ; ; +;[]-----------------------------[PLUGINS]-----------------------------[] + INCLUDE 'trdscl.a80' ; -; - IFDEF NEED_LOADER -Loader_length EQU $-BEGIN - ELSE -Loader_length EQU 0 - ENDIF ;----------------------------------------------[End Loader section] ; - STACK_CHECK_MACRO stack_point, stack_buffer +;!TODO + ;USER_CURRENT_DRV DB 'Z:' + ;USER_CURRENT_DIR EQU $ + ;SPECTRUM_HOME_DIR EQU USER_CURRENT_DIR + 256 +; +;---------------------------------------------------------------------[] +ONE_FILE: WORD 0 +.Size EQU 256 +TMP_BUFF EQU ONE_FILE + ONE_FILE.Size +.Size EQU 256 +SCL_Buffer EQU TMP_BUFF + TMP_BUFF.Size +.Size EQU #701 +; +PlaceForPalette EQU SCL_Buffer + SCL_Buffer.Size +.Size EQU 1024*4 +PlaceForTXTscreen EQU PlaceForPalette + PlaceForPalette.Size + + ASSERT $<#A000,"Buffer out of mem bank 2" + + STACK_CHECK_MACRO stack_point,stack_buffer ; Code after Loader -;[]-----------------------------[PLUGINS]-----------------------------[] - - INCLUDE 'trdscl.a80' - ;[]-------------------------------------------------------------------[] ; Code end section -; OUTEND -; SAVEBIN 'Build/test.bin', exe_header, $-exe_header ; \ No newline at end of file diff --git a/trdscl.a80 b/trdscl.a80 index 3556fc7..667fb12 100644 --- a/trdscl.a80 +++ b/trdscl.a80 @@ -19,38 +19,36 @@ ; ║ #F5 │ 8 │ Hазвание диcкеты ║ ; ║ #FD │ 3 │ Hе иcпользуетcя (заполнено байтом 0) ║ ; ╚═══════════════╧═══════╧═══════════════════════════════════════════╝ - STRUCT SEEK + STRUCT SEEK FirstFreeSec BYTE 0 FirstFreeTrk BYTE 1 -DiskType BYTE #16 -AllFilesNum BYTE 0 -FreeSectors WORD 0 ; beta version -TRDOS_ID BYTE #10 -notuse1 WORD 0 -notuse2 BLOCK 9,32 -notuse3 BYTE 0 -DelFilesNum BYTE 0 -DiskName TEXT 8, {" "} ; beta version - ENDS +DiskType BYTE #16 +AllFilesNum BYTE 0 +FreeSectors WORD 0 ; beta version +TRDOS_ID BYTE #10 +notuse1 WORD 0 +notuse2 BLOCK 9,32 +notuse3 BYTE 0 +DelFilesNum BYTE 0 +DiskName TEXT 8,{" "} ; beta version + ENDS -/* -SYS_SECTOR: - DB 0 - BLOCK 224,0 -.FirstFreeSec: DB 0 -.FirstFreeTrk: DB 1 -.DiskType DB #16 ; #16 = 80-2, #17 = 40-2, #18 = 80-1, #19 = 40-1 -.AllFilesNum: DB 0 -.FreeSectors: DW 2544 - DB #10 - DW 0000 - BLOCK 9,32 - DB 0 -.DelFilesNum: DB 0 -.DiskName: BLOCK 8,32 - BLOCK 3,0 +; SYS_SECTOR: +; DB 0 +; BLOCK 224,0 +; .FirstFreeSec: DB 0 +; .FirstFreeTrk: DB 1 +; .DiskType DB #16 ; #16 = 80-2, #17 = 40-2, #18 = 80-1, #19 = 40-1 +; .AllFilesNum: DB 0 +; .FreeSectors: DW 2544 +; DB #10 +; DW 0000 +; BLOCK 9,32 +; DB 0 +; .DelFilesNum: DB 0 +; .DiskName: BLOCK 8,32 +; BLOCK 3,0 ; -*/ ; ╔═════════╤═════╤═════════════════════╗ ; ║Cмещение │Длина│ Hазначение ║ @@ -64,273 +62,264 @@ SYS_SECTOR: ; ║ #0E │ 1 │ Hомеp 1го cектоpа ║ ; ║ #0F │ 1 │ Hомеp доpожки ║ ; ╚═════════╧═════╧═════════════════════╝ -/* -CAT_ELEMENT: -.Name BLOCK 8,32 -.Type DB 0 -.Start DW 0000 -.Length DW 0000 -.Sectors DB 0 -.FirstSector DB 0 -.FirstTrack DB 0 -*/ - STRUCT CAT_Elements -Name block 8 -Type BYTE -Start WORD -Length WORD -Sectors BYTE -FirstSector BYTE -FirstTrack BYTE - ENDS +; CAT_ELEMENT: +; .Name BLOCK 8,32 +; .Type DB 0 +; .Start DW 0000 +; .Length DW 0000 +; .Sectors DB 0 +; .FirstSector DB 0 +; .FirstTrack DB 0 - STRUCT SclOffsets -ID BLOCK 8 -Files BYTE -FileBlock CAT_Elements - ENDS + STRUCT CAT_Elements +Name BLOCK 8 +Type BYTE +Start WORD +Length WORD +Sectors BYTE +FirstSector BYTE +FirstTrack BYTE + ENDS + + STRUCT SclOffsets +ID BLOCK 8 +Files BYTE +FileBlock CAT_Elements + ENDS ; 655360 kb = 160 tracks * 16 sectors * 256 bites ; 80 tracks * 2 heads * 16 sectors * 256 bites = 655360 kb ; Page = 64 sectors = 4 tracks ;-----------[] -Load_SCL: -;-------[Метка диска - имя файла]------- - ld hl,ONE_FILE - ld de,SCL_Buffer - ld bc,#0300+Dss.EX_Path - rst ToDSS - jr c,.skip - ld hl,SCL_Buffer - ld a,'.' - ld bc,0008 - ld de,SYS_SECTOR.DiskName +;-------[Метка диска - имя файла]------- +Load_SCL: LD HL,ONE_FILE + LD DE,SCL_Buffer + LD BC,#0300+Dss.EX_Path + RST ToDSS + JR C,.skip + + LD HL,SCL_Buffer + LD A,'.' + LD BC,0008 + LD DE,SYS_SECTOR.DiskName .loop: - cp (hl) - jr z,.skip - ldi - jp pe,.loop + CP (HL) + JR Z,.skip + LDI + JP PE,.loop .skip: ;-------[проверка хедэра SINCLAIR]------ - ld a,(IMAGE_HANDLER) - ld hl,SCL_Buffer - ld de,8 - ld c,Dss.Read - rst ToDSS - ret c ; обработчик ошибки + LD A,(IMAGE_HANDLER) + LD HL,SCL_Buffer + LD DE,8 ; байтов + LD C,Dss.Read + RST ToDSS + RET C ; обработчик ошибки - ld hl,SCL_Buffer - ld de,SCL_HEADER - ld b,8 -.check_header: - ld a,(de) - cp (hl) - jr nz,.error_header - inc hl - inc de - djnz .check_header - jr .get_size -.error_header: - scf - ret + LD HL,SCL_Buffer + LD DE,SCL_HEADER + LD B,8 +.check_header: LD A,(DE) + CP (HL) + JR NZ,.error_header + INC HL + INC DE + DJNZ .check_header + JR .get_size +.error_header: SCF + RET ;------[вычисление размера для TRD]----- .get_size: -/* ld a,(IMAGE_HANDLER) - ld hl,0 - ld ix,SclOffsets.Files - ld b,l - ld c,Dss.Move_FP - rst ToDSS ; указатель на байт количества блоков (файлов) - ret c ; обработчик ошибки!!!!! -;*/ - ld a,(IMAGE_HANDLER) - ld hl,SCL_Buffer - ld de,#701 - ld c,Dss.Read - rst ToDSS ; !FIXIT сделать контроль ошибки? ; читаем байт количества блоков (файлов) + ; LD A,(IMAGE_HANDLER) + ; LD HL,0 + ; LD IX,SclOffsets.Files + ; LD B,L + ; LD C,Dss.Move_FP + ; RST ToDSS ; указатель на байт количества блоков (файлов) + ; RET C ; обработчик ошибки!!!!! + + LD A,(IMAGE_HANDLER) + LD HL,SCL_Buffer + LD DE,#701 + LD C,Dss.Read + RST ToDSS ; !FIXIT сделать контроль ошибки? ; читаем байт количества блоков (файлов) ; - ld a,(SCL_Buffer) - ld l,a - xor a - ld h,a + LD A,(SCL_Buffer) + LD L,A + XOR A + LD H,A ; - add hl,hl ;*2 - push hl - add hl,hl ;*4 - ld d,h - ld e,l - add hl,hl ;*8 - add hl,de ;*12 - pop de - add hl,de ; в HL значение A*14 + ADD HL,HL ;*2 + PUSH HL + ADD HL,HL ;*4 + LD D,H + LD E,L + ADD HL,HL ;*8 + ADD HL,DE ;*12 + POP DE + ADD HL,DE ; в HL значение A*14 - add hl,bc + ADD HL,BC - ld de,SclOffsets.FileBlock - add hl,de ; в HL размер от начала SCL до начала блока данных (header_length) - push hl + LD DE,SclOffsets.FileBlock + ADD HL,DE ; в HL размер от начала SCL до начала блока данных (header_length) + PUSH HL ; - ld a,(IMAGE_HANDLER) - ld hl,0 - ld ix,4 ; игнорим контрольную сумму scl файла - ld b,2 - ld c,Dss.Move_FP - rst ToDSS ; указатель на конец файла - jr nc,1F ; обработчик ошибки!!!!! + LD A,(IMAGE_HANDLER) + LD HL,0 + LD IX,4 ; игнорим контрольную сумму scl файла + LD B,2 + LD C,Dss.Move_FP + RST ToDSS ; указатель на конец файла + JR NC,1F ;!FIXIT обработчик ошибки!!!!! - pop hl - ret + POP HL + RET -1: push ix - pop de ; значение младших 16 бит размера файла - ex (sp),hl ; значение header_length в HL, старшая часть размера файла на стеке - ex de,hl ; в HL значение младших 16 бит размера файла, в DE - header_length +1: PUSH IX + POP DE ; значение младших 16 бит размера файла + EX (SP),HL ; значение header_length в HL, старшая часть размера файла на стеке + EX DE,HL ; в HL значение младших 16 бит размера файла, в DE - header_length - sbc hl,de - ld de,0 - ex (sp),hl ; младшая часть размера файла на стеке - sbc hl,de ; в HL старшая часть размера файла + SBC HL,DE + LD DE,0 + EX (SP),HL ; младшая часть размера файла на стеке + SBC HL,DE ; в HL старшая часть размера файла - ex (sp),hl ; старшая часть размера файла на стеке - ld de,#1000 - add hl,de + EX (SP),HL ; старшая часть размера файла на стеке + LD DE,#1000 + ADD HL,DE - ex (sp),hl ; младшая часть размера файла на стеке - ld de,0 - adc hl,de - pop de ; тут в hl:de размер для trd + EX (SP),HL ; младшая часть размера файла на стеке + LD DE,0 + ADC HL,DE + POP DE ; тут в hl:de размер для trd ;--------------------------------------- - - call Get_RAM_Disk_E - ret c ; обработчик ошибки!!!!! + CALL Get_RAM_Disk_E + RET C ;!FIXIT обработчик ошибки!!!!! Convert_SCLtoTRD: + LD A,(Load_IMAGE_File.MEM_BLK) + OUT (SLOT3),A ; вставляем первую страницу RAM-диска - LD A,(MEM_BLK) - out (SLOT3),a ; вставляем первую страницу RAM-диска + LD HL,SCL_Buffer + LD B,(HL) ; CAT_Elements + INC HL + LD DE,#C000 ; RAM-drive's track 0 + LD IX,SYS_SECTOR + LD (ix+SEEK.AllFilesNum),B +.cat_loop: PUSH BC + LD A,(HL) + CP 1 + JR NZ,1F ; this file is not deleted + INC (ix+SEEK.DelFilesNum) +1: LD BC,CAT_Elements-2 ; ld bc,#0D + LDIR ; copy 14 bites of scl files table to trd image catalog - ld hl,SCL_Buffer - ld b,(hl) ; CAT_Elements - inc hl - ld de,#C000 ; RAM-drive's track 0 - ld ix,SYS_SECTOR - ld (ix+SEEK.AllFilesNum),b -.cat_loop: - push bc - ld a,(hl) - CP 1 - jr nz,1F ; this file is not deleted - inc (ix+SEEK.DelFilesNum) -1: ld bc,CAT_Elements-2 ; ld bc,#0D - ldir ; copy 14 bites of scl files table to trd image catalog + LD A,(SYS_SECTOR.FirstFreeSec) + LD (DE),A + LD C,A ;!---[v 1] + INC DE + LD A,(SYS_SECTOR.FirstFreeTrk) + LD (DE),A + INC DE ; Pointer on next filename in RAM drive - ld a,(SYS_SECTOR.FirstFreeSec) - ld (de),a - ld c,a ;!---[v 1] - inc de - ld a,(SYS_SECTOR.FirstFreeTrk) - ld (de),a - inc de ; Pointer on next filename in RAM drive + DEC HL ; set to number of sectors + LD A,(HL) ; get file length in sectors from scl-table + AND #0F + ADD A,C ;!---[^ 1] + LD C,A ;!---[v 2] + AND #0F + LD (SYS_SECTOR.FirstFreeSec),A + LD A,#F0 + AND C ;!---[^ 2] + JR Z,1F + INC (ix+SEEK.FirstFreeTrk) +1: LD A,(HL) + SRL A + SRL A + SRL A + SRL A + ADD A,(ix+SEEK.FirstFreeTrk) + LD (SYS_SECTOR.FirstFreeTrk),A - dec hl ; set to number of sectors - ld a,(hl) ; get file length in sectors from scl-table - and #0F - add a,c ;!---[^ 1] - ld c,a ;!---[v 2] - and #0F - ld (SYS_SECTOR.FirstFreeSec),a - ld a,#F0 - and c ;!---[^ 2] - jr z,1F - inc (ix+SEEK.FirstFreeTrk) -1: ld a,(hl) - srl a - srl a - srl a - srl a - add a,(ix+SEEK.FirstFreeTrk) - ld (SYS_SECTOR.FirstFreeTrk),a - - inc hl ; Pointer on next filename in SCL_Buffer - pop bc - djnz .cat_loop + INC HL ; Pointer on next filename in SCL_Buffer + POP BC + DJNZ .cat_loop - xor a - ld (de),a ; file table end marker + XOR A + LD (DE),A ; file table end marker ;--------------------------------------- -; Доделать!!!!! +;!TODO Доделать!!!!! ; SYS_SECTOR.FreeSectors ; push hl ; байт в буфере откуда в SCL начинаются данные (HL-SCL_Buffer) ; push de ; байт в ram диске trd где заканчивается таблица последнего файла - xor a - ld de,SCL_Buffer-8 ; вычисляем значение смещения в файле из значения смещения в буфере - sbc hl,de - push hl - pop ix + XOR A + LD DE,SCL_Buffer-8 ; вычисляем значение смещения в файле из значения смещения в буфере + SBC HL,DE + PUSH HL + POP IX - ld a,(IMAGE_HANDLER) - ld hl,0 - ld B,L ; b=0 - от начала файла - ld c,Dss.Move_FP - rst ToDSS ; указатель на первый байт данных - jr nc,1F ; обработчик ошибки!!!!! - - pop de - ret + LD A,(IMAGE_HANDLER) + LD HL,0 + LD B,L ; b=0 - от начала файла + LD C,Dss.Move_FP + RST ToDSS ; указатель на первый байт данных + JR NC,1F ; обработчик ошибки!!!!! -1: di - ld hl,SYS_SECTOR_START - ld de,#C800 ; sys sector of tr-dos disk in bank3 of ram-disk - ACC_SetBlockSize - ld a,0 - ACC_CopyBlock - ld a,(HL) - ld (DE),a - ACC_Off -; ei + POP DE + RET - LD A,(IMAGE_HANDLER) - LD HL,#D000 ; догрузить до конца страницы - LD DE,#3000 - LD C,Dss.Read - RST ToDSS - JP C,ERROR_IN_READ ; обработчик ошибки!!!!! +1: DI + LD HL,SYS_SECTOR_START + LD DE,#C800 ; sys sector of tr-dos disk in bank3 of ram-disk + ACC_SetBlockSize + LD A,0 + ACC_CopyBlock + LD A,(HL) + LD (DE),A + ACC_Off + ;EI - LD HL,MSG_LOAD_IMAGE ; loading image - LD C,Dss.PChars - RST ToDSS + LD A,(IMAGE_HANDLER) + LD HL,#D000 ; догрузить до конца страницы + LD DE,#3000 + LD C,Dss.Read + RST ToDSS + JP C,ERROR_IN_READ ;!FIXIT обработчик ошибки!!!!! - LD HL,PROGRES_IND ; loading TRD - LD C,Dss.PChars - RST ToDSS + LD HL,MSG_LOAD_IMAGE ; loading image + LD C,Dss.PChars + RST ToDSS - DI - LD A,(MEM_BLK) - jp Load_IMAGE_File.scl_read_next + LD HL,PROGRES_IND ; loading TRD + LD C,Dss.PChars + RST ToDSS + + DI + LD A,(Load_IMAGE_File.MEM_BLK) + JP Load_IMAGE_File.scl_read_next ;-----------[] -SCL_HEADER: DB 'SINCLAIR' +SCL_HEADER: DB 'SINCLAIR' ;------------[переменные]--------------- SYS_SECTOR_START: - DB 0 - BLOCK 224,0 -SYS_SECTOR SEEK + DB 0 + BLOCK 224,0 +SYS_SECTOR SEEK SYS_SECTOR_END: BLOCK 3,0 SCL_FILE_ID: DB 0 -;-----------[в самый конец]------------- -SCL_Buffer EQU $ - assert SCL_Buffer+#701 < #C000, "Buffer out of mem bank 2" - - - +; ;-----------[в самый конец]------------- +; SCL_Buffer EQU $ +; ASSERT SCL_Buffer+#701<#A000,"Buffer out of mem bank 2" \ No newline at end of file diff --git a/version.inc b/version.inc index fc36338..c1c80ef 100644 --- a/version.inc +++ b/version.inc @@ -4,5 +4,11 @@ sj.insert_define("BUILD_DATE", "'" .. date .. "." .. month .. "." .. year .. "'") ENDLUA - DEFINE SP_VERSION "2.01 beta build" + DEFINE SP_VERSION "2.03 beta build" +; + DEFINE NEED_MIN_DSS_VERSION '1.71.36' +DSS_MIN_VERS: +.vers EQU 1 +.modf EQU 71 +.build EQU 36 ; \ No newline at end of file