From 8210691bd80eaeca9acb0fa11076ee30425e6563 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 2 Aug 2024 02:52:29 +1000 Subject: [PATCH] BIOS starts, DSS loads --- Crazy BIOS/BUILD.a80 | 18 +- Crazy BIOS/exp/EXP.asm | 72 ++-- Crazy BIOS/rom/SETUP/MAIN.asm | 316 ++++++++++-------- Crazy BIOS/shared/CompMacro.asm | 156 ++------- Crazy BIOS/shared/DEFINES.INC | 2 +- Crazy BIOS/shared/cb_boot.IMG | Bin 0 -> 98304 bytes Crazy Estex DSS/BOOT/DSSBOOT.ASM | 6 +- Crazy Estex DSS/DSS/DRV-MAIN.ASM | 14 +- Crazy Estex DSS/DSS/DSS-MAIN.ASM | 4 +- Crazy Estex DSS/DSS/VERSION.INC | 2 +- Crazy Updater/constants/BIOS_EXP.inc | 4 +- Crazy/ACEX_RAM.ASM | 258 ++++++-------- Crazy/{BUILD_BIOS.a80 => BUILD_ACEX_BIOS.a80} | 0 Crazy/debug.asm | 18 + CrazyBlaster.asm | 14 +- 15 files changed, 404 insertions(+), 480 deletions(-) create mode 100755 Crazy BIOS/shared/cb_boot.IMG rename Crazy/{BUILD_BIOS.a80 => BUILD_ACEX_BIOS.a80} (100%) create mode 100644 Crazy/debug.asm diff --git a/Crazy BIOS/BUILD.a80 b/Crazy BIOS/BUILD.a80 index 0917a1d..0875bcb 100644 --- a/Crazy BIOS/BUILD.a80 +++ b/Crazy BIOS/BUILD.a80 @@ -1,6 +1,7 @@ - INCLUDE 'shared/defines.inc' + INCLUDE 'shared/defines.inc' + INCLUDE 'Crazy BIOS/shared/CompMacro.asm' - DEFINE IMG_RECOVERY 'crazy bios/shared/cb_sys.img' + DEFINE IMG_RECOVERY 'crazy bios/shared/cb_boot.img' ; ;[--------------------------------------------------------------------------] MACRO Set_Block text, blk_addr @@ -11,9 +12,13 @@ ;[--------------------------------------------------------------------------] ORG 0 DISPLAY '[ Building CB_IMG file ]' - OUTPUT 'Build/CB_BIOS.RAW' + OUTPUT 'Build/CB_BIOS.IMG' ;[--------------------------------------------------------------------------] +; Zero Sector + SET_IMG_LABEL + BLOCK 512 - $,#FF ; + ORG 0 ;PAGE #46 BIOS INCBIN 'Build/Bin/EXP.BIN' Set_Block 'EXP free space: ', #4000 @@ -30,7 +35,12 @@ ;PAGE #4B LOGO INCBIN 'Build/Bin/LOGO.BIN' - Set_Block 'LOGO free space: ', #14000 + Set_Block 'LOGO free space: ', #14000 +;DEBUG + IF DEBUG + INCLUDE './crazy/debug.asm' + Set_Block 'LOGO free space: ', #14200 + ENDIF ;[--------------------------------------------------------------------------] OUTEND DISPLAY '[_____________Building CB_IMG file done!_____________]' diff --git a/Crazy BIOS/exp/EXP.asm b/Crazy BIOS/exp/EXP.asm index ee840cd..085d7aa 100644 --- a/Crazy BIOS/exp/EXP.asm +++ b/Crazy BIOS/exp/EXP.asm @@ -2,11 +2,26 @@ ; ;************************************************************* ; -; EXPANSION VER 3.00 (C) Peters Plus Ltd. -; EXPANSION VER 3.1 (C) Sprinter Team +; EXPANSION VER 3.00 (C) Peters Plus Ltd. +; EXPANSION VER > 3.04 (C) Sprinter Team ; ;************************************************************* +; DEBUG + MACRO FLASH_LIGHT + LD E,8 + LD A,SYS_PORT.TURBO.OFF +.big_loop: LD BC,0 + OUT (CNF_PORT.vBIOS),A +.loop: DEC BC + INC B + DJNZ .loop + XOR 1 + DEC E + JR NZ,.big_loop + ENDM + + ;*************************************** ;*********** BEGIN EXPANSION *********** ;*************************************** @@ -35,7 +50,7 @@ BOARD_INFO: EXP_FNS_2_RET: PUSH AF LD A,vROM.BIOS - OUT (CNF_PORT.vBIOS),A + OUT (CNF_PORT.vZX_ROM),A POP AF JR RST_18_1 ;======================================= @@ -109,21 +124,13 @@ TABLE_X: ; ;======================================= -RESTARTS EQU #FFE0 -GLOBAL_RESET: - DI - IM 1 - LD HL,RESTARTS - LD DE,RESTARTS_PROG - LD B,RESTARTS_PROG.Size -.compare: - LD A,(DE) - CP (HL) - JR NZ,NO_RESTART - INC HL - INC DE - DJNZ .compare - JP RESTARTS +;RESTARTS EQU #FFE0 +; GLOBAL_RESET: +; DI +; ; +; FLASH_LIGHT +; ; +; JR NO_RESTART ;======================================= _mInfoBLOCK #66-$,0 NMI_Point: @@ -142,7 +149,6 @@ NMI_Point: ; IN B,(C) ; CALL SET_ROM_PAGES+#C000 ; JP NO_SUMX_EQ - ;********************************** ;BEEP: @@ -209,7 +215,9 @@ BoardID: ; ;-----[перехват RESET не состоялся]----- -NO_RESTART: +GLOBAL_RESET: + DI + IM 1 ; стек ещё не используем!!! LD SP,IX ; сохранить значение переданное загрузчиком конфы (если старт после ресета) ; инициализация внутренних портов Z84C15 для POST-Tester-а @@ -534,6 +542,8 @@ POST_5_OK: ; ********************************** ENDMODULE + ;FLASH_LIGHT + MODULE SET_CONFIG_ID IN A,(SLOT3) @@ -544,6 +554,7 @@ POST_5_OK: LD A,SYS_PAGE OUT (SLOT3),A + ;-------------[Save IX:IY]-------------- ; Don't use IY before this point if it`s normal booting!!! LD IX,0 @@ -1001,23 +1012,6 @@ RES128_PROG: LEN_RES128 EQU $-RES128_PROG ;-----------------------------------------------------------------------; -;-------------------------------[ #FFE0 ]-------------------------------; -; программа, которая будучи размещенной в #40 странице, -; с адреса RESTARTS, перехватывает RESET -RESTARTS_PROG: ; !TODO LDConf перехват ресета на любой конфе после hardreset - LD HL,RESTARTS - LD B,16 -.loop: - LD (HL),0 - INC HL - DJNZ .loop - NOP - NOP -.Size EQU $-RESTARTS_PROG - ; LD A,1 - ; OUT (SLOT3),A -;-----------------------------------------------------------------------; - ;----------------------------[Setup Starter]----------------------------; MODULE Setup_Starter ; программа, размещаемая по адресу #C000 @@ -1359,11 +1353,11 @@ kbd_loop2: _mInfoALIGN 256,#FF ; BLOCK #3F00-$,#FF ROM_DISK.Pages.Number: - BYTE ROM_DISK.Pages.Size ; число страниц + DB ROM_DISK.Pages.Size ; число страниц ; у страниц выставлен bit4 для корректной подстановки ;(подробнее в sp2000.inc - Порт управления страницами ПЗУ) ROM_DISK.Pages: ; страницы ROM-Disk - ABYTE #10 #05,#06,#07,#09,#0A,#0B ; 98304 bytes + DB 0,#10 ; значения для 7FFD соответствуют страницам #48,#49 out (#24),1 : 1ffd = 0. .Size EQU $-ROM_DISK.Pages ;-----------------------------------------------------------------------; ;#######################################################################; diff --git a/Crazy BIOS/rom/SETUP/MAIN.asm b/Crazy BIOS/rom/SETUP/MAIN.asm index 3bedb02..711c6d4 100644 --- a/Crazy BIOS/rom/SETUP/MAIN.asm +++ b/Crazy BIOS/rom/SETUP/MAIN.asm @@ -667,12 +667,13 @@ INFO_MESSAGE: CALL TSETUP ;!TODO может пихнуть её на прерывания? CALL CONFIGURE_IDE_DRIVES.START - CALL CTRLKEY - LD A,B - ; [x] 05/07/2024 - BIT X_CTRL,A - LD BC,#FFFF ; маркер для PrepareToBOOT, чтоб грузил Recovery - JR NZ,RECOVERY_BOOT + ; CALL CTRLKEY + ; LD A,B + ; ; [x] 05/07/2024 + ; BIT X_CTRL,A + ; LD BC,#FFFF ; маркер для PrepareToBOOT, чтоб грузил Recovery + ; JR NZ,RECOVERY_BOOT + JR RECOVERY_BOOT ; BIT X_ALT,A JR NZ,ALT_BOOT @@ -689,16 +690,16 @@ RECOVERY_BOOT: ; CALL INT_ON ALT_BOOT: - LD A,msgStrings.bootAltDrv - LD E,COLORS.CGA.INC.LGREEN - CALL POSTMSC + ; LD A,msgStrings.bootAltDrv + ; LD E,COLORS.CGA.INC.LGREEN + ; CALL POSTMSC - LD BC,CMOS_CELL.BootDrives.Mask.AltSysDisk ;#7010 - CALL PrepareToBOOT - LD A,msgStrings.bootFail - LD E,COLORS.CGA.INC.LRED - CALL C,POSTMSC - CALL ScreenPOS.CRLF + ; LD BC,CMOS_CELL.BootDrives.Mask.AltSysDisk ;#7010 + ; CALL PrepareToBOOT + ; LD A,msgStrings.bootFail + ; LD E,COLORS.CGA.INC.LRED + ; CALL C,POSTMSC + ; CALL ScreenPOS.CRLF ;NO START DISK - RESTART / SETUP / ZX SPECTRUM mode LD BC,CMOS_CELL.Options.Mask.RebootMSG ;#021D @@ -864,11 +865,6 @@ RESCREEN: ;R06 RECOVERYstart: LD A,msgStrings.bootRecovery CALL POSTMSG - ; - - ; Выбор рамдиска для рекавери - _mRECOVERYrdChooseTYPE RECOVERYrdChooseTYPE - ; прибиваем последний рамдиск, если занят .killRAMdisk: LD A,SYS_PAGE.RAMD_KEYS.NUM-1 LD (.RDkey),A @@ -876,6 +872,7 @@ RECOVERYstart: JR NC,.setRAMdisk JR Z,.setRAMdisk RET ; непонятная ошибка - выходим + ; .setRAMdisk: LD A,(.RDkey) LD B,ROM_DISK.Pages.Size CALL EMM.GetMemRMD @@ -883,15 +880,69 @@ RECOVERYstart: DEC A JR Z,.FreeMem ; ошибка - недостаточно памяти, вызываем очистку памяти RET ; непонятная ошибка - выходим + ; .FreeMem: CALL EMM.FullInit JR .killRAMdisk ; ; Вход: A - RAM block ID -.IMGread: - ; Вариант копирования ROM -> RAM disk - _mRECOVERYmountTYPE RECOVERYmountTYPE -; +.IMGread: LD HL,TEMP + CALL EMM.GetMemBlkPages ; кидаем в буфер номера страниц RAM disk + + IN A,(SLOT3) + LD (.slot3save),A + ; + LD HL,ROM_DISK.Pages.Number + LD B,0 + LD C,(HL) + INC C + LD DE,TEMP+ROM_DISK.Pages.Size + LDIR ; кидаем дальше в буфер номера страниц ROM disk + ; + LD A,CNF_PORT.EXTENSION + OUT (CNF_PORT.vZX_ROM),A + LD BC,#1FFD + DEC A + OUT (C),A + ; + LD IY,TEMP+ROM_DISK.Pages.Size ; ROM_DISK.Pages.Number + LD IX,TEMP + LD B,(IY+0) + + LD A,R + PUSH AF + DI + ; +.loopIMGtoRAM: PUSH BC + INC IY + LD A,(IY+0) + LD BC,#7FFD + OUT (C),A + LD A,(IX+0) + OUT (SLOT3),A + INC IX + + LD HL,0 + LD DE,#C000 + LD BC,#4000 + LDIR + + POP BC + DJNZ .loopIMGtoRAM + ; + XOR A + LD BC,#7FFD + OUT (C),A + OUT (CNF_PORT.vBIOS),A + LD B,#1F + LD A,2 + OUT (C),A +.slot3save+*: LD A,0 + OUT (SLOT3),A + POP AF + JP PO,.noInterrupts + EI +.noInterrupts: ; ;Exit from "ROM Disk to RAM disk" procedure .RDkey+*: LD A,0 OR DRIVE_CODES.SPRINTER.RAM @@ -908,121 +959,122 @@ PrepareToBOOT: ;CALL INT_ON CALL INT_OFF ; тут не должно быть испорчено значение BC ; [x] 05/07/2024 - INC BC - LD A,B - OR C - JP Z,RECOVERYstart - DEC BC + ; INC BC + ; LD A,B + ; OR C + ; JP Z,RECOVERYstart + ; DEC BC ; - CALL G_VALUE - LD B,DRIVE_CODES.SPRINTER.FDD + ; CALL G_VALUE + ; LD B,DRIVE_CODES.SPRINTER.FDD ; FDD - OR A - JR Z,FDSTART ; FDD A: - INC B - DEC A - JR Z,FDSTART ; FDD B: - ; IDE - LD B,DRIVE_CODES.SPRINTER.HDD - DEC A - JR Z,HDSTART - INC B ;LD B,#81 - DEC A - JR Z,HDSTART - INC B ;LD B,#82 - DEC A - JR Z,HDSTART - INC B ;LD B,#83 - DEC A - JR Z,HDSTART - ; RAM - DEC A - JR Z,RDSTART - ; ROM - DEC A - JP Z,RECOVERYstart - ; Error - SCF - RET + ; OR A + ; JR Z,FDSTART ; FDD A: + ; INC B + ; DEC A + ; JR Z,FDSTART ; FDD B: + ; ; IDE + ; LD B,DRIVE_CODES.SPRINTER.HDD + ; DEC A + ; JR Z,HDSTART + ; INC B ;LD B,#81 + ; DEC A + ; JR Z,HDSTART + ; INC B ;LD B,#82 + ; DEC A + ; JR Z,HDSTART + ; INC B ;LD B,#83 + ; DEC A + ; JR Z,HDSTART + ; ; RAM + ; DEC A + ; JR Z,RDSTART + ; ; ROM + ; DEC A + ; JP Z,RECOVERYstart + ; ; Error + ; SCF + ; RET + JP RECOVERYstart -FDSTART: - PUSH BC - PUSH BC - LD A,msgStrings.bootFdd - CALL POSTMSG - POP AF - CALL FDD_5x_RESET - POP BC - RET C - JP OS_LOAD -;!TODO -CDSTART: - PUSH BC - LD A,msgStrings.bootCd - CALL POSTMSG - POP AF - PUSH AF - CALL PRINT_CHANEL - ; - POP BC - SET 6,B - SCF - RET +; FDSTART: +; PUSH BC +; PUSH BC +; LD A,msgStrings.bootFdd +; CALL POSTMSG +; POP AF +; CALL FDD_5x_RESET +; POP BC +; RET C +; JP OS_LOAD +; ;!TODO +; CDSTART: +; PUSH BC +; LD A,msgStrings.bootCd +; CALL POSTMSG +; POP AF +; PUSH AF +; CALL PRINT_CHANEL +; ; +; POP BC +; SET 6,B +; SCF +; RET -RDSTART: - LD A,msgStrings.bootRamDrv - CALL POSTMSG - LD B,DRIVE_CODES.SPRINTER.RAM ; 6 - тип драйва RAM-DRV, 0 - номер драйва -.loop: PUSH BC - CALL OS_LOAD - POP BC - INC B - LD A,DRIVE_CODES.SPRINTER.RAM + SYS_PAGE.RAMD_KEYS.NUM-1 ; максимальный номер рамдиска - SUB B - JR NC,.loop - RET +; RDSTART: +; LD A,msgStrings.bootRamDrv +; CALL POSTMSG +; LD B,DRIVE_CODES.SPRINTER.RAM ; 6 - тип драйва RAM-DRV, 0 - номер драйва +; .loop: PUSH BC +; CALL OS_LOAD +; POP BC +; INC B +; LD A,DRIVE_CODES.SPRINTER.RAM + SYS_PAGE.RAMD_KEYS.NUM-1 ; максимальный номер рамдиска +; SUB B +; JR NC,.loop +; RET -HDSTART: - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,B - ; - AND #03 ;R02 %00000011 - LD IY,IDE.INIT_TBL_IDE0 - JR Z,.next - ; - LD IY,IDE.INIT_TBL_IDE1 - CP 1 ;R02 - JR Z,.next - ; - LD IY,IDE.INIT_TBL_IDE2 ;R02 - CP 2 ;R02 - JR Z,.next - ; - LD IY,IDE.INIT_TBL_IDE3 ;R02 - ; -.next: LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - CP IDE.Device.CDROM - JP Z,CDSTART - PUSH AF - PUSH BC - LD A,msgStrings.bootHdd - CALL POSTMSG - POP AF - PUSH AF - CALL PRINT_CHANEL +; HDSTART: +; IN A,(SLOT3) +; EX AF,AF' +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD A,B +; ; +; AND #03 ;R02 %00000011 +; LD IY,IDE.INIT_TBL_IDE0 +; JR Z,.next +; ; +; LD IY,IDE.INIT_TBL_IDE1 +; CP 1 ;R02 +; JR Z,.next +; ; +; LD IY,IDE.INIT_TBL_IDE2 ;R02 +; CP 2 ;R02 +; JR Z,.next +; ; +; LD IY,IDE.INIT_TBL_IDE3 ;R02 +; ; +; .next: LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) +; EX AF,AF' +; OUT (SLOT3),A +; EX AF,AF' +; CP IDE.Device.CDROM +; JP Z,CDSTART +; PUSH AF +; PUSH BC +; LD A,msgStrings.bootHdd +; CALL POSTMSG +; POP AF +; PUSH AF +; CALL PRINT_CHANEL - POP BC - POP AF - CP #FF - SCF - RET Z +; POP BC +; POP AF +; CP #FF +; SCF +; RET Z OS_LOAD: LD HL,#0000 LD IX,#0001 diff --git a/Crazy BIOS/shared/CompMacro.asm b/Crazy BIOS/shared/CompMacro.asm index c6f4e49..f0b3ead 100644 --- a/Crazy BIOS/shared/CompMacro.asm +++ b/Crazy BIOS/shared/CompMacro.asm @@ -1,26 +1,29 @@ ; MACRO ShowInfo text, in_disp -/* - DISPLAY ' ' - DISPLAY '[*] ', text - IF in_disp - DISPLAY 'ROM:' - DISPLAY ' ORG: ',/H, $$$ - DISPLAY ' PAGE: ',/H, $$$$ - DISPLAY 'MEM:' - DISPLAY ' DISP: ',/H, $ - DISPLAY ' PAGE: ',/H, $$ - ELSE - DISPLAY 'ROM:' - DISPLAY ' ORG: ',/H, $ - DISPLAY ' PAGE: ',/H, $$ - ENDIF - DISPLAY '[X]' - DISPLAY ' ' -*/ + ; DISPLAY ' ' + ; DISPLAY '[*] ', text + ; IF in_disp + ; DISPLAY 'ROM:' + ; DISPLAY ' ORG: ',/H, $$$ + ; DISPLAY ' PAGE: ',/H, $$$$ + ; DISPLAY 'MEM:' + ; DISPLAY ' DISP: ',/H, $ + ; DISPLAY ' PAGE: ',/H, $$ + ; ELSE + ; DISPLAY 'ROM:' + ; DISPLAY ' ORG: ',/H, $ + ; DISPLAY ' PAGE: ',/H, $$ + ; ENDIF + ; DISPLAY '[X]' + ; DISPLAY ' ' ENDM ; + MACRO SET_IMG_LABEL +.Crazy_IMG_Label: DB "Crazy Blaster Image" + ENDM + + ; ; Вход: ширина спрайта, высота, координата X, координата Y, адрес спрайта в памяти MACRO EasterTable width, height, Xcoord, Ycoord, addr @@ -32,123 +35,6 @@ ENDM ; -; - MACRO _mRECOVERYrdChooseTYPE vers - IF vers = 1 - ; если RECOVERY не подразумевает 90% безопасность пользовательских рамдисков - ; то выбираем этот вариант, он шустрее, под RECOVERY всегда выбирается RAM Disk 15 - ; - - ELSEIF vers = 2 - - ; Ищем свободный рамдиск - LD B,SYS_PAGE.RAMD_KEYS.NUM -.getRDidLoop: LD A,B - DEC A - LD (RECOVERYstart.RDkey),A - PUSH BC - LD B,ROM_DISK.Pages.Size - CALL EMM.GetMemRMD - POP BC - JR NC,RECOVERYstart.IMGread ; свободный рамдиск найден, выходим из цикла - DEC A - JR Z,RECOVERYstart.FreeMem ; ошибка - недостаточно памяти, вызываем очистку памяти - DJNZ .getRDidLoop - ; - - ELSE - ASSERT 0, Invalid 'RECOVERYrdChooseTYPE' variant - RECOVERYrdChooseTYPE - ENDIF - ENDM -; - MACRO _mRECOVERYmountTYPE vers - IF vers = 1 ; Более быстрый, но захардкоженный вариант - - LD HL,TEMP - CALL EMM.GetMemBlkPages ; кидаем в буфер номера страниц RAM disk - - IN A,(SLOT3) - LD (.slot3save),A - - LD HL,ROM_DISK.Pages.Number - LD B,0 - LD C,(HL) - INC C - LD DE,TEMP+ROM_DISK.Pages.Size - LDIR ; кидаем дальше в буфер номера страниц ROM disk - - LD IY,TEMP+ROM_DISK.Pages.Size ; ROM_DISK.Pages.Number - LD IX,TEMP - LD B,(IY+0) - - LD A,R - PUSH AF - DI -.loopIMGtoRAM: PUSH BC - INC IY - LD A,(IY+0) - OUT (ROM.SLOT0),A - LD A,(IX+0) - OUT (SLOT3),A - INC IX - - LD HL,0 - LD DE,#C000 - LD BC,#4000 - LDIR - - POP BC - DJNZ .loopIMGtoRAM -.slot3save+*: LD A,0 - OUT (SLOT3),A - XOR A - OUT (ROM.SLOT0),A - OUT (CNF_PORT.vBIOS),A - POP AF - JP PO,.noInterrupts - EI -.noInterrupts: - ; - - ELSEIF vers = 2 ; менее быстрый, но более правильный вариант через функции биоса - - LD (.ramdskID),A - LD DE,0 ; номер сектора - LD B,(ROM_DISK.Pages.Size * #4000)/512 ; счётчик - кол-ва секторов по 512 кб -.loop: - ;read rom disk - PUSH BC - LD A,1 ;размер сектора 256 - EX AF,AF' - LD A,#46 ;чтение из ROM-Disk - EX AF,AF' - LD HL,TEMP ;адрес буфера данных - LD B,2 ;число секторов - CALL BLK_RD_WR - - ;write to ram disk - PUSH DE ;номер сектора - DEC DE - DEC DE - -.ramdskID+*: LD A,0 ;идентификатор блока - EX AF,AF' - LD A,#FF ;запись в RAM-Disk - EX AF,AF' - LD HL,TEMP ;адрес буфера данных - LD B,2 ;число секторов - CALL BLK_RD_WR - - POP DE ;номер сектора - POP BC - DJNZ .loop - ; - - ELSE - ASSERT 0, Invalid 'RECOVERYmountTYPE' variant - RECOVERYmountTYPE - ENDIF - ENDM -; ; MACRO RST_to_BIOS diff --git a/Crazy BIOS/shared/DEFINES.INC b/Crazy BIOS/shared/DEFINES.INC index d384019..042582d 100644 --- a/Crazy BIOS/shared/DEFINES.INC +++ b/Crazy BIOS/shared/DEFINES.INC @@ -1,6 +1,7 @@ ;=======================[All shared EQUs]=======================; BETA_BUILD EQU 6 ; добавляет строку и сообщение о тестовой сборке на стартовом экране ;======================[All shared defines]=====================; + DEFINE DEBUG 0 ; DEFINE SP2000_Loader_Flag #0107 ; DEFINE IDE_Optimization 1 ; слегка оптимизирует некоторые процедуры работы с HDD DEFINE NeedSafePort_Y 1 ; если 0, то в режиме без акселя некоторые процедуры могут засрать экран @@ -15,7 +16,6 @@ BETA_BUILD EQU 6 ; ;----------------------------[ TEST ]---------------------------; DEFINE HDDwriteProtect 0 ; старая фишка для функций 5x DEFINE RECOVERYmountTYPE 1 ; 1 - быстрый немного захардкоженый вариант. 2 - более "правильный" - DEFINE RECOVERYrdChooseTYPE 1 ; 1 - RECOVERY грузится в диск 15, 2 - ищется свободный рамдиск, если нет, то в 15-ый DEFINE FDD_NormalCount 0 ; !TODO DEFINE UnusedSettingsFeatures 0 ; ;===============================================================; \ No newline at end of file diff --git a/Crazy BIOS/shared/cb_boot.IMG b/Crazy BIOS/shared/cb_boot.IMG new file mode 100755 index 0000000000000000000000000000000000000000..e1abbc198d16bbeeaa9a8c9aa538e06fe09cd576 GIT binary patch literal 98304 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 a|M%au(+t*Y5CVe`7=*we1pZ%#!2blf1S{$Q literal 0 HcmV?d00001 diff --git a/Crazy Estex DSS/BOOT/DSSBOOT.ASM b/Crazy Estex DSS/BOOT/DSSBOOT.ASM index 54c0231..b53604e 100644 --- a/Crazy Estex DSS/BOOT/DSSBOOT.ASM +++ b/Crazy Estex DSS/BOOT/DSSBOOT.ASM @@ -80,7 +80,7 @@ FAIL: CALL MESSAGE ; MESSAGE: ;R01 Start XOR A - OUT (SYS_PORT.ON),A + OUT (CNF_PORT.vBIOS),A .loop: LD A,(HL) ;R01 INC HL OR A @@ -211,7 +211,7 @@ CONTINUE: LD HL,0 .no_big_core: ; RUN_CORE: DI XOR A - OUT (SYS_PORT.OFF),A + OUT (CNF_PORT.vZX_ROM),A ; LD A,#10 LD BC,#7FFD @@ -236,7 +236,7 @@ RUN_CORE: DI CALL MESSAGE ; XOR A - OUT (SYS_PORT.OFF),A + OUT (CNF_PORT.vZX_ROM),A ; LD A,(DRIVE) LD BC,Dss.BootDSK.Set diff --git a/Crazy Estex DSS/DSS/DRV-MAIN.ASM b/Crazy Estex DSS/DSS/DRV-MAIN.ASM index 9a1091a..ecf6463 100644 --- a/Crazy Estex DSS/DSS/DRV-MAIN.ASM +++ b/Crazy Estex DSS/DSS/DRV-MAIN.ASM @@ -43,8 +43,8 @@ RST_00: ; <[BIOS API]> BLOCK 8-$,#C7 ; #C7 - "RST 0" opcode A0008: PUSH AF - LD A,SYS_PORT.PAGE8 - OUT (SYS_PORT.ON),A + LD A,CNF_PORT.BIOS + OUT (CNF_PORT.vBIOS),A POP AF RET //////////////////////////////////////////////////////////////////////// @@ -232,11 +232,11 @@ INITDVC_RET_DRIVE: AND A RET - INCLUDE 'dss/Drivers/media/shared-drv.asm' - INCLUDE 'dss/Drivers/media/ide-drv.asm' - INCLUDE 'dss/Drivers/media/fdd-drv.asm' - INCLUDE 'dss/Drivers/media/ram_disk-drv.asm' - INCLUDE "dss/Drivers/input/MOUSE.ASM" + INCLUDE 'crazy estex dss/dss/Drivers/media/shared-drv.asm' + INCLUDE 'crazy estex dss/dss/Drivers/media/ide-drv.asm' + INCLUDE 'crazy estex dss/dss/Drivers/media/fdd-drv.asm' + INCLUDE 'crazy estex dss/dss/Drivers/media/ram_disk-drv.asm' + INCLUDE "crazy estex dss/dss/Drivers/input/MOUSE.ASM" /////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\; ; ;------------------------[shared-drv.asm table]------------------------; diff --git a/Crazy Estex DSS/DSS/DSS-MAIN.ASM b/Crazy Estex DSS/DSS/DSS-MAIN.ASM index 6b2f37a..c28b3ba 100644 --- a/Crazy Estex DSS/DSS/DSS-MAIN.ASM +++ b/Crazy Estex DSS/DSS/DSS-MAIN.ASM @@ -72,8 +72,8 @@ RST_0x00: JP RETFAR ; ;EXECUTE.ASM R12 ; <[BIOS API]> ; _mInfoBLOCK 8-$,#FF ; RST_0x08: PUSH AF ; - LD A,SYS_PORT.PAGE8; - OUT (SYS_PORT.ON),A ; + LD A,CNF_PORT.BIOS ; + OUT (CNF_PORT.vBIOS),A ; POP AF ; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; diff --git a/Crazy Estex DSS/DSS/VERSION.INC b/Crazy Estex DSS/DSS/VERSION.INC index 984fa6c..20c467b 100644 --- a/Crazy Estex DSS/DSS/VERSION.INC +++ b/Crazy Estex DSS/DSS/VERSION.INC @@ -10,7 +10,7 @@ if sj.get_define("INCREASE_BUILD") > "0" then dss_build = increase_build("./DSS/build.txt") else - dss_build = get_build("./DSS/build.txt") + dss_build = get_build("./crazy estex dss/DSS/build.txt") end if dss_build > 999 then diff --git a/Crazy Updater/constants/BIOS_EXP.inc b/Crazy Updater/constants/BIOS_EXP.inc index df5bc29..5422f3b 100644 --- a/Crazy Updater/constants/BIOS_EXP.inc +++ b/Crazy Updater/constants/BIOS_EXP.inc @@ -8,6 +8,6 @@ EXP_ID.VER: EQU 0x00000003 EXP_ID.MOD: EQU 0x00000006 CNF_ID.VER: EQU 0x00000000 CNF_ID.MOD: EQU 0x00000000 -msgStrings.str_ACEX_MODEL: EQU 0x0000244B -msgRusStrings.str_ACEX_MODEL: EQU 0x00002E5B +msgStrings.str_ACEX_MODEL: EQU 0x0000234B +msgRusStrings.str_ACEX_MODEL: EQU 0x00002D5B BETA_BUILD: EQU 0x00000006 diff --git a/Crazy/ACEX_RAM.ASM b/Crazy/ACEX_RAM.ASM index e81bf36..41fa1b5 100644 --- a/Crazy/ACEX_RAM.ASM +++ b/Crazy/ACEX_RAM.ASM @@ -1,5 +1,6 @@ ;███████ инициализация системных портов Z84C15 ████████████████; DI + IM 1 LD BC,#FF*256 + Z84.SYS.Control XOR A ; Z84.REG.WaitState_Ctrl OUT (C),A ; Z84.SYS.Control @@ -14,7 +15,8 @@ LD A,1 ; enable CS0, disable CS1 OUT (C),A ; Z84.SYS.Data ;███████ инициализация DCP ████████████████████████████████████; - LD HL,ADD_PORTS.Code + ;LD HL,ADD_PORTS.Code + LD HL,INIT_PORTS DCP_INIT: LD C,XL LD B,XH LD E,YL @@ -111,15 +113,22 @@ ADD_PORTS: ; DB #E4 ; внешний #4004 .Data.Size EQU $ - .Data ; -.Code: LD HL,ADD_PORTS.Data - LD DE,#C480 - LD BC,ADD_PORTS.Data.Size - LDIR +.Code: ;LD DE,#C480 + ; LD HL,ADD_PORTS.Data + ; LD BC,ADD_PORTS.Data.Size + ; LDIR + ; + ;███████ Инициализация портов █████████████████████████████████; + ;LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON + CNF_PORT.PENT_RESET + CNF_PORT.SCORP_RESET + CNF_PORT.CNF_512 + ;OUT (SYS_PORT.ROM),A +INIT_PORTS: LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON + OUT (SYS_PORT.ROM),A ;███████ Инициализация страниц ████████████████████████████████; INIT_SLOTS: LD BC,#1FFD LD A,1 OUT (C),A LD B,#7F + ; LD A,#11 OUT (C),A ; XOR A @@ -127,11 +136,8 @@ INIT_SLOTS: LD BC,#1FFD OUT (SLOT1),A LD A,2 OUT (SLOT2),A - LD A,SYS_PAGE + LD A,DCP_PAGE OUT (SLOT3),A - ;███████ Инициализация портов █████████████████████████████████; - LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON - OUT (SYS_PORT.ROM),A ;███████ Инициализация стека ██████████████████████████████████; LD SP,#4000 ;███████ Переброс оставшегося кода в RAM ██████████████████████; @@ -149,18 +155,41 @@ INIT_SLOTS: LD BC,#1FFD ; ТУТ МЫ УЖЕ В ОЗУ В ТОМ ЖЕ КОДЕ И АДРЕСЕ ; страницы 0,1,2,#FE ;███████ Инициализация страниц vROM ███████████████████████████; -vROM_MAP: LD BC,#4000 - LD HL,RESERVED_PAGES.BIOS + LD HL,#C900 ; Opcodes RET : NOP + LD A,H + LD (DOS_OFF),A + LD (DOS_ON),HL +vROM_MAP: LD HL,RESERVED_PAGES.BIOS + LD DE,ADD_PORTS.Data LD A,RESERVED_PAGES.Size -.loop: LD E,(HL) - OUT (C),E - INC C +.loop: EX AF,AF' + LD A,(HL) + LD B,A + LD A,(DE) + CALL SET_PORTS INC HL + INC DE + EX AF,AF' DEC A JR NZ,.loop + ; + LD A,SYS_PAGE + OUT (SLOT3),A +; ;███████ Инициализация страниц vROM ███████████████████████████; +; vROM_MAP: LD BC,#4000 +; LD HL,RESERVED_PAGES.BIOS +; LD A,RESERVED_PAGES.Size +; .loop: LD E,(HL) +; OUT (C),E +; INC C +; INC HL +; DEC A +; JR NZ,.loop ;██████████████████████████████████████████████████████████████; ;███████ Рабочий код ██████████████████████████████████████████; ;██████████████████████████████████████████████████████████████; + LD A,SYS_PAGE + OUT (SLOT3),A ; адрес процедуры ошибки LD HL,ERROR PUSH HL @@ -170,16 +199,15 @@ vROM_MAP: LD BC,#4000 ;██████ Установка страниц для загрузки данных █████████████████; CALL Init_Mem ;██████ Загрузка ██████████████████████████████████████████████; - ; дополнительные функции -CHECK_IMG: ;LD A,(RESERVED_PAGES.SYS_FN) ; страница буфера, если адрес в окне #C000 (BLOCK_ID) - LD B,1 ; число читаемых секторов + ; проверка ID диска с BIOS (дополнительные функции) +CHECK_IMG: LD B,1 ; число читаемых секторов LD HL,#8000 ; адрес буфера данных LD IX,0 ; абсолютный номер сектора старшая часть LD DE,0 ; абсолютный номер сектора младшая часть PUSH HL CALL FN_HDD_READ POP HL - ;██████ ██████████████████████████████████████████████; + ; сравнение метки LD DE,CHECKING_LABEL LD B,CHECKING_LABEL.Size .loop: LD A,(DE) @@ -194,6 +222,17 @@ LOAD_DATA: LD A,(RESERVED_PAGES.BIOS) LD B,RESERVED_PAGES.Size * #4000 / 512 LD DE,1 CALL FN_HDD_READ_NEXT + RET C + ; + IF DEBUG + LD A,#41 + LD HL,#C000 + LD B,1 + LD D,L + LD E,B + CALL FN_HDD_READ_NEXT + RET C + ENDIF XOR A OUT (SLOT1),A JP .IN_RAM + #4000 @@ -202,11 +241,13 @@ LOAD_DATA: LD A,(RESERVED_PAGES.BIOS) XOR A OUT (C),A ; - XOR A ;CNF_PORT.BIOS + ; A = CNF_PORT.BIOS OUT (CNF_PORT.vBIOS),A - LD A,#40 + LD A,DCP_PAGE OUT (SLOT3),A ; + LD IX,ACEX.Config_ID.Sp2000 + LD IY,SP2000_Loader_Flag RST 0 ;JP BEGIN_CB_IMG ;██████████████████████████████████████████████████████████████; @@ -499,14 +540,46 @@ TEST_HDD_DRV: ;LD HL,#01FE ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ERROR: ;░░░░░░░ Мигание лампочкой турбы ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +.loop: CALL FLASH_LIGHT + JR .loop + ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +FLASH_LIGHT: PUSH AF + PUSH DE + PUSH BC + LD E,6 LD A,SYS_PORT.TURBO.OFF .big_loop: LD BC,0 - OUT (SYS_PORT.ROM),A + OUT (SYS_PORT.RAM),A .loop: DEC BC INC B DJNZ .loop XOR 1 - JR .big_loop + DEC E + JR NZ,.big_loop + ; + POP AF + POP DE + POP BC + RET + ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + + ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +; in: A - внутренний порт, B - значение для записи во внутренний порт +; out: B - старое значение внутреннего порта; Перед выходом восстанавливается конфа прописанная в CONFIG_DE. +SET_PORTS: + CALL DOS_ON + ; + LD (#C400),A ; установить внутренний порт + LD A,B + LD BC,0 + ; Запись порта + OUT (C),A ; установить новое значение порта + ; +.End: XOR A + LD (#C400),A ; вернуть порт + JP DOS_OFF ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; @@ -518,6 +591,9 @@ RESERVED_PAGES: ; DB #49 ; Recovery_2 Acex port: #E7 DB #4B ; LOGO Acex port: #E4 .Size EQU $-RESERVED_PAGES.BIOS + IF DEBUG + DB #41 + ENDIF DB #FF ; End of the block .Blocks EQU 1 @@ -534,135 +610,56 @@ END_CB EQU $ ;██████████████████████████████████████████████████████████████; ;███████ Таблица DCP ██████████████████████████████████████████; DCP_DATA: DW %00'000'0'0100'0000 - DW %11'000'0'0110'1111 - DB ACEX.IDE_DATA_1F0 - DW %01'000'0'0100'0000 - DW %11'010'0'0110'1111 - DB ACEX.IDE_DATA_1F0 - DW %10'000'0'0100'0000 - DW %11'010'0'0110'1111 - DB ACEX.IDE_DATA_1F0 - DW %11'000'0'0100'0000 DW %11'000'0'0110'1111 DB ACEX.IDE_DATA_1F0 ; DW %00'000'0'0100'0001 - DW %00'010'1'1110'1111 - DB ACEX.IDE_ERROR_1F1 - DW %00'010'0'0100'0001 - DW %11'010'1'1110'1111 - DB ACEX.IDE_ERROR_1F1 - DW %11'010'0'0100'0001 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_ERROR_1F1 ; DW %00'000'0'0100'0010 - DW %00'010'1'1110'1111 - DB ACEX.IDE_COUNTER_1F2 - DW %00'010'0'0100'0010 - DW %11'010'1'1110'1111 - DB ACEX.IDE_COUNTER_1F2 - DW %11'010'0'0100'0010 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_COUNTER_1F2 ; DW %00'000'0'0100'0011 - DW %00'010'1'1110'1111 - DB ACEX.IDE_SECTOR_1F3 - DW %00'010'0'0100'0011 - DW %11'010'1'1110'1111 - DB ACEX.IDE_SECTOR_1F3 - DW %11'010'0'0100'0011 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_SECTOR_1F3 ; DW %00'000'0'0100'0100 - DW %00'010'1'1110'1111 - DB ACEX.IDE_CYLINDER_L_1F4 - DW %00'010'0'0100'0100 - DW %11'010'1'1110'1111 - DB ACEX.IDE_CYLINDER_L_1F4 - DW %11'010'0'0100'0100 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_CYLINDER_L_1F4 ; DW %00'000'0'0100'0101 - DW %00'010'1'1110'1111 - DB ACEX.IDE_CYLINDER_H_1F5 - DW %00'010'0'0100'0101 - DW %11'010'1'1110'1111 - DB ACEX.IDE_CYLINDER_H_1F5 - DW %11'010'0'0100'0101 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_CYLINDER_H_1F5 ; DW %00'000'0'1100'0010 - DW %00'010'1'1110'1111 - DB ACEX.IDE_DEVICE_HEAD_1F6 - DW %00'010'0'1100'0010 - DW %11'010'1'1110'1111 - DB ACEX.IDE_DEVICE_HEAD_1F6 - DW %11'010'0'1100'0010 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_DEVICE_HEAD_1F6 ; DW %00'000'0'1100'0011 - DW %00'010'1'1110'1111 - DB ACEX.IDE_STATUS_CMD_1F7 - DW %00'010'0'1100'0011 - DW %11'010'1'1110'1111 - DB ACEX.IDE_STATUS_CMD_1F7 - DW %11'010'0'1100'0011 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_STATUS_CMD_1F7 ; DW %00'000'0'1100'0100 - DW %00'010'1'1110'1111 - DB ACEX.IDE_CONTROL_3F6 - DW %00'010'0'1100'0100 - DW %11'010'1'1110'1111 - DB ACEX.IDE_CONTROL_3F6 - DW %11'010'0'1100'0100 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_CONTROL_3F6 ; DW %00'000'0'1100'0101 - DW %00'010'1'1110'1111 - DB ACEX.IDE_STATUS_3F7 - DW %00'010'0'1100'0101 - DW %11'010'1'1110'1111 - DB ACEX.IDE_STATUS_3F7 - DW %11'010'0'1100'0101 - DW %11'010'1'1110'1111 + DW %00'000'1'1110'1111 DB ACEX.IDE_STATUS_3F7 ; DW %00'000'0'0010'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_1 - DW %11'000'0'0010'1100 - DW %11'001'1'1111'1111 - DB ACEX.IDE_CHANEL_1 ; DW %00'000'0'0011'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_2 - DW %11'000'0'0011'1100 - DW %11'001'1'1111'1111 - DB ACEX.IDE_CHANEL_2 - ; - DW %00'000'0'1010'1100 - DW %11'001'1'1111'1111 - DB ACEX.RESET - DW %11'000'0'1010'1100 - DW %11'001'1'1111'1111 - DB ACEX.RESET ; DW %00'000'0'0110'1101 DW %10'000'1'1111'1111 DB ACEX.Scorp_1FFD - DW %11'000'0'0110'1101 - DW %11'000'1'1111'1111 - DB ACEX.Scorp_1FFD ; DW %00'000'0'1110'1101 DW %00'100'1'1110'1111 @@ -670,62 +667,29 @@ DCP_DATA: DW %00'000'0'0100'0000 DW %00'100'0'1110'1101 DW %11'110'1'1110'1111 DB ACEX.Pent_7FFD - DW %11'100'0'1110'1101 - DW %11'100'1'1110'1111 - DB ACEX.Pent_7FFD - DW %10'000'0'0110'1101 - DW %11'100'1'1110'1111 - DB ACEX.Pent_7FFD ; DW %00'000'0'0101'0110 DW %11'001'1'1111'1111 DB ACEX.ALL_MODE - DW %11'000'0'0101'0110 - DW %11'001'1'1111'1111 - DB ACEX.ALL_MODE ; DW %00'000'0'0010'0100 DW %00'000'0'0010'1111 DB ACEX.CNF_PORT ; DW %00'000'0'0000'1010 - DW %00'010'0'0110'1111 - DB ACEX.SLOT0 - DW %00'010'0'0000'1010 - DW %11'010'0'0110'1111 - DB ACEX.SLOT0 - DW %11'010'0'0000'1010 - DW %11'010'0'0110'1111 + DW %00'000'0'0110'1111 DB ACEX.SLOT0 ; DW %00'000'0'0010'1010 - DW %00'010'0'0110'1111 - DB ACEX.SLOT1 - DW %00'010'0'0010'1010 - DW %11'010'0'0110'1111 - DB ACEX.SLOT1 - DW %11'010'0'0010'1010 - DW %11'010'0'0110'1111 + DW %00'000'0'0110'1111 DB ACEX.SLOT1 ; DW %00'000'0'0100'1010 - DW %00'010'0'0110'1111 - DB ACEX.SLOT2 - DW %00'010'0'0100'1010 - DW %11'010'0'0110'1111 - DB ACEX.SLOT2 - DW %11'010'0'0100'1010 - DW %11'010'0'0110'1111 + DW %00'000'0'0110'1111 DB ACEX.SLOT2 ; DW %00'000'0'0110'1010 - DW %00'010'0'0110'1111 - DB ACEX.SLOT3 - DW %00'010'0'0110'1010 - DW %11'010'0'0110'1111 - DB ACEX.SLOT3 - DW %11'010'0'0110'1010 - DW %11'010'0'0110'1111 + DW %00'000'0'0110'1111 DB ACEX.SLOT3 ; DCP END MARKER DW 0,0,0 diff --git a/Crazy/BUILD_BIOS.a80 b/Crazy/BUILD_ACEX_BIOS.a80 similarity index 100% rename from Crazy/BUILD_BIOS.a80 rename to Crazy/BUILD_ACEX_BIOS.a80 diff --git a/Crazy/debug.asm b/Crazy/debug.asm new file mode 100644 index 0000000..3ffe628 --- /dev/null +++ b/Crazy/debug.asm @@ -0,0 +1,18 @@ + INCLUDE 'Shared_Includes/constants/SP2000.inc' + ORG 0 +.start: LD E,8 + LD A,SYS_PORT.TURBO.OFF +.big_loop: LD BC,0 + OUT (CNF_PORT.vZX_ROM),A +.loop: DEC BC + INC B + DJNZ .loop + XOR 1 + DEC E + JR NZ,.big_loop + ; + LD BC,0 +.loop2: DEC BC + INC B + DJNZ .loop2 + JR .start \ No newline at end of file diff --git a/CrazyBlaster.asm b/CrazyBlaster.asm index 110742c..89691f3 100644 --- a/CrazyBlaster.asm +++ b/CrazyBlaster.asm @@ -1,7 +1,7 @@ - - INCLUDE 'Shared_Includes/constants/SP2000.inc' INCLUDE 'Build/updater.inc' + INCLUDE 'Crazy BIOS/shared/CompMacro.asm' + INCLUDE 'Crazy BIOS/shared/DEFINES.INC' ;INCLUDE 'Shared_Includes/structures/FileSystem.inc' ;INCLUDE 'Shared_Includes/macroses/macros.z80' ;INCLUDE 'Shared_Includes/constants/BIOS_EQU.inc' @@ -17,9 +17,8 @@ DEFINE image_size_in_sectors flasher_size_in_sectors + bios_size_in_sectros DEFINE TYPE_OF_ACEX 3 ; 3 - 1K30, 5 - 1K50 - MACRO SET_IMG_LABEL -.Crazy_IMG_Label: DB "Crazy Blaster Image" - ENDM +DOS_OFF EQU #4000 +DOS_ON EQU #3D13 ;██████████████████████████████████████████████████████████████████████; ;█████████████████████[ FIRST SECTION - CONF ROM ]█████████████████████; @@ -34,7 +33,7 @@ END_FIRST_SECTION EQU $ ;██████████████████████████████████████████████████████████████████████; - +/* ;██████████████████████████████████████████████████████████████████████; ;██████████████████[ SECOND SECTION - IMAGE ON DRIVE ]█████████████████; ;██████████████████████████████████████████████████████████████████████; @@ -51,4 +50,5 @@ END_SECOND_SECTION EQU $ ; DISPLAY "IMG size = ",/A,END_SECOND_SECTION - BEGIN_CB_IMG OUTEND -;██████████████████████████████████████████████████████████████████████; \ No newline at end of file +;██████████████████████████████████████████████████████████████████████; +*/ \ No newline at end of file