Sprinter-Core/src/bios/exp/EXP.asm
2024-07-05 20:10:54 +10:00

1808 lines
40 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.1 (C) Sprinter Team
;
;*************************************************************
;***************************************
;*********** BEGIN EXPANSION ***********
;***************************************
; ‚室 ¯® RESET
EXP_START:
JP GLOBAL_RESET
;---------------------------------------
ROM_NUMBER:
.part1: DW MotherBoardID
.part2: DB 0
;---------------------------------------
;---------------------------------------
; 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,ROM.BIOS
OUT (SYS_PORT.RAM),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: IF TEST_INT
;INT:
PUSH BC
PUSH AF
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
LD A,(SYS_PAGE.INT_ID)
CP #AA
JR Z,YESINT
OUT (C),B
JP NOINT
YESINT: PUSH HL
LD HL,(SYS_PAGE.INT_ADRESS)
LD A,H
OR L
LD A,(SYS_PAGE.INT_PAGE)
OUT (C),B
PUSH DE
CALL NZ,EXTINT
POP DE
POP HL
NOINT: POP AF
POP BC
EI
RETI
ELSE
; PUSH AF
; 1: DEC A
; JR NZ,1B
; POP AF
EI
RETI
ENDIF
;RST10:
; CALL_48 10h
; RET
;=======================================
;=======================================
IFN TEST_INT
_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"
ENDIF
;=======================================
;
;
;=======================================
IFN TEST_INT
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
ENDIF
;=======================================
_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 ; [ ] 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
; ;=======================================
; BLOCK #100-$,0
;=======================================
IF TEST_INT
_mInfoALIGN #10,0
; any adress < #C0 with mask %xxxx0000
; â ¡«¨æ  ¤«ï Sprinter POST-Tester-a
TABLE_X: ; â ¡«¨æ  ¤«ï Sprinter POST-Tester-a
.v0: DB %00101000 ; "0" a
.v1: DB %10111101 ; "1" ___
.v2: DB %00110010 ; "2" f | g | b
.v3: DB %00110100 ; "3" |___|
.v4: DB %10100101 ; "4" e | | c
.v5: DB %01100100 ; "5" |___|
.v6: DB %01100000 ; "6" d
.v7: DB %00111101 ; "7"
.v8: DB %00100000 ; "8" a - 7
.v9: DB %00100100 ; "9" b - 6
.vA: DB %00100001 ; "A" f - 4
.vB: DB %11100000 ; "B" g - 3
.vC: DB %01101010 ; "C" e - 2
.vD: DB %10110000 ; "D" c - 1
.vE: DB %01100010 ; "E" d - 0
.vF: DB %01100011 ; "F"
ENDIF
;=======================================
;
;
;=======================================
IF TEST_INT
RESTARTS EQU #FFE0
; ¯®«­ë© ¯¥à¥å¢ â à¥á¥â  áà §ã ¯®á«¥ ¯à®«¨¢ª¨ ª®­äë ¨ CAD.
; § ª¨¤ë¢ ¥âáï ¢ ª àâã ¯®à⮢, ¯®í⮬㠨ᯮ«ì§®¢ âì ­ ¤® å¨âà®.
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
ENDIF
;=======================================
;
;
;-----[¯¥à¥å¢ â RESET ­¥ á®áâ®ï«áï]-----
NO_RESTART:
; á⥪ ¥éñ ­¥ ¨á¯®«ì§ã¥¬!!!
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
;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
IF TEST_INT
;----------------[int]------------------
EXTINT: OR A
RET Z
BIT 7,H
JR Z,.L2
LD C,SLOT2
BIT 6,H
JR Z,.L1
LD C,SLOT3
.L1: IN B,(C)
PUSH BC
OUT (C),A
CALL .JPHL
POP BC
OUT (C),B
RET
; ¯à®¢¥àª  ­  ­ã«¥¢®© á«®â
.L2: BIT 6,H
LD C,SLOT1
JR NZ,.L1 ; ¯à®¤®«¦ ¥¬ ¥á«¨ ­¥­ã«¥¢®© á«®â
PUSH HL
LD HL,-.stackDepth - .switchProcedure.size + .patch-2
ADD HL,SP
PUSH HL
LD HL,-.stackDepth - .switchProcedure.size ; memory stack use!
ADD HL,SP ; stack
PUSH HL ;  ¤à¥á ¯à®£à ¬¬ë .readProcedure
LD DE,.switchProcedure ; ¯¥à¥­¥á⨠¯à®£à ¬¬ã ­  á⥪
EX DE,HL
LD BC,.switchProcedure.size
LDIR
RET
; ¯à®æ¥¤ãà , ¯¥à¥­®á¨¬ ï ­  á⥪ ¤«ï ¢ë§®¢  ¯à¥à뢠­¨ï ¯®«ì§®¢ â¥«ï ¨§ SLOT0
; ®áâ®à®¦­¥¥ á PUSH, ¥á«¨ ­ ¤® ¬­®£®, ⮠㢥«¨ç¨¢ © .stackDepth
.switchProcedure:
DEC DE
POP HL
LD (HL),E
INC HL
LD (HL),D
LD C,SLOT0
IN B,(C)
POP HL
PUSH BC
OUT (C),A
XOR A
OUT (SYS_PORT.RAM),A
.patch EQU $+1-.switchProcedure
CALL .JPHL
DI
XOR A
OUT (SYS_PORT.ROM),A
POP BC
OUT (C),B
RET
.JPHL: JP (HL)
.stackDepth EQU 64 ; à ááâ®ï­¨¥ ®â ª®­æ  ¯à®æ¥¤ãàë ¤® ¢¥à設ë á⥪ .
.switchProcedure.size EQU $-.switchProcedure
ENDIF
;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
; ==== 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
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/23 ¯®¤áâà å®¢ª  ®â ãâ¥çª¨ ¯ ¬ïâ¨
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
OUT (SLOT1),A
LD A,2
OUT (SLOT2),A
;*********************************
; Don't use stack (SP) before this point if it`s normal booting!!!
LD SP,#BFFE ; <20> ç «® ¨á¯®«ì§®¢ ­¨ï á⥪ !!!
PUSH HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
CALL PORTS_INIT ; ¨­¨æ¨ «¨§¨à®¢ âì ¯®àâë
XOR A
OUT (BorderColor),A
CALL EMM.CheckColdInit ; ¨­¨æ¨ «¨§ æ¨ï ¯ ¬ïâ¨
POP HL ; ª®­ä¨£ãà æ¨ï
JR Reset_Handler.start
; *************************************
; ‘ç¨â ¥¬, çâ® ¢å®¤ ¢ SETUP ¢á¥£¤  !!!
; *************************************
; LD A,H
; CP #FF
; JR NZ,NO_SETUP_1
; LD A,L
; JR NZ,NO_SETUP_2
;[---------------------------------------------------------------------]
MODULE Reset_Handler
start: DI
IN A,(SLOT3)
PUSH AF
;----[¯¥à¥å¢ â soft reset #EE port]-----
Check_EE_Port:
LD A,ACEX.RET_PORT
LD B,0
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
;LD C,BIOS.SET_PORTS
;CALL @ToBIOS_3D13 ; ¯¥à¥ãáâ ­®¢¨âì ¢­ãâà. ¯®àâ #EE
CALL SET_PORTS
;
LD A,B
AND A
JR Z,Check_Spec_Page
;
OUT (SLOT3),A ; Set restart page
.After_Hard_Rst:
LD HL,(Spec_Page.RET_addr) ; prog address
LD A,(Spec_Page.page_0) ; PAGE0
OUT (SLOT0),A
LD A,(Spec_Page.page_1) ; PAGE1
OUT (SLOT1),A
LD A,(Spec_Page.page_2) ; PAGE2
OUT (SLOT2),A
LD A,(Spec_Page.Reload_Version)
CP #FF
JR Z,.JPHL ; olg logic
; new logic
.ver_2: EXX
LD HL,(Spec_Page.Stack_Point)
LD SP,HL
EXX
AND A
LD A,#FF
LD (Spec_Page.Reload_Version),A
LD A,(Spec_Page.page_3) ; PAGE3
OUT (SLOT3),A
JR Z,.JPHL
PUSH HL
JP EXP_FNS_2_RET
.JPHL: JP (HL)
;
;--[¯¥à¥å¢ â soft/hard reset #41 page]--
Check_Spec_Page:
LD A,Spec_Page
OUT (SLOT3),A
; Check for hardreset flag
LD A,(Spec_Page.flag_R)
CP 'R'
JR NZ,No_Reset_handlers
LD A,(Spec_Page.flag_S)
CP 'S'
JR NZ,No_Reset_handlers
LD A,(Spec_Page.flag_T)
CP 'T'
JR NZ,No_Reset_handlers
;
XOR A
LD (Spec_Page.flag_R),A
JR Check_EE_Port.After_Hard_Rst
;
;---------------------------------------
No_Reset_handlers:
; Check ZX ROMS Loaded
LD A,(Spec_Page.flag_Z)
CP 'Z'
JR NZ,.Load_ZXROMS
LD A,(Spec_Page.flag_X)
CP 'X'
JR NZ,.Load_ZXROMS
;!TEST 31/12/23 ¯®¤áâà å®¢ª  ®â ãâ¥çª¨ ¯ ¬ïâ¨
LD A,R
AND #80
JR Z,No_Need_To_Load_ZXROMS
.Load_ZXROMS:
XOR A
LD R,A
;
; Load ZX ROM's
init_rom_address EQU #8200 ;!HARDCODE
ld hl,init_zx_roms
ld de,init_rom_address
ld bc,init_zx_roms.length
ldir
;
call init_rom_address
;
LD HL,#C000
LD DE,#C001
LD BC,#3FFF
LD (HL),C
LDIR ; § ¡¨âì FF- ¬¨
; áâ ¢¨¬ ¬¥âªã ¥á«¨ ¯à®£à㧨«¨ <20>‡“ ᯥªâà㬠
DEC DE ; Spec_Page.flag_X
LD A,'X'
LD (DE),A
DEC DE ; Spec_Page.flag_Z
LD A,'Z'
LD (DE),A
; ‡ £«ã誠 ¤«ï áâà ­¨æë #41 ­  ¢á直© ¯®¦ à­ë©
LD HL,PROG_NO_ROM
LD DE,#C000 + Spec_Page.no_zx_rom
LD BC,PROG_NO_ROM.size
LDIR
;
LD HL,RAM_BIOS_PROG
LD DE,#C000 + Spec_Page.to_bios
LD BC,RAM_BIOS_PROG.Length
LDIR
No_Need_To_Load_ZXROMS:
POP AF
OUT (SLOT3),A
;
;-------------------------------------------------------------------------------------------------------------------;
;!TODO ᤥ« âì ¢ë¡®à ¢ Setup, çâ® £à㧨âì ¢ v<>‡“ ¯à¨ áâ àâ¥. ‚ à¨ ­âë:
; 1 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ áâ à⥠¥á«¨ ­¥â ä« £  ZX
; 2 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ ª ¦¤®¬ ¯¥à¥§ ¯ã᪥ (¬®¦¥â ¡ëâì ®¯ á­®)
; 3 - <20>¥ £à㧨âì <20>‡“ ᯥªâà㬠, ¨­¨â¨âì áâà ­¨æã #41 ª ª ¢ 3.04
; 4 - <20>¥ £à㧨âì <20>‡“ ᯥªâà㬠, ¨­¨â¨âì áâà ­¨æã #41 â ª, ç⮡ ª®¤ ¢ ­¥© ¯®¤£à㦠« <20>‡“ ᯥªâà㬠 ¯à¨ ®¡à é¥­¨¨
;-------------------------------------------------------------------------------------------------------------------;
ENDMODULE
;
;**************************************
;
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
JP ZX_SPECTRUM_MODE ; ¢ë室 ¢ ०¨¬ zx spectrum
ENDMODULE
;***********************************
; ˆ­¨æ¨ «¨§ æ¨ï ¯®à⮢
PORTS_INIT:
; ¢ª«îç¨âì TURBO
LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
OUT (SYS_PORT.ROM),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 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 (SYS_PORT.ROM),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 + ROM.BIOS
OUT (SYS_PORT.ROM),A
; set HDD1/not-HDD2
LD A,IDE.Chanel.Primary
OUT (IDE.Chanel.Set),A
LD BC,#7FFD
LD A,#10
OUT (C),A ; BASIC_48 mode
LD B,#1F
LD A,01
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_ ;
;
;------------------------[copy zx-roms to zx-pages]---------------------;
; SLOT0 - ROM 8, sys_port - on.
; RAM SLOT0 - page 0
; ¤«ï ०¨¬  zx spectrum
; <E2809A>Ž<C5BD>Ÿ…Ÿ ˆ‡ އ“
; !HARDCODE ­®¬¥à  áâà ­¨æ ¤«ï í¬ã«ïâ®à  <20>‡“
init_zx_roms:
DISP Reset_Handler.init_rom_address
IN A,(SLOT3)
EX AF,AF'
DI
LD A,SYS_PORT.EXTENSION
OUT (SYS_PORT.ROM),A
INC A ;!HARDCODE LD A,2
LD B,3 ; zx-rom number of pages
;
.loop: EXX
;
out (ROM.SLOT0),a
or %0100'0000 ; !HARDCODE ­®¬¥à  áâà ­¨æ ¤«ï í¬ã«ïâ®à  <20>‡“
out (SLOT3),a
and %1011'1111 ; !HARDCODE ­®¬¥à  áâà ­¨æ ¤«ï í¬ã«ïâ®à  <20>‡“
LD HL,0
LD DE,#C000
LD BC,#4000
LDIR
INC A
EXX
DJNZ .loop
xor a
out (ROM.SLOT0),a
OUT (SYS_PORT.ROM),A
EX AF,AF'
out (SLOT3),a
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
LD A,ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128
LD B,#42 ;!HARDCODE page
CALL SET_PORTS
;
LD A,ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48
LD B,#43 ;!HARDCODE page
CALL SET_PORTS
;
LD A,ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS
LD B,#44 ;!HARDCODE page
CALL SET_PORTS
;
; í⨠áâà ­¨æë ¯®ª  ­¥ ¨á¯®«ì§ãîâáï
LD A,ACEX.vROM.BIOS ; ROM-ID - BIOS
;LD B,#45 ;!HARDCODE page
LD B,#41
CALL SET_PORTS
;
LD A,ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1
;LD B,#46 ;!HARDCODE page
LD B,#41
CALL SET_PORTS
;
LD A,ACEX.vROM.BIOS_4 ; ROM-ID - BIOS-2
;LD B,#47 ;!HARDCODE page
LD B,#41
JP SET_PORTS
; ¬®¦­® § ¤¥©á⢮¢ âì ¥éñ 4 áâà ­¨æë ­  ¯®àâë #E4..#E7
ENT
.length EQU $-init_zx_roms
;-----------------------------------------------------------------------;
;
;-----------------------------------------------------------------------;
;!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:
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,#BFFF
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,ROM.BIOS
OUT (SYS_PORT.RAM),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 (SYS_PORT.RAM),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 ¯®ª  ­¥ à ¡®â ¥â
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
;-----------------------------------------------------------------------;
;-------------------------------[ #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
; ¯à®£à ¬¬ , à §¬¥é ¥¬ ï ¯®  ¤à¥áã 0C000h
; ¤«ï § ¯ã᪠ Setup
Start:
DISP COMPILE_ADDR.SETUP_STARTER
Exec:
LD A,CNF_PORT.CNF_0 + ROM.EXTENSION
OUT (SYS_PORT.ROM),A
LD HL,ROM_MAP.SETUP
LD DE,MEM_MAP.SETUP
LD BC,BLOCK_Setup.Length
LDIR
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),A
;-----------[Check SPACE]
LD A,#FE ; !HARDCODE
LD BC,Port_All_Mode ; keyboard int & acc off
OUT (C),A
LD A,high ZXKeys.Line_7
IN A,(ZXKeys)
CPL
AND 1
; ¢ ॣ¨áâॠA ¯¥à¥¤ ñâáï ­ ¦ â  «¨ ª« ¢¨è  SPACE.
; ¯®â®¬ ¯à®¢¥àï¥âáï ¢ main.asm [space_check]
; ¨ ¥á«¨ ­ ¦ â , â® ¯à®¨á室¨â ¨£­®à ¯ à ¬¥âà 
; "<22>ëáâàë© áâ àâ <20>‡“" ¢® ¢à¥¬ï ¯¥à¥§ £à㧪¨
EX AF,AF'
LD A,#FF ; !HARDCODE
OUT (C),A ; keyboard int & acc on, zx_screen & original waits off (for conf >= 3.05)
EX AF,AF'
;----------------------[]
DI
POP HL ;  ¤à¥á ¢®§¢à â  ¢ EXP ¨§ SETUP
LD SP,#8000 ;!HARDCODE
PUSH HL
PUSH AF
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,ROM.BIOS
OUT (SYS_PORT.ROM),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:
PUSH HL
;SW_ROM:
PUSH AF
LD A,ROM.BIOS ;!FIXIT ­¥¯à ¢¨«ì­®¥ ­ §¢ ­¨¥ ª®­áâ ­âë
OUT (SYS_PORT.RAM),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
; [ ]
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:
BYTE ROM_DISK.Pages.Size ; ç¨á«® áâà ­¨æ
; ã áâà ­¨æ ¢ëáâ ¢«¥­ bit4 ¤«ï ª®à४⭮© ¯®¤áâ ­®¢ª¨
;(¯®¤à®¡­¥¥ ¢ sp2000.inc - <20>®àâ ã¯à ¢«¥­¨ï áâà ­¨æ ¬¨ <20>‡“)
ROM_DISK.Pages: ; áâà ­¨æë ROM-Disk
ABYTE #10 #05,#06,#07,#09,#0A,#0B ; 98304 bytes
.Size EQU $-ROM_DISK.Pages
;-----------------------------------------------------------------------;
;#######################################################################;
;
;---------[Return to EXTENSION]---------
_mInfoBLOCK #3FD0-$,#FF ; ToBIOS_FromEXT
; #3FD0
; „«ï ¢ë§®¢  ä㭪権 ¡¨®á  ¨§ áâà ­¨æë 0 <20>‡“ (Extension)
RET_to_EXTENSION:
PUSH AF
LD A,ROM.EXTENSION
OUT (SYS_PORT.ROM),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
;---------------------------------------
;
;!TEST new_api
;------------[HDD_5x portal]------------
; â®çª  ¢å®¤ /¢ë室  ¤«ï ä㭪権 5å ¨§ EXP
_mInfoBLOCK #3FE8-$,#FF
EXP_HDD:
PUSH AF
LD A,ROM.EXTENSION
OUT (SYS_PORT.ROM),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,ROM.BIOS
OUT (SYS_PORT.RAM),A ; ’®çª  ¢å®¤ /¢ë室  ¨§/¢ TR-DOS ¯à¨ ¢ë§®¢¥ ä㭪権 BIOS #80..#FF
JP EXP_FNS
;---------------------------------------
;
;
_mInfoBLOCK #4000-$,#FF
;=======================================================================