Sprinter-Core/src/bios/exp/EXP.asm

1578 lines
35 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
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,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 ; [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
; ;=======================================
; 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 ; ¯à®æ¥¤ãà  ¨­¨æ¨ «¨§ æ¨¨ á ¢®§¢à â®¬ ­  POST_3_OK
; ®è¨¡®ª ­¥â
; ***********************************
; ===== 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
XOR A
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 ;!!!!! ¯®á¬®âà¥âì
JR NZ,POST_5_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_5_ERROR:
; **********************************
; POST § ¢¥à襭
ENDMODULE
; **********************************
;-----------------------------------------------------------------------;
; ¯¥à¢ ï ¨­¨æ¨ «¨§ æ¨ï áâà ­¨æ:
XOR A
OUT (RGADR),A
OUT (RGMOD),A
OUT (SLOT0),A
;free zx pages!
;LD A,ZX_PAGE.SLOT1
;OUT (SLOT1),A
;LD A,ZX_PAGE.SLOT2
;OUT (SLOT2),A
OUT (SLOT2),A ; ZERO_PAGE
DEC A ; SHARED_PAGE
OUT (SLOT1),A
;
LD A,SYS_PAGE
OUT (SLOT3),A
;-----------------------------------------------------------------------;
MODULE SET_CONFIG_ID
;-------------[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 ¯®¤áâà å®¢ª  ®â ­¥¤®ãâ¥çª¨ ¯ ¬ïâ¨
; IY - number from loader
LD D,YH
LD E,YL
EX DE,HL
LD DE,SP2000_Loader_Flag
SBC HL,DE
JR NZ,.no_conf_reload
; IX - number from loader
LD D,XH
LD E,XL
EX DE,HL
LD DE,ACEX.Config_ID.Sp2000
SBC HL,DE
; A = 0
JR NZ,.no_conf_reload
LD A,#80
.no_conf_reload:
LD R,A ; reg R bit7 - ¯à¨§­ ª à ¡®âë «® ¤¥à 
;
; ­  ¢á直© á«ãç ©
LD HL,ACEX.Config_ID.Sp2000
LD (SYS_PAGE.CONFIG_BYTE),HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
;
LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
LD (SYS_PAGE.CONFIG_DE),A
;
ENDMODULE
;-----------------------------------------------------------------------;
; Don't use stack (SP) before this point if it`s normal booting!!!
LD SP,ROM_MAP.EXP.STACK ; <20> ç «® ¨á¯®«ì§®¢ ­¨ï á⥪ !!!
PUSH HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
CALL PORTS_INIT ; ¨­¨æ¨ «¨§¨à®¢ âì ¯®àâë
XOR A
OUT (BorderColor),A
CALL EMM.CheckColdInit ; ¨­¨æ¨ «¨§ æ¨ï ¯ ¬ïâ¨
POP HL ; ª®­ä¨£ãà æ¨ï
; JR Reset_Handler.start
;-----------------------------------------------------------------------;
MODULE Reset_Handler
start: DI
;----[¯¥à¥å¢ â 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
;
; [x] 20/10/2024 ¨£­®à ¯¥à¥å¢ â稪  ¯® ª« ¢¨è¥ 0
LD A,high ZXKeys.Line_4
IN A,(ZXKeys)
RRCA
JR NC,No_Reset_handlers
;
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: LD SP,(Spec_Page.Stack_Point)
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:
XOR A ;!HARDCODE zx page number
OUT (SLOT3),A
ENDMODULE
;-----------------------------------------------------------------------;
MODULE Prepare_For_Setup
Set_ALL_Mode: LD A,Port_All_Mode.DEFAULT
LD BC,Port_All_Mode
OUT (C),A
Set_Default_Screen:
CALL FN_SYNC.INT_DEF ; set default int
ld a,128+4 ; !HARDCODE
CALL FN_SYNC ; set default vsync
Setup_to_RAM: LD HL,Setup_Starter.Start
LD DE,COMPILE_ADDR.SETUP_STARTER
LD BC,Setup_Starter.Size
LDIR
; ­  á⥪ ª« ¤ñâáï  ¤à¥á ¢®§¢à â  ¨ ¤ «ìè¥ â é¨âáï ¢á直¬¨ ª®áâë«ï¬¨, ç⮡ ¢¥à­ãâìáï ­ § ¤
CALL Setup_Starter.Exec ; #C000
;JP PrepareToZX
ENDMODULE
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
; ;
; ; ç¨á⪠ ¯¥à¥¬¥­­ëå ZX HDD
; 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
; DEC A
; LD (SYS_PAGE.CURRENT_HDD),A
; LD (SYS_PAGE.CURRENT_DIR_DRIVE),A
; LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A
; ;
; EX AF,AF
; OUT (SLOT3),A
; EX AF,AF
; ;
; XOR A
; .loop: PUSH AF
; CALL FN_HDD_PART
; POP BC
; JR NC,.start_zx
; LD A,B
; INC A
; CP #10
; JR C,.loop
; ¢ë室 ¢ ०¨¬ zx spectrum
.start_zx:
; IF FREE_ZX_PAGES
; ­¥ ¤®«¦­® á ¯®¯ áâì
LD B,high BIOS.REINIT.HARD_RESET
JP REINIT
; ELSE ; [x] free zx pages!
; XOR A
; OUT (SLOT2),A ; ZERO_PAGE
; DEC A
; OUT (SLOT1),A ; SHARED_PAGE
; ;LD A,5
; ;OUT (SLOT1),A
; ;LD A,2
; ;OUT (SLOT2),A
; ;
; JP GOTO_SPEC.ZX_MODE
; ENDIF
;***********************************
; ˆ­¨æ¨ «¨§ æ¨ï ¯®à⮢
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,1
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 'BIOS_FUNC.ASM'
INCLUDE 'FUNC_4x.ASM'
INCLUDE 'FUNC_CMOS.ASM'
INCLUDE 'FUNC_SERVICE.asm'
; INCLUDE 'EXP_SCR.ASZ' LP_SCR_MNU
INCLUDE 'FUNC_SCREEN.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'
;-----------------------------------------------------------------------;
;
; !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 BASIC_FN.x128.show_main_menu
PUSH HL
LD HL,#5B00 ;!HARDCODE BASIC_FN.x128.ROM_SWAP
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,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 ;!TODO à ¡®â ¥â ¯à¨ #7FFD[4] = 1. Š ª-â® ã§­ ¢ âì §­ ç¥­¨¥ 7FFD ¨ ¬¥­ïâì?
RET
;***************************************
;***************************************
; BLOCK #3D02-$,FF
; !TODO ¬®¦­® ®¯à¨å®¤®¢ âì âãâ 17 ¡ ©â®¢
;***************************************
;***************************************
_mInfoBLOCK #3D13-$,#FF
NOP
JP ToBIOS_18
;***************************************
;***************************************
; BLOCK #3D17-$,FF
;***************************************
;
; IF FREE_ZX_PAGES
;-----------------------------------------------------------------------;
GOTO_SPEC: PUSH HL
LD HL,RET_TO_BIOS
EX (SP),HL
PUSH HL
LD HL,GOTO_SPECTRUM
EX (SP),HL
JP EXTENSION_FNs
ZX_MEMORY_MANAGER:
PUSH HL
LD HL,RET_TO_BIOS
EX (SP),HL
PUSH HL
LD HL,MANAGE_ZX_PAGES.FN_ENTRANCE
EX (SP),HL
JP EXTENSION_FNs
;-----------------------------------------------------------------------;
;>$< >$< >$< >$< >$< >$< [ <20><EFBFBD>…Œ…™€…Œ އ“ ] >$< >$< >$< >$< >$< >$< ;
;
;---------------------[ ‡€ƒ‹“˜Šˆ „‹Ÿ #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,CNF_PORT.CNF_0
OUT (SYS_PORT.RAM),A
;
LD A,SHARED_PAGE
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.INK.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
;-------------------[]
;-----------------------------------------------------------------------;
;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<;
;-------------------------------[ #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,Port_All_Mode.DEFAULT - Port_All_Mode.SPECTRUM_MODE_OFF ; !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
Size EQU $-Setup_Starter.Start
ENDMODULE
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<;
;
;***************************************
_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:
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
;---------------------------------------
;
; [x] new portal
;------------[Portal to EXT]------------
; â®çª  ¢å®¤ /¢ë室  ¤«ï ä㭪権 ¢ ROM.EXTENSION
_mInfoBLOCK #3FE8-$,#FF
EXTENSION_FNs: ;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
;=======================================================================