Crazy-Blaster/Crazy BIOS/exp/EXP.asm
2024-08-02 02:52:29 +10:00

1430 lines
31 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
;*************************************************************
;
; 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 ***********
;***************************************
; ‚室 ¯® RESET
EXP_START:
JP GLOBAL_RESET
;---------------------------------------
;ROM_NUMBER:
;.part1: DW MotherBoardID
;.part2: DB 0
BOARD_INFO:
.number: DW MotherBoardID
.type: DB MotherBoardType
;---------------------------------------
;---------------------------------------
; BoardID:
; .start: WORD BoardID_start ; BoardID_start
; .end: WORD BoardID_end ; BoardID_end
;---------------------------------------
;=======================================
BLOCK 8-$,0 ; first on/off EXPANSION
;¯à®£à ¬¬  ¤«ï ¢ë§®¢  BIOS ç¥à¥§ RST8 ¨§ RAM0
EXP_FNS_2_RET:
PUSH AF
LD A,vROM.BIOS
OUT (CNF_PORT.vZX_ROM),A
POP AF
JR RST_18_1
;=======================================
;=======================================
BLOCK #10-$,0
RST_10:
; JR RST10
;=======================================
;=======================================
BLOCK #18-$,0
; RST18h - MAIN BIOS functions
JP EXP_FNS_RST18
RST_18_1:
CALL EXP_FNS_RST18
.exit: JR EXP_FNS_2_RET
;=======================================
;=======================================
BLOCK #20-$,0
RST_20:
;=======================================
;=======================================
BLOCK #28-$,0
RST_28:
;=======================================
;=======================================
BLOCK #30-$,0
RST_30:
;=======================================
;=======================================
BLOCK #38-$,0
; INTERUPT Point
RST38: EI
RETI
;RST10:
; CALL_48 10h
; RET
;=======================================
;=======================================
_mInfoALIGN #10,0
; any adress < #C0 with mask %xxxx0000
; â ¡«¨æ  ¤«ï Sprinter POST-Tester-a
TABLE_X:
.v0: DB 00101000b ; "0"
.v1: DB 10111101b ; "1"
.v2: DB 00110010b ; "2"
.v3: DB 00110100b ; "3"
.v4: DB 10100101b ; "4"
.v5: DB 01100100b ; "5"
.v6: DB 01100000b ; "6"
.v7: DB 00111101b ; "7"
.v8: DB 00100000b ; "8"
.v9: DB 00100100b ; "9"
.vA: DB 00100001b ; "A"
.vB: DB 11100000b ; "B"
.vC: DB 01101010b ; "C"
.vD: DB 10110000b ; "D"
.vE: DB 01100010b ; "E"
.vF: DB 01100011b ; "F"
;=======================================
;
;
;=======================================
;RESTARTS EQU #FFE0
; GLOBAL_RESET:
; DI
; ;
; FLASH_LIGHT
; ;
; JR NO_RESTART
;=======================================
_mInfoBLOCK #66-$,0
NMI_Point:
; १¥à¢ 3 ¡ ©â  ¤«ï ª®¬ ­¤ë JP
;NOP
;NOP
;NOP
RETN
;=======================================
;SET_BIOS_TO_RAM: ; ¯à®£à ¬¬  à ¡®â ¥â ­   ¤à¥á¥ 0C000h
;
; LD SP,#C0C0
; LD A,#E0
; LD C,PAGE3
; IN B,(C)
; CALL SET_ROM_PAGES+#C000
; JP NO_SUMX_EQ
;**********************************
;BEEP:
; PUSH HL
; PUSH DE
; PUSH BC
; PUSH AF
; PUSH IX
;
; LD HL,BEEP_RET
; PUSH HL
; LD HL,SW_ROM
; PUSH HL
; LD HL,03B5h
; PUSH HL
; LD HL,200
; LD D,H
; LD E,5
; JP SW_ROM
;BEEP_RET:
;
; POP IX
; POP AF
; POP BC
; POP DE
; POP HL
; RET
;=======================================
; BLOCK MEM_MAP.ID_Version-$,0 ;#C0-$,0
ID_Version: DW BIOS_ver_hex
; ID_SPRINTER_FullSize:
; DB ID_SPRINTER.Size
; § ¯¨áì 1
ID_SPRINTER: DB 'Firmware v'
.BIOS_ver: DB BIOS_ver_string,' '
IF BETA_BUILD > 0
DB BETA_str_ver
ELSE
DB '[',BUILD_DATE,']'
ENDIF
DB 0
.Record1_Size EQU $-ID_SPRINTER
; § ¯¨áì 2
DB 'Sprinter',0
; § ¯¨áì 3 ; [x] 24/02/2024
.bitstream_ver: DB bitstream_ver_string,0
DB 0
;
.Size EQU $-ID_SPRINTER
.Records_Num EQU 3
; Check for max length of string
ASSERT ID_SPRINTER.Record1_Size < SYS_PAGE.ID_FLAG.Size, 'ERROR! ID String is to long!'
;=======================================
; BLOCK #FC-$,0
BoardID:
.start: WORD BoardID_start ; BoardID_start
.end: WORD BoardID_end ; BoardID_end
;=======================================
;
;-----[¯¥à¥å¢ â RESET ­¥ á®áâ®ï«áï]-----
GLOBAL_RESET:
DI
IM 1
; á⥪ ¥éñ ­¥ ¨á¯®«ì§ã¥¬!!!
LD SP,IX ; á®åà ­¨âì §­ ç¥­¨¥ ¯¥à¥¤ ­­®¥ § £àã§ç¨ª®¬ ª®­äë (¥á«¨ áâ àâ ¯®á«¥ à¥á¥â )
; ¨­¨æ¨ «¨§ æ¨ï ¢­ãâ७­¨å ¯®à⮢ Z84C15 ¤«ï POST-Tester- 
LD A,5 ; COM port for Printer OUT
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#62
OUT (Z84.SIO.Ch_A.Ctrl),A
;
LD A,#CF ; BITS I/O
OUT (Z84.PIO.Port_A.Command),A
XOR A
OUT (Z84.PIO.Port_A.Command),A
OUT (Z84.PIO.Port_A.Data),A ; PRINTER - PORT - all zeros
; -¨­¨æ¨ «¨§ æ¨ï á¨á⥬­ëå ¯®à⮢ Z84C15-
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
; no boundary set!
;XOR A ; disable CS0, disable CS1
LD A,1 ; enable CS0, disable CS1
OUT (C),A ; Z84.SYS.Data
JP POST_TEST.START
;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
; ==== POST PROCs =================
MODULE POST_TEST
START:
; *********************************
; ===== Point 0 =======
; *********************************
LD A,(TABLE_X.v0) ; ¢ëᢥâ¨âì "0" ;rdlow-ok
OUT (Z84.PIO.Port_A.Data),A
; ==== TEST RAM BUS ========
POST_1_RAM_BUS:
LD BC,0
LD HL,#C000
LD DE,#0055
.loop: LD (HL),E
INC L
LD (HL),D
DEC L
LD A,(HL)
XOR E
OR C
LD C,A
INC L
LD A,(HL)
XOR D
OR B
LD B,A
DEC L
DEC E
INC D
JR NZ,.loop
LD A,E
CPL
LD E,A
INC L
INC L
BIT 4,L
JR Z,.loop
LD A,B
OR C
JR Z,POST_1_OK ; no errors
; ERROR RAM BUS - CODE 'X'X'X'X...
.error:
LD HL,TABLE_X
.ERB_2:
BIT 0,C
JR Z,.ERB_1
; ¢ëᢥâ¨âì ­®¬¥à ®è¨¡®ç­®£® ¡¨â 
LD A,(HL)
AND %1101'1111 ; á § ¯ïâ묨
OUT (Z84.PIO.Port_A.Data),A
; ¯ ã§ 
LD DE,0
.pause:
DEC DE
LD A,D
OR E
JR NZ,.pause
; RRC BC
.ERB_1:
LD A,C
RRA
RR B
RR C
; ¡¥áª®­¥ç­ë© 横«
INC L
LD A,L
AND #AF
LD L,A
JR .ERB_2
; ************************************************
; ===== Point 1 ==============
; ************************************************
POST_1_OK:
LD A,(TABLE_X.v1) ; ¢ëᢥâ¨âì "1" ;rdlow-ok
OUT (Z84.PIO.Port_A.Data),A
; ===== TEST ADRESS BUS ======
POST_2_ADRESS_BUS:
LD HL,#C000
LD DE,#0000
.fill_mem: ; § ¯®«­¨âì ¯ ¬ïâì  ¤à¥á ¬¨
LD (HL),E
INC L
LD (HL),D
INC HL
INC DE
INC DE
BIT 7,H
JR NZ,.fill_mem
DEC HL
DEC DE
DEC DE
.check_mem: ; ¯à®¢¥à¨âì ᮢ¯ ¤¥­¨¥
LD A,(HL)
CP D
JR NZ,.error
DEC HL
LD A,(HL)
CP E
JR NZ,.error
DEC HL
DEC DE
DEC DE
LD A,H
CP #BF
JR NZ,.check_mem
JR POST_2_OK
; ®è¨¡ª   ¤à¥á  CODE: 'XXXX
.error:
.TSAB_4:
LD C,D
LD B,11011111b
LD IX,.TSAB_3
JR OUT_C_BYTE ; ¢ë¢¥á⨠áâ à訩 ¡ ©â á § ¯ï⮩
.TSAB_3:
LD C,E
LD B,#FF
LD IX,.TSAB_4
JR OUT_C_BYTE ; ¢ë¢¥á⨠¬« ¤è¨© ¡¥§ § ¯ï⮩
; ===== OUT BYTE PROGRAM =======
OUT_C_BYTE:
LD A,C
RRCA
RRCA
RRCA
RRCA
AND #0F
OR TABLE_X
LD L,A
LD H,0
LD A,(HL)
AND B
OUT (Z84.PIO.Port_A.Data),A
EXX
LD DE,0
.LOOP_WTT2:
DEC DE
LD A,D
OR E
JR NZ,.LOOP_WTT2
LD A,#FF
OUT (Z84.PIO.Port_A.Data),A
.LOOP_WTT21:
DEC DE
LD A,D
OR E
JR NZ,.LOOP_WTT21
EXX
LD A,C
AND #0F
OR TABLE_X
LD L,A
LD A,(HL)
OUT (Z84.PIO.Port_A.Data),A
EXX
LD DE,0
.LOOP_WTT3:
DEC DE
LD A,D
OR E
JR NZ,.LOOP_WTT3
LD A,#FF
OUT (Z84.PIO.Port_A.Data),A
.LOOP_WTT31:
DEC DE
LD A,D
OR E
JR NZ,.LOOP_WTT31
EXX
JP (IX)
; ************************************************
; ===== Point 2 =========
; ************************************************
POST_2_OK:
LD A,(TABLE_X.v2) ;rdlow-ok
OUT (Z84.PIO.Port_A.Data),A ; ¢ë¢¥á⨠"2"
; ===== INIT DCP ========
POST_3_INIT_DCP:
LD HL,POST_3_OK ; INIT PORTS
JP DCP_INIT ; ¯à®æ¥¤ãà  ¨­¨æ¨ «¨§ æ¨¨ á ¢®§¢à â®¬ ¢ (HL)
; ®è¨¡®ª ­¥â
; ***********************************
; ===== Point 3 =========
; ***********************************
POST_3_OK:
LD A,(TABLE_X.v3) ; ¢ë¢¥á⨠"3" ;rdlow-ok
OUT (Z84.PIO.Port_A.Data),A
; ===== TEST RAM PAGES ==
IN A,(SLOT3)
EX AF,AF' ; § ¯®¬­¨âì
POST_4_PAGES:
LD B,0
.loop: LD A,#FF
LD I,A
LD A,B
OUT (SLOT3),A
LD A,0
LD I,A
IN A,(SLOT3)
CP B
JR NZ,.error ; ¥á«¨ ®è¨¡ª  ¯¥à¥ª«î祭¨ï Port- 
DJNZ .loop
EX AF,AF'
OUT (SLOT3),A ; ¢®ááâ ­®¢¨âì
JR POST_4_OK
; ***********************************
; ERROR Port CODE 'XX
.error: LD C,B
LD IX,.error_out_ret
.error_out_ret:
LD B,11011111b
JP OUT_C_BYTE
; ***********************************
; ===== Point 4 =========
; ***********************************
POST_4_OK:
LD A,(TABLE_X.v4) ;rdlow-ok
OUT (Z84.PIO.Port_A.Data),A ; ¢ëᢥâ¨âì "4"
;= ¯à®¢¥àª  ç¨áâ®âë è¨­ë ¤ ­­ëå Z84C15 =
POST_5_DATA_BUS:
LD B,0
.loop: IN A,(0)
CP #FF
; JR NZ,.error ;!!!!! ¯®á¬®âà¥âì
DJNZ .loop
JR POST_5_OK
; ERROR CODE '_'XX
.error:
LD C,A
.erb1:
LD IX,.erbr1
LD B,%1101'1111
JP OUT_C_BYTE
.erbr1:
LD A,%1101'1111
OUT (Z84.PIO.Port_A.Data),A
LD DE,0
.LOOP_WTT4:
DEC DE
LD A,D
OR E
JR NZ,.LOOP_WTT4
JR .erb1
; **********************************
; ===== Point 5 =========
; **********************************
POST_5_OK:
LD A,(TABLE_X.v5) ;rdlow-ok
OUT (Z84.PIO.Port_A.Data),A ; ¢ë¢¥á⨠"5"
; **********************************
; POST § ¢¥à襭
; **********************************
ENDMODULE
;FLASH_LIGHT
MODULE SET_CONFIG_ID
IN A,(SLOT3)
EX AF,AF' ; SAVE PAGE3
;NO_SUMX_EQ:
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
XOR A
ADD IX,SP ; ¢®ááâ ­®¢¨âì §­ ç¥­¨¥ ¯¥à¥¤ ­­®¥ § £àã§ç¨ª®¬ ª®­äë (¥á«¨ áâ àâ ¯®á«¥ à¥á¥â )
; í⮬ ¬¥á⥠㠭 á IX:IY ¨§ Loader.asm
; „®â é¨«¨ ¤® á ¬¥âªã ®â «® ¤¥à , ¯®ª  ­¥ ¨á¯®«ì§ã¥âáï
;[x] 31/12/2023 ¯®¤áâà å®¢ª  ®â ­¥¤®ãâ¥çª¨ ¯ ¬ïâ¨
LD D,YH
LD E,YL
EX DE,HL
LD DE,SP2000_Loader_Flag
SBC HL,DE
JR NZ,.no_conf_reload
;
LD D,XH
LD E,XL
EX DE,HL
LD DE,ACEX.Config_ID.Sp2000
SBC HL,DE
JR NZ,.no_conf_reload
;
LD A,#80
.no_conf_reload:
LD R,A
;
; !TODO number from loader
; LD A,YL
; LD L,A
; LD A,YH
; LD H,A
; LD BC,#0107 ; !!!!! áà ¢­¨âì á 0107h ¢ë­¥á⨠à¥ä¥à¥­á®¬ âãâ ¨ ¢ loader.asm
; AND A ; ¥á«¨ à ¢­® - ¯à®è«  ¯¥à¥§ £à㧪 
; SBC HL,BC
;JR Z,set_config ;!TODO  ªâ¨¢ æ¨ï ¬¥âª¨ IX:IY ¨§ «® ¤¥à 
;LD IX,ACEX.Config_ID.Sp97_2
LD HL,ACEX.Config_ID.Sp2000
set_config:
LD (SYS_PAGE.CONFIG_BYTE),HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
;LD (SYS_PAGE.CONFIG_BYTE),IX ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
;LD HL,(SYS_PAGE.CONFIG_BYTE) ; ¢§ïâì ­®¬¥à ¯à®è¨¢ª¨ ¢ HL
;
LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
LD (SYS_PAGE.CONFIG_DE),A
EX AF,AF'
OUT (SLOT3),A ; Restore SLOT3
ENDMODULE
;*********************************
; ¯¥à¢ ï ¨­¨æ¨ «¨§ æ¨ï áâà ­¨æ:
; SLOT3=0, SLOT2=2, SLOT1=5, SLOT0=0
XOR A
OUT (RGADR),A
OUT (RGMOD),A
OUT (SLOT3),A
OUT (SLOT0),A
LD A,5 ; !HARDCODE page 5
OUT (SLOT1),A
LD A,2 ; !HARDCODE page 2
OUT (SLOT2),A
;*********************************
; Don't use stack (SP) before this point if it`s normal booting!!!
LD SP,#C000 ; <20> ç «® ¨á¯®«ì§®¢ ­¨ï á⥪ !!!
PUSH HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
CALL PORTS_INIT ; ¨­¨æ¨ «¨§¨à®¢ âì ¯®àâë
XOR A
OUT (BorderColor),A
CALL EMM.CheckColdInit ; ¨­¨æ¨ «¨§ æ¨ï ¯ ¬ïâ¨
POP HL ; ª®­ä¨£ãà æ¨ï
;JR Reset_Handler.start
;[---------------------------------------------------------------------]
;
;**************************************
;
MODULE Prepare_For_Setup
Set_ALL_Mode: LD A,#FF
LD BC,Port_All_Mode
OUT (C),A
Set_Default_Screen:
CALL FN_SYNC.INT_DEF ; set default int
ld a,128+4 ; !HARDCODE
;ld c,BIOS.FN_SYNC
;RST_to_BIOS_18 ; set default vsync
CALL FN_SYNC ; set default vsync
Setup_to_RAM: LD HL,Setup_Starter.Start
LD DE,COMPILE_ADDR.SETUP_STARTER
LD BC,Setup_Starter.Length
LDIR
; ­  á⥪ ª« ¤ñâáï  ¤à¥á ¢®§¢à â  ¨ ¤ «ìè¥ â é¨âáï ¢á直¬¨ ª®áâë«ï¬¨, ç⮡ ¢¥à­ãâìáï ­ § ¤
CALL Setup_Starter.Exec ; #C000
PrepareToZX: ; Setup HDD drives for ZX Spectrum mode
DI
LD D,CMOS_CELL.TRDOSmount
CALL CMOS_RD
AND %1010'1010 ; ¬ áª  ¤«ï 4-å HDD
JR Z,.start_zx
; find first good partition
;
IN A,(SLOT3)
EX AF,AF
LD A,SYS_PAGE
OUT (SLOT3),A
;
XOR A
LD H,A
LD L,A
LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL
LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL
EX AF,AF
OUT (SLOT3),A
EX AF,AF
.loop: CALL FN_HDD_PART
JR NC,.start_zx
POP AF
INC A
CP #10
JR C,.loop
; ¢ë室 ¢ ०¨¬ zx spectrum
.start_zx: JP ZX_SPECTRUM_MODE
ENDMODULE
;***********************************
; ˆ­¨æ¨ «¨§ æ¨ï ¯®à⮢
PORTS_INIT:
; ¢ª«îç¨âì TURBO
LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
OUT (CNF_PORT.vBIOS),A
; ; RESET to ISA
; LD BC,PORT_ISA
; LD A,#FF
; OUT (C),A
; .isa_reset:
; DEC A ;!FIXIT ¬®¦¥â ã¡à âì æ¨ª« ®¦¨¤ ­¨ï ¨ § ¯ã«¨âì 0 ¢ ¨áã ¯®á«¥ ¨­¨â  ª« ¢ë?
; JR NZ,.isa_reset
; OUT (C),A
;
; ˆ­¨æ¨ «¨§ æ¨ï ¯®á«¥¤®¢ â¥«ì­®£® ¯®àâ  ª« ¢¨ âãàë
; reg 0
XOR A ;LD A,0
OUT (Z84.SIO.Ch_A.Ctrl),A
; reg 4
LD A,4
OUT (Z84.SIO.Ch_A.Ctrl),A
;INC A ;LD A,5
OUT (Z84.SIO.Ch_A.Ctrl),A
; reg 3
LD A,3
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#C1
OUT (Z84.SIO.Ch_A.Ctrl),A
; reg 5
LD A,5
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#62 ;60, 61
OUT (Z84.SIO.Ch_A.Ctrl),A
; reg 1
LD A,1
OUT (Z84.SIO.Ch_A.Ctrl),A
DEC A ;LD A,0 ; #18 ¢ª«î祭¨¥ ¯à¥à뢠­¨©
OUT (Z84.SIO.Ch_A.Ctrl),A
.mouse: ; ˆ­¨æ¨ «¨§ æ¨ï ¬ëè¨
; ˆ­¨æ¨ «¨§ æ¨ï â ©¬¥à  ¬ëè¨
LD A,#55
OUT (Z84.CTC.Ch_0),A
LD A,#2D
OUT (Z84.CTC.Ch_0),A
; reg 0
XOR A ;LD A,0
OUT (Z84.SIO.Ch_B.Ctrl),A
; reg 4
LD A,4
OUT (Z84.SIO.Ch_B.Ctrl),A
;LD A,#45
LD A,#40
OUT (Z84.SIO.Ch_B.Ctrl),A
; reg 3
LD A,3
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,#41
OUT (Z84.SIO.Ch_B.Ctrl),A
; reg 5
LD A,5
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,#E0
OUT (Z84.SIO.Ch_B.Ctrl),A
; reg 1
LD A,1
OUT (Z84.SIO.Ch_B.Ctrl),A
DEC A ;LD A,0
OUT (Z84.SIO.Ch_B.Ctrl),A
; ˆ­¨æ¨ «¨§ æ¨ï ¯ à ««¥«ì­®£® ¯®àâ  1 (¯à¨­â¥à)
; ¤«ï POST-Tester- 
LD A,#CF ; BITS I/O
OUT (Z84.PIO.Port_A.Command),A
XOR A
OUT (Z84.PIO.Port_A.Command),A ; ALL - out
OUT (Z84.PIO.Port_A.Data),A ; DATA - all zeros
; ¤«ï printer-a
LD A,#0F ; OUT
OUT (Z84.PIO.Port_A.Command),A
OUT (Z84.PIO.Port_A.Command),A
; ˆ­¨æ¨ «¨§ æ¨ï ¯ à ««¥«ì­®£® ¯®àâ  2 (INT/DMA ISA)
LD BC,Z84.PIO.Port_B.Command ;⮫쪮 ç¥à¥§ ॣ¨áâà BC, ¨­ ç¥ €«ìâ¥à  ¯¥à¥å¢ â¨â
LD A,#CF ; BITS I/O
OUT (C),A
LD A,#3F
OUT (C),A
LD A,#C0
OUT (Z84.PIO.Port_B.Data),A
; "‡ £«ã襭¨¥" ª®¢®ªá  ¨ à¥á¥â ISA
; à¥á¥â ISA ç áâì 1
LD BC,PORT_ISA
LD A,#FF
OUT (C),A
; £«ã訬 ª®¢®ªá
;XOR A
;OUT (CBL.SYS_PORT),A
;LD BC,CBL.OUT
LD BC,0
LD A,#80
.CBL_MUTE: OUT (C),A
DJNZ .CBL_MUTE
; à¥á¥â ISA ç áâì 2 ¯®á«¥ ­¥¡®«ì让 ¯ ã§ë
LD BC,PORT_ISA
XOR A
OUT (C),A
; ‘¡à®á ª®­â஫«¥à  ¤¨áª®¢®¤ 
; ‚ª«îç¨âì ¤®áâ㯠ª ª®­â஫«¥àã ¤¨áª  (âà¥âìï ª®­ä )
LD A,CNF_PORT.CNF_3 + ROM.BIOS
OUT (CNF_PORT.vBIOS),A
OUT (FDC_93.DrvCTRL),A
push hl
pop hl
LD A,#3C ;!HARDCODE ª®¬ ­¤  ¤«ï ƒ93
OUT (FDC_93.DrvCTRL),A
push hl
pop hl
XOR A
OUT (FDC_93.Command),A
; ‚몫îç¨âì ¤®áâ㯠ª ª®­â஫«¥àã ¤¨áª 
LD A,CNF_PORT.CNF_0 + vROM.BIOS
OUT (CNF_PORT.vBIOS),A
; set HDD1/not-HDD2
LD A,IDE.Chanel.Primary
OUT (IDE.Chanel.Set),A
LD BC,#7FFD
XOR A
OUT (C),A ; BASIC_48 mode
LD B,#1F
LD A,2
OUT (C),A ; RAM-0 mode !!!
; ®ç¨á⪠ ¡ãä¥à®¢ ª« ¢¨ âãàë ¨ ¬ëè¨ ¢ SIO
CALL .clean_kbd_buf
JR .clean_mouse_buf
.clean_kbd_buf: ; Clearing the keyboard buffer
IN A,(Z84.SIO.Ch_A.Ctrl)
RRCA
RET NC
IN A,(Z84.SIO.Ch_A.Data)
JR .clean_kbd_buf
.clean_mouse_buf:; Clearing the mouse buffer
IN A,(Z84.SIO.Ch_B.Ctrl)
RRCA
RET NC
IN A,(Z84.SIO.Ch_B.Data)
JR .clean_mouse_buf
;---------------------------------------
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; paths from project DIR
INCLUDE 'FUNC_4x.ASM'
INCLUDE 'FUNC_CMOS.ASM'
INCLUDE 'BIOS_FUNC.ASM'
INCLUDE 'FUNC_SERVICE.asm'
INCLUDE 'FLEX.asm'
; INCLUDE 'EXP_SCR.ASZ'
INCLUDE 'FUNC_PIC.ASM'
INCLUDE 'FUNC_RAM_ROM_DRV.ASM'
INCLUDE 'FUNC_SYS.ASM'
INCLUDE 'FUNC_FOR_TRDOS.ASM'
INCLUDE 'FUNC_5x.asm'
INCLUDE 'FUNC_LOW_PRINT.ASM'
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; ####################################
; #::::::::::::::::::::::::::::::::::#\
; #::::: Œ¥áâ® ¤ ­­ëå ¤«ï DCP :::::::#\
; #::::::::::::::::::::::::::::::::::#\
; ####################################\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DCP_DATA: INCLUDE 'DCP.ASM'
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;
; #-2kb-##############################
; #::::::::::::::::::::::::::::::::::#\
; #:::: ‡¤¥áì ¬¥áâ® ¤«ï IBM-ZG ::::::#\
; #::::::::::::::::::::::::::::::::::#\
; ####################################\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ZG_ADDRESS: INCLUDE 'FONT.ASM'
;-----------------------------------------------------------------------;
;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
;!TODO § ¤¥©á⢮¢ âì
GOTO_SPEC:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,B
LD (SYS_PAGE.CONFIG_DE+1),A
EX AF,AF'
OUT (SLOT3),A
;NO_SETUP_2:
; CP #FC
; JR Z,SPECTRUM_0 ; Š®­ä¨£ãà æ¨ï AY
;NO_SETUP_1:
;!TODO ᤥ« âì  ªâ¨¢ æ¨î ¢¨­â  ¤«ï ¯ à ¬¥âà  ¨§ Setup
ZX_SPECTRUM_MODE:
LD A,#FE ; !HARDCODE ᤥ« âì ç¥à¥§ ¬¥âªã ACC-off Spectrum-MODE
LD BC,Port_All_Mode
OUT (C),A
;SND_TEST_RET:
LD SP,#BFFF
CALL FN_SYNC.INT_PENT
CALL SET_PAL_ZX
LD E,0
CALL LP_SET_32
;
LD E,0
LD HL,#5104
CALL LP_SET_32.X
; ????? ¬®¦­® ¨á¯®«ì§®¢ âì ª®£¤ -­¨¡ã¤ì ª ª-­¨¡ã¤ì
; LD D,#35
; CALL CMOS_RD
; BIT 0,A
; PUSH AF
; CALL Z,SPRINTER_1
; POP AF
; PUSH AF
; CALL NZ,AY8910
; POP AF
SPECTRUM_0:
XOR A ; § ¤ ç  0, ०¨¬ 256 ª¨«®¡ ©â
SPECTRUM_TASK:
LD IX,BASIC_128
JP INIT_PAGES ; ¨­¨æ¨ «¨§ æ¨ï ­®¬¥à®¢ áâà ­¨æ ०¨¬  ᯥªâà㬠
;start_basic:
BASIC_128:
LD SP,#C000
LD HL,RES128_PROG
LD DE,ZX_VARS.PRINTER_BUFFER ; § ¯ã᪠¯à®£à ¬¬ë ­  BASIC-¥.
LD BC,LEN_RES128
LDIR
DI
JP ZX_VARS.PRINTER_BUFFER
;-----------------------------------------------------------------------;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
;
;
;>$< >$< >$< >$< >$< >$< [ <20><EFBFBD>…Œ…™€…Œ އ“ ] >$< >$< >$< >$< >$< >$< ;
;--------[ <20>ணࠬ¬ , à §¬¥é ¥¬ ï á #5B00 ¤«ï § ¯ã᪠ Spectrum ]--------;
RES128_PROG:
DISP ZX_VARS.PRINTER_BUFFER ;#5B00
LD A,vROM.BIOS
OUT (CNF_PORT.vZX_ROM),A ; ‚®§¢à â ¢ 128k ROM
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (SLOT3),A
LD DE,(SYS_PAGE.CONFIG_DE)
XOR A
LD (SYS_PAGE.CONFIG_DE+1),A
OUT (C),B
LD BC,#1FFD
OUT (C),A ; Scorp ¯®àâ
LD B,#7F
OUT (C),A ; 128 ¯®àâ
LD A,E ; ãáâ ­®¢ª  ª®­ä¨£ãà æ¨¨ ¨ ०¨¬  TURBO
OUT (CNF_PORT.vZX_ROM),A ; CONFIG_SET
INC D
DEC D
; 0 ‚•Ž„ BASIC-128
JP Z,0
; 1 ‚•Ž„ BASIC-48
LD A,#10
OUT (C),A
DEC D
JP Z,0
; 2 ‚•Ž„ TR-DOS
LD HL,0
PUSH HL
DEC D
JP Z,#3D29
; 3 ‚•Ž„ EXPANSION
;!TODO ¯®ª  ­¥ à ¡®â ¥â. Page #45, BIOS (ZX_EXP) #E0
XOR A
OUT (C),A
LD A,#02
LD B,#1F
OUT (C),A
DEC D
JP Z,0
;
XOR A
OUT (C),A
LD A,#30
LD B,#7F
OUT (C),A
;!TEST
LD A,CNF_PORT.PENT_RESET + CNF_PORT.SCORP_RESET
OUT (CNF_PORT.OFF),A
;
DEC D
; 4 ‚•Ž„ TR-DOS á § ªàëâ묨 128-¬¨ ¯®àâ ¬¨
JP Z,#3D29
; 5 ‚•Ž„ BASIC-48 á § ªàëâ묨 128-¬¨ ¯®àâ ¬¨
JP 0
ENT
LEN_RES128 EQU $-RES128_PROG
;-----------------------------------------------------------------------;
;----------------------------[Setup Starter]----------------------------;
MODULE Setup_Starter
; ¯à®£à ¬¬ , à §¬¥é ¥¬ ï ¯®  ¤à¥áã #C000
; ¤«ï § ¯ã᪠ Setup
Start:
DISP COMPILE_ADDR.SETUP_STARTER
Exec:
LD A,CNF_PORT.CNF_0 + vROM.EXTENSION
OUT (CNF_PORT.vBIOS),A
LD HL,ROM_MAP.SETUP
LD DE,MEM_MAP.SETUP
LD BC,BLOCK_Setup.Length
LDIR
LD A,CNF_PORT.CNF_0 + vROM.BIOS
OUT (CNF_PORT.vBIOS),A
LD A,#FF ; !HARDCODE
LD BC,Port_All_Mode
OUT (C),A ; keyboard int & acc on, zx_screen & original waits off (for conf >= 3.05)
;----------------------[]
DI
POP HL ;  ¤à¥á ¢®§¢à â  ¢ EXP ¨§ SETUP
LD SP,#8000 ;!HARDCODE
PUSH HL
JP SETUP_MAIN
ENT
Length EQU $-Setup_Starter.Start
ENDMODULE
;-----------------------------------------------------------------------;
;---------------------[ ‡€ƒ‹“˜Šˆ „‹Ÿ #41 <E28098><EFBFBD>ˆ]----------------------;
;-------------[RST 08]
RAM_BIOS_PROG: ; for CALL BIOS in #41 page
DISP Spec_Page.to_bios
PUSH AF
LD A,vROM.BIOS
OUT (CNF_PORT.vBIOS),A
POP AF
RET
ENT
.Length EQU $-RAM_BIOS_PROG
;-------------------[]
;
;-------------[RST 38]
PROG_NO_ROM:
DISP Spec_Page.no_zx_rom
DI
;
LD A,#FF
OUT (SLOT3),A
OUT (SLOT2),A
OUT (SLOT1),A
;
LD SP,#BF00
;
LD E,0
LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
RST ToBIOS
;
LD DE,0
LD HL,#2050
LD C,BIOS.LP_CLS_WIN
RST ToBIOS
; set scr-2
LD A,1
OUT (SCREEN_SWITCH),A
;
LD HL,MESSAGE_NR
LD DE,#A000
LD BC,MESSAGE_NR.size
LD A,C
LDIR
;
LD HL,#A000
LD D,0 ; delimiter
LD E,COLORS.CGA.FLASH + COLORS.CGA.INC.RED
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
;
.loop: DI
HALT
JR .loop
;
MESSAGE_NR: DZ " Spectrum ROM not installed. Use spectrum.exe Press Ctrl+Alt+Del or RESET"
.size EQU $-MESSAGE_NR
ENT
PROG_NO_ROM.size EQU $-PROG_NO_ROM
;-------------------[]
;-----------------------------------------------------------------------;
;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<;
;
;
; !FIXIT ᤥ« âì í⨠䨪á¨à®¢ ­­ë¥  ¤à¥á  ®â¤¥«ì­ë¬ ä ©«®¬ ¨ á IF/ELSE ¨ ¯®¤ª«îç âì ¨å ¯®â®¬ ªã¤  ­ ¤®.
;
;????? ¯®á¬®âà¥âì
;----------------------------------------------------------------------;
; BLOCK #3CC0-$,255
; no-magics!
;MAGIC_1: ; ‡€ƒ‹“˜Š€ „‹Ÿ MAGIC
; PUSH AF
; LD A,ROM.EXT
; OUT (SYS_PORT.OFF),A
; POP AF
; JP MAGIC_1
;MAGIC_3:
; PUSH AF
; LD A,ROM.EXT
; OUT (SYS_PORT.OFF),A
; POP AF
; RETN
;MAGIC_2:
;; CALL MG_BEGIN
; JR MAGIC_3
;*************************
_mInfoBLOCK #3CE0-$,0
SW_ROM_1:
LD HL,#259F ;!HARDCODE Show Main Menu in BASIC-128
PUSH HL
LD HL,#5B00 ;!HARDCODE
LD A,(HL)
CP #F5 ; #F5 - ®¯ª®¤ 'PUSH AF'. <20>஢¥àï¥âáï â® «¨ ¢ #5B00
JR Z,JP_HL_48 ; އ<E280A1> Š Œ…<C592>ž BASIC128
POP HL
JR SW_ROM ; <20><>ŽŽ‰ އ<E280A1>
;*************************
; BLOCK #3CF0-$,0
;JMP_48:
; LD HL,00h
; JR JP_HL_48
;
; NOP
; NOP
; NOP
;***************************************
_mInfoBLOCK #3CF8-$,0
; no basic-48!
JP_HL_48: ;!FIXIT assert with ROM
PUSH HL
SW_ROM: ;!FIXIT assert with ROM
PUSH AF
LD A,vROM.BIOS
OUT (CNF_PORT.vZX_ROM),A
POP AF
RET
;***************************************
;----------------------------------------------------------------------;
;
;!TODO ᯥªâà㬮¢áª¨¥ ã⨫¨âë
;----------------------------------------------------------------------;
; _mInfoBLOCK #3CFA-$,#FF
; LD A,0 ;!HARDCODE
; OUT (SYS_PORT.OFF),A
; POP AF
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
_mInfoBLOCK #3D00-$,#FF
DOS_ON: NOP
RET
;***************************************
;***************************************
; BLOCK #3D02-$,FF
; !TODO ¬®¦­® ®¯à¨å®¤®¢ âì âãâ 17 ¡ ©â®¢
;
;***************************************
;***************************************
_mInfoBLOCK #3D13-$,#FF
NOP
JP ToBIOS_18
;***************************************
;***************************************
; BLOCK #3D17-$,FF
; !TODO ¬®¦­® ®¯à¨å®¤®¢ âì âãâ 233 ¡ ©â 
;
;***************************************
;***************************************
_mInfoBLOCK #3E00-$,#FF
DOS_OFF:
PUSH AF
LD A,R
DI
PUSH AF
PUSH BC
;
LD BC,(#5BFF) ; !HARDCODE
LD A,#C9 ; Opcode RET
LD (#5BFF),A ; !HARDCODE
CALL #5BFF ; !HARDCODE
LD (#5BFF),BC ; !HARDCODE
;
POP BC
POP AF
JP PO,.no_EI
EI
.no_EI: POP AF
RET
;***************************************
;***************************************
; BLOCK #3E16-$,FF
; !TODO ¬®¦­® ®¯à¨å®¤®¢ âì âãâ 10 ¡ ©â®¢
;
;***************************************
////////////////////////////////////////////////////////////////////////
;------[ ; !TODO çâ®- â® á¢ï§ ­­®¥ á ¯¥à¥¬¥­­ë¬¨ LIB_TABLE ; ]------
; _mInfoBLOCK #3E20-$,#FF
; [x]
FN_LIB:
SCF
RET
//
// IN A,(SLOT3)
// LD B,A
// LD A,SYS_PAGE
// OUT (SLOT3),A
// PUSH HL
// LD L,C ; ¤¥è¥äà â®à API ¨§¬¥­¨«áï ¨ ⥯¥àì ¢ C ­¥ â®, çâ® âãâ ®¦¨¤ ¥âáï. ަ¨¤ ¥âáï #A0..AF
// LD H,#C1
// LD A,(HL)
// POP HL
// AND A
// SCF
// JR Z,FN_LIB_RET
//
// OUT (SLOT3),A
// LD (#C0FE),SP
// LD SP,#C0F0
// PUSH BC
// CALL #C100 ; !HARDCODE
// POP BC
// LD SP,(#C0FE)
// ; LD A,B
// ; OUT (SLOT3),A
// ; RET
//
//FN_LIB_RET:
// LD A,B
// OUT (SLOT3),A
// ;SCF
// RET
////////////////////////////////////////////////////////////////////////
;----------------------------------------------------------------------;
;
;!TODO ᪮¬¯®­®¢ âì ¨ ¤®¯ ïâì
;----------------------------------------------------------------------;
; ¢å®¤ A - byte
; B - speed_parameter
FN_KBD_OUT:
AND A
LD E,A
LD D,#FF
JP PE,kbd_parity ; ãáâ ­®¢ª  ¯ à¨â¥â  PE/PO ???
LD D,#FE
kbd_parity:
AND A ; ¯¥à¢ë© ¡¨â - start-bit - 0
RL E
RL D ; ¢ DE - 11 ¡¨â ¤«ï ¯¥à¥¤ ç¨
LD C,11
kbd_loop:
LD A,5
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#60
BIT 0,E
JR NZ,no_inv
XOR 2 ; ¤ ­­ë¥
no_inv:
LD L,A
OUT (Z84.SIO.Ch_A.Ctrl),A ; ¢ëáâ ¢¨âì ¤ ­­ë¥
LD A,5
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,L
OR #80 ; ᨭåந¬¯ã«ìá
OUT (Z84.SIO.Ch_A.Ctrl),A ; ¨¬¯ã«ìá ᨭåà®
LD A,B ; speed_par
kbd_loop1:
PUSH HL
POP HL
DEC A
JR NZ,kbd_loop1
LD A,5
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,L
OUT (Z84.SIO.Ch_A.Ctrl),A ; á­ïâì ¨¬¯ã«ìá ᨭåà®
LD A,B ; speed_par
kbd_loop2:
PUSH HL
POP HL
DEC A
JR NZ,kbd_loop2
RR D
RR E
DEC C
JR NZ,kbd_loop
LD A,5
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#60
OUT (Z84.SIO.Ch_A.Ctrl),A ; § ª®­ç¨âì ¯¥à¥¤ çã
AND A
RET
;----------------------------------------------------------------------;
;
;#######################################################################;
;#######################################################################;
;-----------------------------------------------------------------------;
; ROM-Disk pages ; [x]  ªâ¨¢¨à®¢ ­ ROM-DISK
_mInfoALIGN 256,#FF
; BLOCK #3F00-$,#FF
ROM_DISK.Pages.Number:
DB ROM_DISK.Pages.Size ; ç¨á«® áâà ­¨æ
; ã áâà ­¨æ ¢ëáâ ¢«¥­ bit4 ¤«ï ª®à४⭮© ¯®¤áâ ­®¢ª¨
;(¯®¤à®¡­¥¥ ¢ sp2000.inc - <20>®àâ ã¯à ¢«¥­¨ï áâà ­¨æ ¬¨ <20>‡“)
ROM_DISK.Pages: ; áâà ­¨æë ROM-Disk
DB 0,#10 ; §­ ç¥­¨ï ¤«ï 7FFD ᮮ⢥âáâ¢ãîâ áâà ­¨æ ¬ #48,#49 out (#24),1 : 1ffd = 0.
.Size EQU $-ROM_DISK.Pages
;-----------------------------------------------------------------------;
;#######################################################################;
;
;---------[Return to EXTENSION]---------
_mInfoBLOCK #3FD0-$,#FF ; ToBIOS_FromEXT
; #3FD0
; „«ï ¢ë§®¢  ä㭪権 ¡¨®á  ¨§ áâà ­¨æë 0 <20>‡“ (Extension)
RET_to_EXTENSION:
PUSH AF
LD A,vROM.EXTENSION
OUT (CNF_PORT.vBIOS),A
POP AF
RST ToBIOS_18
JP RET_to_EXTENSION
; !TODO Free 6 bytes
;---------------------------------------
;
;---------------[ Free ]----------------
;
_mInfoBLOCK #3FE0-$,#FF
; !TODO Free 8 bytes and entry point
;SOUND_TEST:
; LD A,ROM.EXPANSION
; OUT (SYS_PORT.ON),A
; JP SND_TEST_RET
;---------------------------------------
;
; [x] new portal
;------------[HDD_5x portal]------------
; â®çª  ¢å®¤ /¢ë室  ¤«ï ä㭪権 5å ¨§ EXP
_mInfoBLOCK #3FE8-$,#FF
EXP_HDD:
PUSH AF
LD A,vROM.EXTENSION
OUT (CNF_PORT.vBIOS),A
POP AF
RET
;---------------------------------------
;
;
;---------------[ Free ]----------------
_mInfoBLOCK #3FF0-$,#FF
; !TODO Free 8 bytes and entry point
;---------------------------------------
;
;
;----[ From TR-DOS to API #80..#FF ]-----
_mInfoBLOCK #3FF8-$,#FF
; ’®çª  ¢å®¤ /¢ë室  ¤«ï TR-DOS
EXP_FNS_RET:
PUSH AF
LD A,vROM.BIOS
OUT (CNF_PORT.vZX_ROM),A ; ’®çª  ¢å®¤ /¢ë室  ¨§/¢ TR-DOS ¯à¨ ¢ë§®¢¥ ä㭪権 BIOS #80..#FF
JP EXP_FNS
;---------------------------------------
;
;
_mInfoBLOCK #4000-$,#FF
;=======================================================================