INCLUDE 'Shared_Includes/constants/SP2000.inc' INCLUDE 'Build/updater.inc' ;INCLUDE 'Shared_Includes/structures/FileSystem.inc' ;INCLUDE 'Shared_Includes/macroses/macros.z80' ;INCLUDE 'Shared_Includes/constants/BIOS_EQU.inc' DEFINE sec_high 0 DEFINE sec_low 1 DEFINE SYS_FN_PAGE 1 ;DEFINE ACEX_ROM_COPY_PAGE 0 DEFINE bufer_adr #C000 DEFINE sys_fn_in_sectors #4000 / #200 DEFINE bios_size_in_sectors 512 DEFINE flasher_size_in_sectors 1 DEFINE image_size_in_sectors flasher_size_in_sectors + bios_size_in_sectros DEFINE TYPE_OF_ACEX 3 ; 3 - 1K30, 5 - 1K50 ;[ FIRST SECTION - CONF ROM ]; OUTPUT './Build/CrazyBlaster.raw' ORG #0000 ; ; 樠 ⥬ ⮢ Z84C15 ; BEGIN_CB: DI LD BC,#FF*256 + Z84.SYS.Control XOR A ; Z84.REG.WaitState_Ctrl OUT (C),A ; Z84.SYS.Control INC C ; Z84.REG.WaitState_MemBound OUT (C),A ; Z84.SYS.Data ; set 0 Waits ; DEC C LD A,3 ; Z84.REG.Misc_Ctrl OUT (C),A ; Z84.SYS.Control INC C ; boundary set! LD A,1 ; enable CS0, disable CS1 OUT (C),A ; Z84.SYS.Data ; 樠 DCP ; LD HL,INIT_SLOTS DCP_INIT: LD C,XL LD B,XH LD E,YL LD D,YH EXX ; LD HL,#C000 LD DE,#C001 LD BC,#3FFF LD (HL),L LDIR ; LD IY,DCP_DATA LD IX,.ret ; .loop: LD L,(IY) LD H,(IY+1) LD E,(IY+2) LD D,(IY+3) LD B,(IY+4) JP .PARSE_TABLE ; .ret: LD BC,5 ADD IY,BC LD A,(IY+2) OR (IY+3) JR NZ,.loop ; EXX LD XL,C LD XH,B LD YL,E LD YH,D ; First IN command - OPEN DCP IN A,(SLOT3) JP (HL) ; .PARSE_TABLE: LD A,L AND E LD L,A ; LD A,H AND D OR #C0 LD H,A ; LD A,D OR #C0 LD D,A ; .loop_parse: LD (HL),B ; LD A,L ; ᪨஢ 塞 1- OR E ; 宦 ७ INC A ; 㢥 JR Z,.carry ; ७ ; OR E XOR E ; 㫨 塞 LD C,A ; 塞 ; LD A,L AND E ; 뤥 塞 OR C LD L,A ; 塞 ; JR .loop_parse ; 横 ; A = 0 .carry: LD A,L ; 塞 ﬨ AND E LD L,A ; LD A,H ; ᪨஢ 塞 1- OR D ; 宦 ७ INC A ; 㢥 JR Z,.return ; OR D XOR D LD C,A ; 塞 ; LD A,H AND D ; 뤥 塞 OR C LD H,A ; 塞 JR .loop_parse .return: JP (IX) ; 樠 ࠭ ; INIT_SLOTS: XOR A OUT (SLOT0),A OUT (SLOT1),A DEC A OUT (SLOT2),A LD A,SYS_PAGE OUT (SLOT3),A ; 樠 ⮢ ; LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON OUT (SYS_PORT.ROM),A ; 樠 ⥪ ; LD SP,#4000 ; ॡ ⠢襣 RAM ; LD HL,0 LD DE,#4000 LD BC,END_CB LDIR XOR A OUT (FastRAM.SLOT0),A OUT (SYS_PORT.RAM),A INC A OUT (SLOT1),A IN A,(FastRAM.OFF) ; ; ࠭ 0,1,2,#FE ;; ; 稩 ; ;; ; 楤 訡 LD HL,ERROR PUSH HL ; 樠 HDD ; CALL HDD_INIT RET C ; ⠭ ࠭ 㧪 ; CALL Init_Mem ; 㧪 ; ; ⥫ 㭪樨 LOAD_FNs: LD A,(RESERVED_PAGES.SYS_FN) ; ࠭ , ᫨ #C000 (BLOCK_ID) LD B,sys_fn_in_sectors ; ᫮ ⠥ ᥪ஢ LD HL,bufer_adr ; LD IX,sec_high ; ᮫ ᥪ LD DE,sec_low ; ᮫ ᥪ PUSH HL CALL FN_HDD_READ ; ࠧ BIOS LOAD_DATA: LD B,4 LD IY,RESERVED_PAGES.BIOS POP HL CALL .LOADER ; ⨭ LD B,2 CALL .LOADER JP BEGIN_CB_IMG .LOADER: ; 㧪 128 ᥪ஢ .loop: PUSH HL PUSH BC LD A,(IY) LD B,128 LD DE,1 CALL FN_HDD_READ_NEXT LD BC,4 ADD IY,BC POP BC POP HL DJNZ .loop RET ;; ;; ; 楤 ; ;; ; FOR LBA ONLY - NEXT_READ ; HL - bufer, A - page ; B - numer of sectors ; DE - add_par (next+DE) (d.b. 1 for NEXT) FN_HDD_READ_NEXT: AND A INC B DEC B RET Z ; ret if 0 sectors CALL HD_WAIT RET C CALL NEXT_ADD_SEC JR FN_HDD_READ.L1 ; ; HL - BUFER, A - PAGE, FN_HDD_READ: AND A INC B DEC B RET Z CALL HD_WAIT CALL NC,HD_PREPARE RET C .L1: EXX LD C,SLOT3 IN B,(C) EXX OUT (SLOT3),A EX AF,AF' ; LD BC,IDE.Write.Command LD A,IDE.ATA.ReadSectorsWithRetry OUT (C),A .L2: CALL WAIT_HDD AND IDE.ControlByte.DataRequest JR Z,.HD_RET ; LD BC,IDE.Read.Data INIR INIR ; LD A,H OR L JR NZ,.L2 ; LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' LD H,high SYS_PAGE.RAMD_FAT ;!FIXIT ⠡ LD L,A LD A,(HL) OUT (SLOT3),A EX AF,AF' LD HL,#C000 JR .L2 ; .HD_RET: EXX OUT (C),B EXX LD BC,IDE.Read.Error IN A,(C) AND A SCF RET NZ ; EX AF,AF' AND A RET ;; ;; NEXT_ADD_SEC: PUSH AF ; LD A,B LD BC,IDE.Write.Counter ; ⠭ ᫮ ᥪ஢ OUT (C),A ; DEC B INC C IN A,(C) ; IDE.Read.Sector ADC A,E INC B OUT (C),A ; IDE.Write.Sector ; DEC B INC C IN A,(C) ; IDE.Read.CylinderLow ADC A,D INC B OUT (C),A ; IDE.Write.CylinderLow ; DEC B INC C IN A,(C) ; IDE.Read.CylinderHigh ADC A,0 INC B OUT (C),A ; IDE.Write.CylinderHigh ; LD BC,IDE.Read.Control IN A,(C) LD D,A ADC A,0 AND #0F LD E,A LD A,D AND #F0 OR E INC B OUT (C),A ; IDE.Write.DeviceHead ; POP AF RET ;; ;; HD_PREPARE: PUSH AF PUSH HL ; HD_CALC_SECS LD L,E LD E,D LD D,XL LD A,XH AND #0F ; LBA 28 LD H,A ; LD A,B LD BC,IDE.Write.Counter ; ⠭ ᫮ ᥪ஢ OUT (C),A ; INC C OUT (C),L INC C OUT (C),E INC C OUT (C),D ; LD BC,IDE.Read.Control IN A,(C) AND #F0 ; !!!!! ᬮ OR H INC B ; IDE.Write.DeviceHead OUT (C),A POP HL ; BUFER & PAGE POP AF AND A RET ;; ;; HDD_INIT: LD A,IDE.Chanel.Primary OUT (IDE.Chanel.Set),A CALL TEST_HDD_DRV SCF RET NZ ; CALL WAIT_HDD LD BC,IDE.Write.Command LD A,IDE.ATA.IdentifyDevice ;!FIXIT । OUT (C),A CALL WAIT_HDD AND IDE.ControlByte.DataRequest SCF RET Z ; LD BC,IDE.Read.Data LD HL,SYS_PAGE.HD_IDF_ADR INIR INIR ; B = 0 LD H,B LD L,B LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ᫮ ᥪ஢ LD C,A LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; ᫮ .loop: ADD HL,BC DEC A JR NZ,.loop LD (SYS_PAGE.HD_IDF_ADR.sec_cyl),HL CALL WAIT_HDD LD BC,IDE.Read.Control IN A,(C) AND #10 LD B,A LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; ᫮ DEC A AND #0F OR IDE.Drive.Master OR B ; LD H,A LD A,(SYS_PAGE.HD_IDF_ADR.LBA_CHS) AND %0000'0010 SCF RET Z ; NO_LBA ; SET 6,H LD BC,IDE.Write.DeviceHead OUT (C),H LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; ᫮ ᥪ஢ .HDD_CONFIGURED: LD BC,IDE.Write.Counter OUT (C),A LD A,IDE.ATA.InitializeDeviceParameters ; SET HDD PARAMETERS HD_CMD_EXE: CALL HD_WAIT RET C LD BC,IDE.Write.Command OUT (C),A HD_WAIT: PUSH DE PUSH BC PUSH AF LD DE,0 .loop: LD BC,IDE.Read.Status IN A,(C) AND IDE.ControlByte.Busy JR Z,.EXIT DEC DE LD A,D OR E JR NZ,.loop POP AF POP BC POP DE SCF RET ; error ; .EXIT: POP AF POP BC POP DE AND A RET ;; ;; WAIT_HDD: LD BC,IDE.Read.Status .loop: IN A,(C) BIT IDE.ControlBit.Busy,A JR NZ,.loop RET ;; ;; Init_Mem: LD HL,SYS_PAGE.RAMD_FAT; ; RAM FAT . ; 塞 ⠡ XOR A .loopFree: LD (HL),A INC L JR NZ,.loopFree ; १ࢨ㥬 ᯥ.࠭ ࠭ ZX LD B,RESERVED_PAGES.Blocks LD DE,RESERVED_PAGES ; ⠡ ⥬ ࠭ .loop: LD A,(DE) CP #FF JR Z,.exitLoop .loopBlk: INC DE LD L,A LD A,(DE) LD (HL),A CP #FF JR NZ,.loopBlk .exitLoop: INC DE DJNZ .loop LD L,A LD (HL),A RET ;; ;; TEST_HDD_DRV: ;LD HL,#01FE LD BC,IDE.Write.Counter OUT (C),L INC C OUT (C),H ; IDE.Write.Sector ; DEC C DEC B IN A,(C) ; IDE.Read.Counter CP L RET NZ INC C IN A,(C) ; IDE.Read.Sector CP H RET ;; ERROR: ; 窮 ; LD A,SYS_PORT.TURBO.OFF .big_loop: LD BC,0 OUT (SYS_PORT.ROM),A .loop: DEC BC INC B DJNZ .loop XOR 1 JR .big_loop ;; 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 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 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 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 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 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 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 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 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 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 DB ACEX.Pent_7FFD 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 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 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 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 DB ACEX.SLOT3 ; DCP END MARKER DW 0,0,0 ;-----------------------------------------------------------------------; RESERVED_PAGES:; [x] Block #1 - ᢮ ID 1 ; ⥫ 楤 .SYS_FN: DB SYS_FN_PAGE ; ࠧ 訢 .BIOS: DB #10,#11,#12,#13 DB #14,#15,#16,#17 DB #18,#19,#1A,#1B DB #1C,#1D,#1E,#1F ; ⨭ .PICTURE: DB 2,3,4,5,6 ; ࠧ 訢騪 .FLASHER_RAM: DB 7,8 DB #FF ; End of the block .Blocks EQU 1 .Size EQU $-RESERVED_PAGES ;-----------------------------------------------------------------------; END_FIRST_SECTION EQU $ ; DISPLAY "ROM size = ",/A,END_FIRST_SECTION - BEGIN_CB OUTEND ;; ;; ;; ;[ SECOND SECTION - IMAGE ON DRIVE ]; OUTPUT './Build/CrazyBlasterIMG.raw' ORG 0 BEGIN_CB_IMG: LD HL,RESERVED_PAGES LD DE,#4000 + RESERVED_PAGES_COPY LD BC,RESERVED_PAGES.Size LDIR LD SP,#4000 LD A,SYS_FN_PAGE OUT (SLOT0),A JP INIT_SCREEN - #4000 ; .start_code EQU $ ; 樠 ࠭ ; INIT_SCREEN: CALL FN_SYNC ; LD IX,VideoModes.graf_mode320x256 LD E,%00010001 CALL WIN_OPEN ; 樠 ; INIT_PALETTE: ;IN A,(SLOT1) ;PUSH AF LD B,#FF LD HL,PICTURE.bdPallete ;#8FBC ;!HARDCODE PICTURE.bdPallete LD DE,0 LD A,1 CALL SET_PALETTE CALL SET_PICTURE CALL SET_BOARD_NUMBER ; । 稯 CALL DETECT_ROM ; ; ⠭ ॣ஢ ; 릮 室 䫥 ;; SET_BOARD_NUMBER: IN A,(SLOT3) EX AF,AF' LD A,#18 ;!HARDCODE OUT (SLOT3),A ; LD HL,(BOARD_ID_DATA.Start) LD (BoardNumOffsets.Start),HL LD HL,(BOARD_ID_DATA.Number) LD (BoardNumOffsets.Number),HL LD HL,(BOARD_ID_DATA.End) LD (BoardNumOffsets.End),HL LD A,(BOARD_ID_DATA.Type) LD (BoardNumOffsets.Type),A ; LD A,#10 ;!HARDCODE OUT (SLOT3),A LD A,(FOR_ACEX) LD (#C000 + expBIOS_Vars.msgStrings.str_ACEX_MODEL),A LD (#C000 + expBIOS_Vars.msgRusStrings.str_ACEX_MODEL),A ; EX AF,AF' OUT (SLOT3),A RET ;; DISP_WINDOW EQU $ DISP #4000 + DISP_WINDOW DETECT_ROM: LD HL,0 ADD HL,SP LD SP,#4000 LD (.sp_save),HL ; CALL TEST_ROM_CHIP ;!HARDCODE TEST_ROM_CHIP #8E59 LD (TST_R.jp),BC ;!HARDCODE TST_R.jp #81D5 ; .sp_save+1: LD SP,0000 XOR A OUT (SYS_PORT.RAM),A RET ENT ;; ;; ;; ;; ;; SET_PICTURE: LD A,#FF - MAIN_PICTURE.PIC_Y .loop_pic: PUSH AF LD A,#50 OUT (SLOT1),A POP AF OUT (PORT_Y),A LD HL,.pic_buffer LD DE,#4000 + Screen_Offset + MAIN_PICTURE.PIC_X ; LD BC,MAIN_PICTURE.PIC_WIDTH LDIR ; LD H,A POP AF OUT (SLOT1),A PUSH AF LD A,H DEC A CP MAIN_PICTURE.PIC_Y-1 JR NZ,.loop_pic POP AF OUT (SLOT1),A IM 1 EI RET .pic_buffer: BLOCK MAIN_PICTURE.PIC_WIDTH,0 ;; ; ⠭ ० LP_MODE_LINE: BIT 0,(IX+Window_Variables.USER.MODE_S) JP NZ,LP_MODE_LINE2 ; ᯥ BIT 4,A JP Z,LP_MODE_LINE3 ; 䨪! DEC D ; ⥪⮢ ०. EX AF,AF' LD A,#50 OUT (SLOT3),A LD A,L ; ⨪쭮 CP #80 JR NC,LP_EXIT_MODE ; LP_MODE_RECURSE: LD A,D ; ਧ⠫쭮 AND 7FH SUB 80 JR C,LP_MODE_LL SUB 48 NEG ; LD E,A ; ADD A,D LD D,A ; ; LD A,E ; ⠭ RRA AND 3FH SUB C JR NC,LP_EXIT_MODE NEG LD C,A ; 祭 C JR LP_MODE_RECURSE ; LP_MODE_LL: NEG RRA AND 3FH CP C JR NC,LP_MODE_LR LD C,A LP_MODE_LR: EX AF,AF' INC D LP_MD_LL1: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),A ; ० INC D EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),A ; ० INC D DEC C JR NZ,LP_MD_LL1 EX AF,AF' LP_EXIT_MODE: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' RET ; ; ⠭ ० ; Spectrum mode LP_MODE_LINE2: LD A,(IX+Window_Variables.WORK_2) LD B,(IX+Window_Variables.WORK_1) ; DEC D ; EX AF,AF' LD A,#50 OUT (SLOT3),A LD A,L ; ⨪쭮 CP #80 JR NC,LP_EXIT_MODE2 ; LP_MODE_RECURSE2: LD A,D ; ਧ⠫쭮 AND #7F SUB 80 JR C,LP_MODE_LL2 SUB 48 NEG ; LD E,A ; ADD A,D LD D,A ; ; LD A,E ; ⠭ RRA AND #3F SUB C JR NC,LP_EXIT_MODE2 NEG LD C,A ; 祭 C JR LP_MODE_RECURSE2 ; LP_MODE_LL2: NEG RRA AND #3F CP C JR NC,LP_MODE_LR2 LD C,A LP_MODE_LR2: EX AF,AF' INC D LP_MD_LL2: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),A ; ० INC L LD (HL),B INC L LD (HL),B DEC L DEC L INC D BIT 4,A JR NZ,lp_md_ll3x INC B lp_md_ll3x: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),A ; ० INC L LD (HL),B INC L LD (HL),B DEC L DEC L INC D INC B JR NZ,LP_NO_ADD_40 ADD A,#40 LP_NO_ADD_40: DEC C JR NZ,LP_MD_LL2 EX AF,AF' LP_EXIT_MODE2: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' LD (IX+Window_Variables.WORK_1),B LD (IX+Window_Variables.WORK_2),A RET ; ; ⠭ ० LP_MODE_LINE3: ; Grafic Mode LD A,(IX+Window_Variables.WORK_1) LD B,(IX+Window_Variables.WORK_2) DEC D EX AF,AF' LD A,#50 OUT (SLOT3),A LD A,L ; ⨪쭮 CP #80 JR NC,LP_EXIT_MODE3 ; LP_MODE_RECURSE3: LD A,D ; ਧ⠫쭮 AND #7F SUB 80 JR C,LP_MODE_LL3 SUB 48 NEG LD E,A ; ADD A,D LD D,A ; LD A,E ; ⠭ RRA AND #3F SUB C JR NC,LP_EXIT_MODE3 NEG LD C,A ; 祭 C JR LP_MODE_RECURSE3 ; LP_MODE_LL3: NEG RRA AND #3F CP C JR NC,LP_MODE_LR3 LD C,A LP_MODE_LR3: EX AF,AF' INC D BIT 5,B JR Z,LP_GR_640 ; LP_MD_LL3: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),B ; ० INC L LD (HL),A ; ० 2 INC L LD (HL),0 ; ० 2 DEC L DEC L INC D INC D INC A LD E,A AND 7 JR NZ,LP_NO_INC_B LD A,E SUB 8 LD E,A INC B LP_NO_INC_B: LD A,E DEC C JR NZ,LP_MD_LL3 ; LP_640_RET: EX AF,AF' LP_EXIT_MODE3: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' LD A,(IX+Window_Variables.WORK_1) ADD A,8 LD (IX+Window_Variables.WORK_1),A RET ; LP_GR_640: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),B ; ० 1 INC L LD (HL),A ; ० 2 INC L LD (HL),0 ; ० 3 INC D EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),0 ; ० 3 DEC L LD (HL),A ; ० 2 DEC L LD (HL),B ; ० 1 INC D INC A LD E,A AND 7 JR NZ,LP_NO_INC_B6 LD A,E SUB 8 LD E,A INC B LP_NO_INC_B6: LD A,E DEC C JR NZ,LP_GR_640 JP LP_640_RET ;; ; 室: HL - RGB, E - 砫 梥 ; D - ᫮ 梥⮢, B - PAL-mask, A - page PAL SET_PALETTE: PUSH IX ; EX AF,AF' IN A,(RGADR) PUSH AF ; ࠭ RGADR LD A,E OUT (RGADR),A ; 砫 梥 LD A,D ; ࠭ ᫮ 梥⮢ EX AF,AF' ; ࠭ PAL ; BIT 7,H ; ஢ LD C,SLOT3 ; ᫨ 8000h LD D,#C3 ; .࠭ ࠭ 3 JR Z,.NO_PAGE1 LD D,#43 ; LD C,SLOT1 ; ࠭ 1 .NO_PAGE1: ADD A,A ADD A,A AND #1C XOR #E0 ; 訩 PAL LD E,A ; DE - - PUSH DE POP IX ; ; LD D,B ; ᪠ PAL EX AF,AF' ; ᫮ 梥⮢ LD B,A ; ᫮ 梥⮢ ; IN E,(C) ; ࠭ ࠭ 3 LD A,#50 ; ࠭ ᪮ RAM OUT (C),A .loopPal: ; 横 ⠭ 梥⮢ LD A,(HL) ; B AND D LD (IX+2),A INC HL ; LD A,(HL) ; G AND D LD (IX+1),A INC HL ; LD A,(HL) ; R AND D LD (IX+0),A INC HL ; LD A,(HL) ; Y AND D LD (IX+3),A INC HL ; IN A,(RGADR) INC A OUT (RGADR),A DJNZ .loopPal ; 믮, 0 ; .exit: OUT (C),E ; ⠭ ࠭ 3 POP AF OUT (RGADR),A ; ⠭ Y_PORT POP IX AND A RET ;; LP_OPEN_PG: IN A,(SLOT3) LD C,A LD A,SYS_PAGE OUT (SLOT3),A ; LD A,C LD (SYS_PAGE.COPY_SLOT3),A IN A,(PORT_Y) LD (SYS_PAGE.COPY_RGADR),A RET LP_CLOSE_PG: LD A,(SYS_PAGE.COPY_RGADR) OUT (PORT_Y),A LD A,(SYS_PAGE.COPY_SLOT3) OUT (SLOT3),A RET ;; WIN_OPEN: CALL LP_OPEN_PG LD (SYS_PAGE.WIN_MAP_SC),IX ; PUSH DE LD HL,(SYS_PAGE.WIN_MAP_SC) LD DE,WIN_ID_0 LD BC,Window_UserVars LDIR LD IX,WIN_ID_0 POP DE LD L,(IX+Window_Variables.USER.PLACE_H) LD H,(IX+Window_Variables.USER.PLACE_V) LD (IX+Window_Variables.MODE_E),E ; LD A,L ADD A,A INC A ; ᫥ PORT_Y BIT 4,E JR NZ,.LP_SET_NO_OR OR #80 ; ᫨ 뢮 ன ࠭ .LP_SET_NO_OR: LD (IX+Window_Variables.H_BEG),A LD D,A LD A,(IX+Window_Variables.USER.SIZE_H) ADD A,A ADD A,D LD (IX+Window_Variables.H_END),A LD (SYS_PAGE.WIN_MODE_SC),DE ; ਧ⠫ ࠭ LD A,H AND #3F ADD A,A ADD A,A LD L,A LD H,#C3 LD (SYS_PAGE.WIN_MODE_SH),HL ; ⨪ ᮬ LD (IX+Window_Variables.V_BEG),A LD A,(IX+Window_Variables.USER.SIZE_V) ADD A,A ADD A,A ADD A,L LD (IX+Window_Variables.V_END),A ; LD L,(IX+Window_Variables.V_BEG) LD H,#C3 LD B,(IX+Window_Variables.USER.SIZE_V) ; ࠧ ⨪ ; LD (IX+Window_Variables.WORK_1),0 LD A,(IX+Window_Variables.USER.MODE) ; ० LD (IX+Window_Variables.WORK_2),A BIT 4,A JR NZ,.LOOP ; 室, ᫨ ⥪⮢ ० ; AND #F0 LD C,A LD A,(IX+Window_Variables.USER.GR_X) RRCA RRCA RRCA LD D,A AND #0F OR C LD (IX+Window_Variables.WORK_2),A ; LD A,D AND #E0 LD C,A LD A,(IX+Window_Variables.USER.GR_Y) AND #1F OR C RLCA RLCA RLCA LD (IX+Window_Variables.WORK_1),A ; .LOOP: LD D,(IX+Window_Variables.H_BEG) ; D - 砫 ப (PORT_Y) LD C,(IX+Window_Variables.USER.SIZE_H) ; ࠧ ਧ⠫ LD A,(IX+Window_Variables.USER.MODE) ; ० ; PUSH BC CALL LP_MODE_LINE POP BC INC L INC L INC L INC L DJNZ .LOOP ; LD A,(IX+Window_Variables.MODE_E) AND 1 OUT (RGMOD),A CALL LP_CLOSE_PG CALL LP_INI_P CALL LP_SIZE XOR A RET ; LP_INI_P: EX AF,AF' EXX CALL LP_OPEN_PG ; ⨥ ᪮ ࠭ ; LP_INI_NO_ZG: LD A,(WIN_ID_0.H_BEG) LD D,A LD A,(WIN_ID_0.V_BEG) LD L,A INC L LD H,#C3 AND A LD A,(WIN_ID_0.USER.MODE) BIT 5,A LD A,(WIN_ID_0.USER.SIZE_H) JR NZ,LP_INI_40 ADD A,A SCF ;!TODO - 믨 LP_INI_40: LD B,A LD (WIN_ID_0.SIZE_REL),A EX AF,AF' EXX JP LP_END_P ; ; WIN_MAP_SC - ࠭ ; 0 - hor size ; 1 - ver size ; 2 - hor place ; 3 - ver place LP_SIZE: ; । size CALL LP_OPEN_PG LD DE,(WIN_ID_0.USER.SIZE_H) LD A,(WIN_ID_0.USER.MODE) BIT 5,A CALL LP_CLOSE_PG RET NZ LD A,E ADD A,A LD E,A RET ; LP_END_P: LD A,SYS_PAGE OUT (SLOT3),A .SYS_PAGE: EX AF,AF' EXX RLA LD E,A LD (WIN_ID_0.reg_HL),HL ; LD (WIN_ID_0.reg_DE),DE LD (WIN_ID_0.reg_BC),BC CALL LP_CLOSE_PG EXX EX AF,AF' AND A RET .short: EX AF,AF' EXX CALL LP_CLOSE_PG EXX EX AF,AF' AND A RET ;; FN_SYNC: LD A,Port_VSYNC.SET_320L OUT (Port_VSYNC),A LD C,SLOT3 IN B,(C) LD A,SYS_PAGE OUT (C),A LD A,(SYS_PAGE.VSyncAndWaits) OR 1 LD (SYS_PAGE.VSyncAndWaits),A ; .INT_DEF: LD DE,(SYS_PAGE.CONFIG_ALL) OUT (C),B LD IX,SCREEN_TABLES.PENTAGON IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' LD (SYS_PAGE.COPY_SLOT3),A IN A,(PORT_Y) LD (SYS_PAGE.COPY_RGADR),A LD (SYS_PAGE.CONFIG_ALL),IX XOR A ;----[START]-----------------------[? 1] .loop_1: OUT (PORT_Y),A EX AF,AF' LD A,#50 OUT (SLOT3),A LD HL,#C300 ;----[START]------------------[v 2]----- .loop_2: LD C,(IX) ;----[START]-------------[v 3]---------- .loop_3: ; 㦥 ࠭ LD E,(IX+1) ; take adress of line X LD D,(IX+2) ;----[START]--------[v 4]--------------- .loop_4: LD A,(DE) ; take counter in table 1, line X, column Y INC DE AND A JR Z,.loop_4_exit ; exit if zero-counter LD B,A LD A,(DE) INC DE ;----[START]---[v 5]-------------------- .loop_5: LD (HL),A INC L LD (HL),0 INC L LD (HL),0 ; EX AF,AF' INC A OUT (PORT_Y),A EX AF,AF' ; LD (HL),0 DEC L LD (HL),0 DEC L LD (HL),A ; EX AF,AF' INC A OUT (PORT_Y),A EX AF,AF' DJNZ .loop_5 ;--------------[^ 5]-------------------- JR .loop_4 ;-------------------[^ 4]--------------- .loop_4_exit: INC HL ; next line INC HL INC HL INC HL IN A,(PORT_Y) AND #80 OUT (PORT_Y),A DEC C JR NZ,.loop_3 ;------------------------[^ 3]---------- INC IX ; next counter INC IX INC IX LD A,(IX) AND A JR NZ,.loop_2 ;-----------------------------[^ 2]----- LD A,SYS_PAGE OUT (SLOT3),A LD IX,(SYS_PAGE.CONFIG_ALL) EX AF,AF' ADD A,#80 JR NC,.loop_1 ;----------------------------------[^ 1] ; Exit LD A,(SYS_PAGE.COPY_RGADR) OUT (PORT_Y),A LD A,(SYS_PAGE.COPY_SLOT3) OUT (SLOT3),A .exit: OR A RET ;--- Screen data table 1: counter1, data1 .. counterX, dataX SCREEN_TABLES:; | ᫮ | 祭 | ; | ப | | ; | /2 | ப | .SCR: DB 41 , #F8 DB 3 , #FC DB 4 , #FC DB 7 , #FC DB 9 , #F8 DB 0 .INT: DB 40,#FC, 2,#FD, 6,#FC, 7,#FC, 9,#FC, 0 .BLN: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 .SNC: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 .RES: DB 41,#F8, 3,#FE, 4,#FE, 7,#FE, 9,#F8, 0 ;--- Screen data tables 2: counter1, data address1 .. counterX, data addressX ; ; | - | 祭 | ; | ப | | ; | | ப | .PENTAGON: DB 33 : DW .SCR DB 1 : DW .INT ; DW .BLN DB 3 : DW .SNC DB 1 : DW .BLN DB 1 : DW .SCR DB 1 : DW .RES DB 0 ; end ;--- VideoModes: .text_mode80x32: DB 40 DB 32 DB 0 DB 0 DB %00011011 DB 0 DB 0 DB 0 .graf_mode320x256: DB 80 DB 32 DB 0 DB 0 DB %01100000 DB 0 DB 0 DB 0 ;---------------------------------------------------------------------; ;; ;; RESERVED_PAGES_COPY: BLOCK RESERVED_PAGES.Size,#FF .SYS_FN EQU RESERVED_PAGES.SYS_FN - RESERVED_PAGES .BIOS EQU RESERVED_PAGES.BIOS - RESERVED_PAGES .PICTURE EQU RESERVED_PAGES.PICTURE - RESERVED_PAGES .FLASHER_RAM EQU RESERVED_PAGES.FLASHER_RAM - RESERVED_PAGES ;; ;-----------------------------------------------------------------------; BYTE "ACEX 1K" FOR_ACEX: DB "0" + TYPE_OF_ACEX BYTE "0" BYTE "FULL BOARD ID:" BOARD_ID_DATA: .Start: DW #5283 .Number: DW 0 ; 뢮 5 : 0..99999 #0000..#270F .End: DW #47E8 .Type: DB 0 BYTE "--<=END=>--" END_SECOND_SECTION EQU $ ; DISPLAY "IMG size = ",/A,END_SECOND_SECTION - BEGIN_CB_IMG OUTEND ;;