Sprinter-BIOS/src/bios/backup/EXP.as
Anatoliy Belyanskiy 0271ac3713 Creation
2023-06-12 05:56:21 +10:00

2253 lines
46 KiB
ActionScript
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.
;
;*************************************************************
;***************************************
; DEVICE ZXSPECTRUM4096 ; ¬®¤¥«ì á 4 ¬¥âà ¬¨ ¯ ¬ïâ¨
; MMU 0 e, 0 ; ­ã«¥¢ ï áâà ­¨æ  ¢ ¡ ­ªã 0 ¨ ¯à®¢¥àª  ­  £à ­¨æë
; OUTPUT './Build/EXP.BIN'
;***************************************
; ORG 0
; DISP 0
;SPRIN2 EQU 2 ; 1 - ¢ª«î祭¨¥ Sprinter-1 ¯¥à¢®© ¯à®è¨¢ª®©
; 2 - ¢ª«î祭¨¥ Sprinter-2 ¯¥à¢®© ¯à®è¨¢ª®©
; INCLUDE '../shared/SPRINT00.asm' ; ª®­áâ ­âë, ¬ ªà®áë..
; INCLUDE 'EXP_VERSION.inc'
;KEMPSTON.JOY_DOS EQU 0FFh
;***************************************
;*********** BEGIN EXPANSION ***********
;***************************************
;A_0000: ; 室 ¯® RESET
EXP_START:
JP GLOBAL_RESET
; DB 0,0
;---------------------------------------
ROM_NUMBER:
.part1: DW MotherBoardID ; 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.EXT
OUT (SYS_PORT.OFF),A
POP AF
JR RST_18_1
;=======================================
;=======================================
BLOCK #10-$,0 ; DSS ???
RST_10:
; JR RST10
;=======================================
;=======================================
BLOCK #18-$,0
; RST18h - MAIN BIOS functions
;
JP EXP_FNS_RST18 ; !TEST new_api
RST_18_1:
CALL EXP_FNS_RST18 ; !TEST new_api
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
;=======================================
;=======================================
_mInfoBLOCK #66-$,0
NMI_Point:
RETN ; १¥à¢ 3 ¡ ©â  ¤«ï ª®¬ ­¤ë JP
NOP
;=======================================
;SET_BIOS_TO_RAM: ; ¯à®£à ¬¬  à ¡®â ¥â ­   ¤à¥á¥ 0C000h
;
; LD SP,0C0C0H
; LD A,0E0H
; LD C,PAGE3
; IN B,(C)
; CALL SET_ROM_PAGES+0C000H
; 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
;=======================================
_mInfoALIGN #10,0
;TABLE_X EQU #A0 ; any adress < #C0 with mask %xxxx0000
; BLOCK TABLE_X-$
TABLE_X: ; â ¡«¨æ  ¤«ï Sprinter POST-Tester-a
.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"
;=======================================
;=======================================
; BLOCK MEM_MAP.ID_Version-$,0 ;#C0-$,0
ID_Version:
dw bitstream_ver_hex ; Version of bitstream hex
ID_SPRINTER_length:
DB ID_SPRINTER.LENGTH
ID_SPRINTER:
DB 'Hardware v'
.bitstream_ver:
DB bitstream_ver_string,0
DB 'Sprinter',0
DB 0
.LENGTH EQU $-ID_SPRINTER
; Check for max length of string
ASSERT ID_SPRINTER.LENGTH < #20, '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
RESTARTS EQU #FFE0 ; !FIXIT ¢ë­¥á⨠¢ SP2000.inc
GLOBAL_RESET:
DI
IM 1
LD HL,RESTARTS
LD DE,RESTARTS_PROG
LD B,RESTARTS_PROG.length
.compare:
LD A,(DE)
CP (HL)
JR NZ,NO_RESTART
INC HL
INC DE
DJNZ .compare
JP RESTARTS
;**********************************
; ¯à®£à ¬¬ , ª®â®à ï ¡ã¤ãç¨ à §¬¥é¥­­®© ¢ #40 áâà ­¨æ¥,
; á  ¤à¥á  RESTARTS, ¯¥à¥å¢ â뢠¥â RESET
; ; ¤¥« âì § £®â®¢ªã á DISP-ENT ­  ¡ã¤ã饥 !!!!!
RESTARTS_PROG: ; !TODO LDConf ¯¥à¥å¢ â à¥á¥â  ­  «î¡®© ª®­ä¥ ¯®á«¥ hardreset
LD HL,RESTARTS ; 3
LD B,16 ; 2
.loop:
LD (HL),0 ; 2
INC HL ; 1
DJNZ .loop ; 2
NOP ; 1
NOP ; 1
; LD A,1 ; 2
; OUT (SLOT3),A ; 2
; ; = 16 bytes
.length EQU $-RESTARTS_PROG
;**********************************
;------------[Setup Starter]------------
MODULE Setup_Starter
; ¯à®£à ¬¬ , à §¬¥é ¥¬ ï ¯®  ¤à¥áã 0C000h
; ¤«ï § ¯ã᪠ Setup
Start:
DISP COMPILE_ADDR.SETUP_STARTER
Exec:
LD A,CNF_0 + ROM.EXPANSION
OUT (SYS_PORT.ON),A
LD HL,ROM_MAP.SETUP
LD DE,MEM_MAP.SETUP
LD BC,BLOCK_Setup.Length
LDIR
LD A,CNF_0+ROM.EXT
OUT (SYS_PORT.ON),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
;---------------------------------------
;SYSTEM_ID_TXT:
; DB "NEW_BIOS"
;-----[¯¥à¥å¢ â 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
OUT (C),A ; 0 register - waits
INC C
OUT (C),A ; set 0 Waits
DEC C
LD A,3 ; 3-rd register - Misc.Control Register
OUT (C),A
INC C
XOR A ; !FIXIT ç¨â âì ¤®ªã ­  Z84, ¢ë¡à âì § ­ç¥­¨¥ ¤«ï A
LD A,1 ; !FIXIT ç¨â âì ¤®ªã ­  Z84, ¢ë¡à âì § ­ç¥­¨¥ ¤«ï A
OUT (C),A ; enable CS0, disable CS1
; no boundary set!
;**********************************
;
;
xor a
out (BorderColor),a
;
;
;**********************************
; ==== POST PROCs =================
MODULE POST_TEST
; *********************************
; ===== 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 %11011111 ; á § ¯ïâ묨
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 0BFh
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,0FFh
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,%11011111
JP OUT_C_BYTE
.erbr1:
LD A,%11011111
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!!!
;NO_NEW_BIOS:
LD IX,0
AND A
ADD IX,SP ; ¢®ááâ ­®¢¨âì §­ ç¥­¨¥ ¯¥à¥¤ ­­®¥ § £àã§ç¨ª®¬ ª®­äë (¥á«¨ áâ àâ ¯®á«¥ à¥á¥â )
;
; í⮬ ¬¥á⥠㠭 á IX:IY ¨§ Loader.asm
;
/*
; „®â é¨«¨ ¤® á ¬¥âªã ®â «® ¤¥à 
; ¯®ª  ­¨ª ª ­¥ ¨á¯®«ì§ã¥âáï
LD A,IYL
LD L,A
LD A,IYH
LD H,A
LD BC,#0107 ; !!!!! áà ¢­¨âì á 0107h ¢ë­¥á⨠à¥ä¥à¥­á®¬ âãâ ¨ ¢ loader.asm
AND A ; ¥á«¨ à ¢­® - ¯à®è«  ¯¥à¥§ £à㧪 
SBC HL,BC
JR Z,set_config
*/
;---------------------------------------
LD HL,#FFFD ; !!!!! Sprinter-2 ¢ë­¥á⨠à¥ä¥à¥­á®¬ âãâ ¨ ¢ loader.asm
set_config:
LD (SYS_PAGE.CONFIG_BYTE),HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
; LD HL,(SYS_PAGE.CONFIG_BYTE) ; ¢§ïâì ­®¬¥à ¯à®è¨¢ª¨ ¢ HL
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 ; <EFBFBD> ç «® ¨á¯®«ì§®¢ ­¨ï á⥪ !!!
PUSH HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
CALL PORTS_INIT ; ¨­¨æ¨ «¨§¨à®¢ âì ¯®àâë
CALL EMM.CheckColdInit ; ¨­¨æ¨ «¨§ æ¨ï ¯ ¬ïâ¨
POP HL ; ª®­ä¨£ãà æ¨ï
JR Reset_Handler.start
; *************************************
; ç¨â ¥¬, çâ® ¢å®¤ ¢ SETUP ¢á¥£¤  !!!
; *************************************
; LD A,H
; CP 0FFH
; JR NZ,NO_SETUP_1
; LD A,L
;-----[IF]-----
; IF SPRIN2 = 2
; CP 0FDH ; Š®­ä¨£ãà æ¨ï Sprinter-2
PG_SP1 equ #EC
PG_SP2 equ #EE
PG_AY equ #EA
; ELSE
; ; CP #FE ; Š®­ä¨£ãà æ¨ï Sprinter-1
; PG_SP1 equ #EE
; PG_SP2 equ #EC
; PG_AY equ #EA
; ENDIF
;--------------
; JR NZ,NO_SETUP_2
MODULE Reset_Handler
start:
IN A,(SLOT3)
push af
;----[¯¥à¥å¢ â soft reset #EE port]-----
Check_EE_Port:
LD A,Conf_port.RET_PORT
LD B,0
LD C,BIOS.SET_PORTS
CALL @ToBIOS_3D13 ; ¯¥à¥ãáâ ­®¢¨âì ¢­ãâà. ¯®àâ #EE
LD A,B
AND A
jr z,Check_Spec_Page
DI
OUT (SLOT3),A ; Set restart page
.After_Hard_Rst:
LD HL,(#FFF4) ; prog address
ld a,(#FFF0) ; PAGE0
OUT (SLOT0),A
LD A,(#FFF1) ; PAGE1
OUT (SLOT1),A
LD A,(#FFF2) ; PAGE2
OUT (SLOT2),A
LD A,(#FFF3) ; PAGE3
OUT (SLOT3),A
jp (HL)
;
;--[¯¥à¥å¢ â soft/hard reset #41 page]--
Check_Spec_Page:
LD A,Spec_Page
OUT (SLOT3),A
LD A,(#FFFE)
CP 'Z'
JR NZ,No_Reset_handlers
LD A,(#FFFF)
CP 'X'
JR NZ,No_Reset_handlers
LD A,(#FFF7)
CP 'R'
JR NZ,Spec_Page_handler_OK
LD A,(#FFF8)
CP 'S'
JR NZ,Spec_Page_handler_OK
LD A,(#FFF9)
CP 'T'
JR NZ,Spec_Page_handler_OK
XOR A
LD (#FFF7),A
JR Check_EE_Port.After_Hard_Rst
;---------------------------------------
No_Reset_handlers:
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- ¬¨
LD HL,PROG_NO_ROM
LD DE,#C000 + #38
LD BC,PROG_NO_ROM.size
LDIR
LD HL,RAM_BIOS_PROG
LD DE,#C000 + #08
LD BC,RAM_BIOS_PROG.Length
LDIR
Spec_Page_handler_OK:
pop af
OUT (SLOT3),A
ENDMODULE
;**************************************
; COPY BIOS Ž RAM ????
;**************************************
;
;**************************************
;
MODULE Prepare_For_Setup
Set_ALL_Mode:
LD A,#FF
LD BC,Port_All_Mode
OUT (C),A
Set_Default_Screen:
CALL INT_DEF ; set default int
ld a,128+4 ; !HARDCODE
ld c,#F2 ; !HARDCODE FN_SYNC
RST #18 ; 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,D_TBON+CNF_0
OUT (SYS_PORT.ON),A
; RESET to ISA
LD BC,ISA_PORT
LD A,#FF
OUT (C),A
.isa_reset:
DEC A
JR NZ,.isa_reset
OUT (C),A
; ˆ­¨æ¨ «¨§ æ¨ï ¯®á«¥¤®¢ â¥«ì­®£® ¯®àâ  ª« ¢¨ âãàë
LD A,0
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,1
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,0 ; 18H ¢ª«î祭¨¥ ¯à¥à뢠­¨©
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,3
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#C1
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,4
OUT (Z84.SIO.Ch_A.Ctrl),A
;------------------------------ ;!!!!! ¯®á¬®âà¥âì
; ld a,5
LD A,7 ; ????? 5/7 ¯ à¨â¥â?
;------------------------------ ;!!!!! ¯®á¬®âà¥âì
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,5
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#62
OUT (Z84.SIO.Ch_A.Ctrl),A
;--------[Clean keyboard buffer]--------
.clean_kbd_buf:
IN A,(Z84.SIO.Ch_A.Ctrl)
BIT 0,A
jr z,.mouse
IN A,(Z84.SIO.Ch_A.Data)
jr .clean_kbd_buf
;---------------------------------------
.mouse:
; ˆ­¨æ¨ «¨§ æ¨ï ¬ëè¨
LD A,0 ; for MOUSE
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,1
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,0
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,3
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,#41
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,4
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,#44
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,5
OUT (Z84.SIO.Ch_B.Ctrl),A
LD A,#E0
OUT (Z84.SIO.Ch_B.Ctrl),A
; ˆ­¨æ¨ «¨§ æ¨ï â ©¬¥à  ¬ëè¨
LD A,85 ; for MOUSE
OUT (Z84.CTC.Ch_0),A
LD A,45
OUT (Z84.CTC.Ch_0),A
; ˆ­¨æ¨ «¨§ æ¨ï ¯ à ««¥«ì­®£® ¯®àâ  1 (¯à¨­â¥à)
; ¤«ï POST-Tester- 
; LD A,0CFH ; 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
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
; "‡ £«ã襭¨¥" ª®¢®ªá 
XOR A
OUT (CBL.SYS_PORT),A
LD BC,CBL.OUT
LD A,#80
.CBL_MUTE:
OUT (C),A
DJNZ .CBL_MUTE
; ¡à®á ª®­â஫«¥à  ¤¨áª®¢®¤ 
; ª«îç¨âì ¤®áâ㯠ª ª®­â஫«¥àã ¤¨áª 
LD A,CNF_3
OUT (SYS_PORT.ON),A
OUT (FDC_93.DrvCTRL),A ; !!!!! £«ï­ãâì
push hl
pop hl
LD A,#3C ; !!!!! £«ï­ãâì
OUT (FDC_93.DrvCTRL),A ; !!!!! £«ï­ãâì
push hl
pop hl
XOR A
OUT (FDC_93.Command),A
; 몫îç¨âì ¤®áâ㯠ª ª®­â஫«¥àã ¤¨áª 
LD A,CNF_0
OUT (SYS_PORT.ON),A
; set HDD1/not-HDD2
LD A,#21 ;!HARDCODE ᤥ« âì ç¥à¥§ ¬¥âªã
OUT (#BC),A ;!HARDCODE
; CALL DOS_OFF
LD BC,#7FFD
LD A,#10
OUT (C),A ; BASIC_48 mode
LD B,#1F
LD A,01
OUT (C),A ; RAM-0 mode !!!
RET
;**************************************
;
;------------------------[copy zx-roms to zx-pages]---------------------;
; SLOT0 - ROM 8, sys_port - on.
; RAM SLOT0 - page 0
; ¤«ï ०¨¬  zx spectrum
; <EFBFBD>Ž<EFBFBD>ŸŸ ˆ Ž
init_zx_roms:
DISP Reset_Handler.init_rom_address
in a,(SLOT3)
push af
DI
LD A,1
OUT (SYS_PORT.ON),A
ld a,2
IF SetFullZXromLoader
ld b,6 ; zx-rom number of pages
ELSE
ld b,4
ENDIF
.loop:
push bc
out (ROM.SLOT0),a
or %01000000
out (SLOT3),a
and %10111111
LD HL,0
LD DE,#C000
LD BC,#4000
LDIR
inc a
pop bc
DJNZ .loop
xor a
out (ROM.SLOT0),a
OUT (SYS_PORT.ON),A
POP AF
out (SLOT3),a
LD A,#E2 ; ROM-ID - BASIC 128
LD B,#42 ; page
CALL .SET_ROM
LD A,#E3 ; ROM-ID - BASIC 48
LD B,#43 ; page
CALL .SET_ROM
LD A,#E1 ; ROM-ID - TR-DOS
LD B,#44 ; page
CALL .SET_ROM
LD A,#E0 ; ROM-ID - EXPANSION
LD B,#45 ; page
CALL .SET_ROM
LD A,#EB ; ROM-ID - BIOS-1
IF SetFullZXromLoader
LD B,#46 ; page
ELSE
LD B,#45 ; page
ENDIF
CALL .SET_ROM
IF SetFullZXromLoader
LD A,#EF ; ROM-ID - BIOS-2
LD B,#47 ; page
CALL .SET_ROM
ENDIF
RET
.SET_ROM:
LD C,BIOS.SET_PORTS
JP ToBIOS_3D13
ENT
.length EQU $-init_zx_roms
;-----------------------------------------------------------------------;
;
;**************************************
;**************************************
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,(#A8)
; OUT (Z84.PIO.Port_A.Data),A
LD A,#FE ; !HARDCODE ᤥ« âì ç¥à¥§ ¬¥âªã ACC-off Spectrum-MODE
LD BC,Port_All_Mode
OUT (C),A
;SND_TEST_RET:
LD SP,#BFFF
CALL INT_PENT
CALL SET_PAL_ZX
LD HL,#4104
LD E,0
LD B,4
CALL LP_OPEN_S
LD HL,#5104
LD E,0
LD B,4
CALL LP_OPEN_S
;*************************************
/*
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 ; ¨­¨æ¨ «¨§ æ¨ï ­®¬¥à®¢ áâà ­¨æ ०¨¬  ᯥªâà㬠
BASIC_128:
;start_basic:
LD SP,#BFFF
LD HL,RES128_PROG
LD DE,#5B00 ; § ¯ã᪠¯à®£à ¬¬ë ­  BASIC-¥.
LD BC,LEN_RES128
LDIR
DI
JP #5B00
;********************************
; <EFBFBD>ணࠬ¬ , à §¬¥é ¥¬ ï ­  5B00h ¤«ï § ¯ã᪠ Spectrum- 
RES128_PROG:
LD A,ROM.EXT
OUT (SYS_PORT.OFF),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.OFF),A ; CONFIG_SET
INC D
DEC D
JP Z,0 ; 0 Ž BASIC-128
LD A,#10
OUT (C),A
DEC D
JP Z,0 ; 1 Ž BASIC-48
LD HL,0
PUSH HL
DEC D
JP Z,#3D29 ; 2 Ž TR-DOS
XOR A
OUT (C),A
LD A,#02
LD B,#1F
OUT (C),A
DEC D
JP Z,0 ; 3 Ž EXPANSION ???
LD A,0
OUT (C),A
LD A,#30
LD B,#7F
OUT (C),A
DEC D
JP Z,#3D29 ; 4 Ž TR-DOS á § ªàëâ묨 128-¬¨ ¯®àâ ¬¨
JP 0 ; 5 Ž BASIC-48 á § ªàëâ묨 128-¬¨ ¯®àâ ¬¨
LEN_RES128 EQU $-RES128_PROG
;*****************************************************
TURBO_OFF:
LD A,D_TBOFF
OUT (SYS_PORT.ON),A
RET
TURBO_ON:
LD A,D_TBON
OUT (SYS_PORT.ON),A
RET
JP_HL: JP (HL)
;***************************************
RAM_BIOS_PROG: ; for CALL BIOS in 41h page
PUSH AF
LD A,ROM.EXT
OUT (SYS_PORT.ON),A
POP AF
RET
NOP
.Length EQU $-RAM_BIOS_PROG
; JR RST_18_1
;
;
PROG_NO_ROM:
DISP #38
DI
LD A,#FF
OUT (SLOT3),A
OUT (SLOT2),A
OUT (SLOT1),A
LD SP,#BF00
LD C,BIOS.LP_OPEN_S
LD B,3
LD E,0
RST ToBIOS
LD C,BIOS.LP_CLS_WIN
LD DE,0
LD HL,#2050
RST ToBIOS
LD A,1
OUT (RGMOD),A ; set scr-2
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.FLASH + COLORS.PAPER.RED + COLORS.INC.CYAN
LD B,A
LD C,BIOS.LP_PRINT_LN3
RST ToBIOS
1: DI : HALT
JR 1B
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
;-------------[new code end]------------
;*****************************************************
;CH_2:
; LD A,2
;C_1601: ; OPEN CHANEL
; CALL_48 1601h
; RET
;PRINT_LINE:
; LD A,(HL)
; INC HL
; CP 0FFh
; RET Z
; RST 10H
; JR PRINT_LINE
; JP RESET_128
;********************************
; *** UTILITES ***
;********************************
;C_0030: ; ¯®«ãç¨âì à ¡ ®¡«
; CALL_48X 0030h
; RET
;C_19E8: ; ®ç¨áâ¨âì à ¡ ®¡«
; CALL_48X 19E8h
; RET
;C_1655: ; ¯®«ãç¨âì ¯à®áâà ­á⢮
; CALL_48X 1655h
; RET
;****************************************
; ******* SERVICE *******
;****************************************
;*******************************************************
; ˜ˆ<EFBFBD>ˆŸ ŠŽŒ<EFBFBD><EFBFBD>Ž <EFBFBD>ŽŠˆ,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ž Ÿ "EXPANSION"
;*******************************************************
;COMAND_LINE:
; LD HL,(CH_ADR)
;COMAND_LOOP:
; LD A,(HL)
; INC HL
; CP ":"
; JR Z,COMAND_L1
; CP 0Dh
; JR NZ,COMAND_LOOP
; RET
;COMAND_L1:
; LD A,(HL)
; CP 0EAh ; REM !!!
; RET NZ
; INC HL
;COMAND_OK: ; Ž<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ŠŽŒ<EFBFBD> Ÿ 'expansion'
; LD A,(HL)
; INC HL
; CP ':'
; JP Z,MENU_S1
; CP 0Dh
; JP Z,MENU_S1
; CP 'I'
; JR Z,COMAND_ISD
; CP 'i'
; JR Z,COMAND_ISD
; CP 'T'
; JR Z,TASK_SWITCH
; CP 't'
; JR Z,TASK_SWITCH
; DEC HL
; POP BC
; JP BASIC_MENU
;MENU_S1:
; POP BC
; CALL SERVICE
; JP SW_ROM_1
;
;COMAND_ISD:
; LD A,(HL)
; INC HL
; CP 'S'
; JP Z,COMAND_ISD2
; CP 's'
; JP Z,COMAND_ISD2
; RET
;COMAND_ISD2:
; POP BC
; CALL ISDOS
; JP SW_ROM_1
;TASK_SWITCH:
;
;; *** ®åà ­¨âì § ¤ çã ***
; PUSH IY
; PUSH IX
; PUSH AF
; PUSH BC
; PUSH DE
; PUSH HL
; EXX
; EX AF,AF'
; PUSH AF
; PUSH BC
; PUSH DE
; PUSH HL
;
; LD A,R
; PUSH AF
; LD A,I
; PUSH AF
;
; LD A,(HL)
; RLCA
; RLCA
; RLCA
; RLCA
; AND 30H ; ­®¢ ï § ¤ ç  0..3
; LD C,A
; IN A,(SLOT3)
; LD B,A ; 3-ï áâà ­¨æ  ⥪ã饩 § ¤ ç¨
; LD A,SYS_PAGE
; OUT (SLOT3),A
;
; LD IX,TASK_DATA ; ¤ ­­ë¥ § ¤ ç
; LD E,(IX) ; áâ à ï § ¤ ç 
; LD D,0
; ADD IX,DE ; ¤ ­­ë¥ ⥪ã饩 § ¤ ç¨
; LD E,16
; ADD IX,DE ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
;
; LD (IX+1),B ; á®åà ­¨âì áâà ­¨æã 3
; LD HL,0
; ADD HL,SP
; LD (IX+2),L ; á®åà ­¨âì á⥪ § ¤ ç¨
; LD (IX+3),H
; SET 0,(IX) ; ãáâ ­®¢¨âì ä« £ á®åà ­¥­­®á⨠⥪ã饩 § ¤ ç¨
; RES 1,(IX) ; ãáâ ­®¢¨âì ä« £, çâ® § ¤ ç  ¯®ª¨­ãâ 
; LD IX,TASK_DATA
; LD E,C
; LD D,0
; ADD IX,DE ; ­®¢ ï § ¤ ç 
; LD E,16
; ADD IX,DE ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
; BIT 1,(IX)
;; JR NZ,TASK_IN_WORK ; § ¤ ç  ¢ à ¡®â¥ ??? ­¥¢¥à­®¥ § ¢¥à襭¨¥
; ; á¡à á뢠âì ¨«¨ ¯à®áâ® ¢®§¢à é âìáï
;
; BIT 0,(IX) ; ¡ë«  á®åà ­¥­ /­¥â
; JR NZ,TASK_SET ; § ¤ ç  áãé¥áâ¢ã¥â
;
;; § ¤ ç¨ ­¥ ¡ë«®!
; LD IX,TASK_DATA
; LD A,C ; § ¤ ç 
; LD (IX),A ; ãáâ ­®¢¨âì ­®¢ãî § ¤ çã ⥪ã饩
;
; JP SPECTRUM_TASK ; § ¯ãáâ¨âì ­®¢ãî § ¤ çã!
; ¨ ¯®ª  ¯®ä¨£ à á¯à¥¤¥«¥­¨¥ ¯ ¬ïâ¨!
;TASK_SET:
;
; LD IX,TASK_RESTORE
; LD A,C
; EXX
; JP INIT_PAGES ; ¯¥à¥ª«îç¨âì ¢á¥ áâà ­¨æë!
;TASK_RESTORE:
; EXX
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD A,C
; LD IX,TASK_DATA
; LD (IX),A ; ãáâ ­®¢¨âì ­®¢ãî § ¤ çã ⥪ã饩
; LD E,A
; LD D,0
; ADD IX,DE ; ­®¢ ï § ¤ ç 
; LD E,16
; ADD IX,DE
; LD L,(IX+2) ; ¢á¯®¬­¨âì á⥪
; LD H,(IX+3)
; LD SP,HL
; LD A,(IX+1) ; ¢á¯®¬­¨âì âà¥âìî áâà ­¨æã
; OUT (SLOT3),A
; POP AF ; ¢®ááâ ­®¢¨âì
; LD I,A
; POP AF
; LD R,A
; POP HL
; POP DE
; POP BC
; POP AF
; EX AF,AF'
; EXX
; POP HL
; POP DE
; POP BC
; POP AF
; POP IX
; POP IY
; ; ¢¥à­ãâìáï ¢ § ¤ çã
;
;NO_TASK:
; POP BC
; JP SW_ROM_1
;
;; 259F - ADRESS BASIC128 - MAIN_MENU
;**********************************************
; paths from project DIR
INCLUDE 'EXP_HDD.asm'
INCLUDE 'SERVICE.asm'
; INCLUDE 'TEST.ASZ'
INCLUDE 'FLEX.asm'
IFN SET_NEWdcp
INCLUDE './src/bios/old_files/EXP_DCP_UNPACKER.asm'
ENDIF
; INCLUDE 'EXP_SCR.ASZ'
INCLUDE 'EXP_PIC2.asm'
IFN SET_NEWdcp
INCLUDE 'EXP_FN2.asm'
ELSE
INCLUDE 'EXP_FN.ASM'
INCLUDE 'EXP_FN2.asm'
ENDIF
;**********************************************
; BLOCK DCP_DATA-$,#FF
;
; #-5kb-##############################
; #::::::::::::::::::::::::::::::::::#\
; #::::: Œ¥áâ® ¤ ­­ëå ¤«ï DCP :::::::#\
; #::::::::::::::::::::::::::::::::::#\
; ####################################\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DCP_DATA:
IFN SET_NEWdcp
INCBIN './src/bios/old_files/EXP_DCP.LZ'
ELSE
INCLUDE 'EXP_DCP_2.ASM'
ENDIF
;**********************************************
;**********************************************
;BLOCK #2800-$,#FF
;
; #-2kb-##############################
; #::::::::::::::::::::::::::::::::::#\
; #:::: ¤¥áì ¬¥áâ® ¤«ï IBM-ZG ::::::#\
; #::::::::::::::::::::::::::::::::::#\
; ####################################\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ZG_ADRESS:
INCBIN 'EXP_FONT.FNT'
;**********************************************
; BLOCK #3000-$,#FF
IFN SET_NEWdcp
INCLUDE 'EXP_FN.asm'
ENDIF
INCLUDE 'EXP_LP2.asm'
;**********************************************
FN_SEND_BYTE:
LD E,A ; á®åà ­¨âì ¡ ©â
CALL SEND_HALF_BYTE ; ¯¥à¥¤ âì ¯®«ã¡ ©â ¨§
RET C ; ¢®§¢à â ¯® ®è¨¡ª¥
LD A,E ; ᤢ¨­ãâì ¡ ©â ­  4 ¡¨â 
RRCA
RRCA
RRCA
RRCA
LD E,A
SEND_HALF_BYTE: ; ¯¥à¥¤ âì ¯®«®¢¨­ã ¡ ©â  _E_!!
LD A,E
OR #F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_SENT_1:
IN A,(KEMPSTON.JOY_DOS) ; ¯à®¢¥à¨âì ¡¨â 4 ­  1 ¯à¨ £®â®¢­®á⨠PC
BIT 4,A
JR NZ,CONTINUE_SENT
DEC BC
LD A,B
OR C
JR NZ,WAIT_SENT_1
XOR A
SCF ; â ©¬- ãâ
RET
CONTINUE_SENT: ; PC - £®â®¢
LD A,E
AND #0F ; á¡à®á¨âì áâ à訥 ¡¨âë LPT -
OUT (Z84.PIO.Port_A.Data),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_SENT_2:
IN A,(KEMPSTON.JOY_DOS) ; ¯à®¢¥à¨âì ¡¨â 4 ­  0 - á®®¡é¥­¨¥ ®â PC
BIT 4,A
JR Z,CONTINUE_SENT2
DEC BC
LD A,B
OR C
JR NZ,WAIT_SENT_2
LD A,E
OR #F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
XOR A
SCF ; â ©¬- ãâ
RET
CONTINUE_SENT2: ; ¯®«ã¡ ©â ¯¥à¥¤ ­
LD A,E
OR #F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
XOR A
RET
;**********************************************
FN_RESEIVE_B: ; ¯à¨­ïâì ¡ ©â ¢ A
CALL RESEIVE_POLU_BYTE ; ¯à¨­ïâì ¯®«ã¡ ©â
RET C ; ¢®§¢à â ¯® ®è¨¡ª¥
RLCA
RLCA
RLCA
RLCA
AND #F0
LD E,A
CALL RESEIVE_POLU_BYTE ; ¢â®à®©
RET C
AND 0Fh
OR E
RET ; ¡ ©â ¯à¨­ïâ
RESEIVE_POLU_BYTE: ; ¯à¨­ïâì ¯®«®¢¨­ã ¡ ©â  ¢
LD A,#F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_RES_1:
IN A,(KEMPSTON.JOY_DOS) ; ¯à®¢¥à¨âì ¡¨â 4 ­  1 ¯à¨ £®â®¢­®á⨠PC
BIT 4,A
JR NZ,CONTINUE_RES
DEC BC
LD A,B
OR C
JR NZ,WAIT_RES_1
XOR A
SCF ; â ©¬- ãâ
RET
CONTINUE_RES: ; PC - £®â®¢, ¦¤ âì 0
XOR A ; á¡à®á¨âì áâ à訥 ¡¨âë LPT - ¦¤¥¬ ¯®«ã¡ ©â
OUT (Z84.PIO.Port_A.Data),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_RES_2:
IN A,(KEMPSTON.JOY_DOS) ; ¯à®¢¥à¨âì ¡¨â 4 ­  0 - á®®¡é¥­¨¥ ®â PC
BIT 4,A
JR Z,CONTINUE_RES2
DEC BC
LD A,B
OR C
JR NZ,WAIT_RES_2
LD A,#F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
SCF
RET ; ®è¨¡ª 
CONTINUE_RES2: ; ¯®«ã¡ ©â ¢ëáâ ¢«¥­
LOOP_EQ: ; ¯à®ç¨â âì ¥é¥ à §, çâ® ¡ë ᮢ¯ «®
AND #0F
LD B,A
IN A,(KEMPSTON.JOY_DOS)
AND #0F
CP B
JR NZ,LOOP_EQ
OR #F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â  ¢ 1 - ¯à¨­ïâ®
OUT (Z84.PIO.Port_A.Data),A
RET
;***************************************
;!!!!! ¯®á¬®âà¥âì
; 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
;*************************
; BLOCK #3CE0-$,0
;SW_ROM_1:
; LD HL,259Fh
; PUSH HL
; LD HL,5B00h
; LD A,(HL)
; CP #F5
; JR Z,JP_HL_48 ; Ž<EFBFBD> Š Œ<EFBFBD>ž BASIC128
; POP HL
; JR SW_ROM ; <EFBFBD><EFBFBD>ŽŽ Ž<EFBFBD>
;*************************
; BLOCK #3CF0-$,0
;JMP_48:
; LD HL,00h
; JR JP_HL_48
;
; NOP
; NOP
; NOP
;***************************************
; BLOCK #3CF8-$,0
; no basic-48!
;JP_HL_48:
; PUSH HL
;SW_ROM:
; PUSH AF
; LD A,ROM.EXT
; OUT (SYS_PORT.OFF),A
; POP AF
; RET
;***************************************
_mInfoBLOCK #3D00-$,#FF
DOS_ON: NOP
RET
;***************************************
;***************************************
; BLOCK #3D02-$,FF
; !TODO ¬®¦­® ®¯à¨å®¤®¢ âì âãâ 17 ¡ ©â®¢
;
;***************************************
;***************************************
_mInfoBLOCK #3D13-$,#FF
NOP
JP #18
;***************************************
;***************************************
; BLOCK #3D17-$,FF
; !TODO ¬®¦­® ®¯à¨å®¤®¢ âì âãâ 233 ¡ ©â 
;
;***************************************
;***************************************
_mInfoBLOCK #3E00-$,#FF
DOS_OFF:
DI
PUSH AF
PUSH BC
LD BC,(#5BFF) ; !HARDCODE
LD A,#C9
LD (#5BFF),A ; !HARDCODE
CALL #5BFF ; !HARDCODE
LD (#5BFF),BC ; !HARDCODE
POP BC
POP AF
RET
;***************************************
;***************************************
;START_HDD:
;
; LD C,2
; CALL EXP_HDD
; RET C
;
; LD A,0
; OUT (0FEH),A
;
; LD HL,4000H
; LD DE,4001H
; LD BC,1AFFH
; LD (HL),0
; LDIR
;
; LD HL,0
; LD IX,LP_SCR_80
; CALL WIN_OPEN_WIN
;
; LD HL,#2050
; LD DE,0
; LD B,07H
; CALL LP_CLS_WIN
;
; LD DE,0
; CALL LP_SET_PLACE
;
; LD HL,ID_SPRINTER
; LD E,47H
; LD B,L_ID
; CALL LP_PRINT_LINE
;
; LD C,0
; CALL EXP_HDD
; RET C
;
; LD DE,1
; LD IX,0
; LD B,16
; LD HL,8000H
; LD C,5
; CALL EXP_HDD
; RET C
; LD HL,8000H
; LD DE,HDD_MSG
; LD B,HDD_MSG_LEN
;START_HDD_L:
; LD A,(DE)
; CP (HL)
; JR NZ,NO_BOOT
; INC HL
; INC DE
; DJNZ START_HDD_L
; JP (HL)
;NO_BOOT:
; RET
;
;HDD_MSG: DB "Starting...",0
;
;HDD_MSG_LEN EQU $-HDD_MSG
;
;HDD_MSG_NO: DB "Boot record not found"
;HDD_NO_LEN EQU $-HDD_MSG_NO
;SAVE_AUTOSTART:
; LD HL,8000H
; LD DE,HDD_MSG
; LD B,HDD_MSG_LEN
;SAVE_AUTO_L1:
; LD A,(DE)
; CP (HL)
; RET NZ
; INC HL
; INC DE
; DJNZ SAVE_AUTO_L1
;
; LD C,0
; CALL EXP_HDD
; RET C
;
; LD HL,8000H
; LD A,0
; LD DE,1
; LD IX,0
; LD B,16
; LD C,6
; CALL EXP_HDD
; 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
*/
;---------------------------------------------------------------[]------
FN_KBD_OUT: ; ¢å®¤ A - byte
; B - speed_parameter
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
; HL -  ¤à¥á, ªã¤  ç¨â âì
; DE - ­®¬¥à ᥪâ®à  (áç¨â âì ¯® 256b ᥪâ®à)
; B - ç¨á«® ᥪâ®à®¢
; A' - à §¬¥à ᥪâ®à  (1 - 256b, 2 - 512 b)
ROM_DISK:
LD C,0 ; áç¥â稪
EX AF,AF'
DEC A
JR Z,.loop
DEC A
SCF
RET NZ
EX DE,HL
ADD HL,HL
EX DE,HL
LD A,B
ADD A,A
LD B,A
RET C
CALL .loop
RET C
AND A
RR D
RR E
XOR A
RET
/*
; ????? ª ª®©-â® £«îª ­¥¤®¤¥« ­­ë©
READ_ROM_PAGE_X:
LD DE,0
LD BC,#100 ; ®¤¨­ ᥪâ®à
PUSH DE
PUSH BC
LD HL,ROM_DISK_PGS
LD DE,#FF00 ; !HARDCODE
LD A,#1F ; last page ROM
JR LOOP_NEXT
*/
.loop:
PUSH DE ; ­®¬¥à ᥪâ®à 
PUSH BC
LD A,E
AND 63 ; ADRESS in ROM-Page
PUSH AF ; á®åà ­¨âì  ¤à¥á
EX DE,HL ; DE -  ¤à¥á ¡ãä¥à 
ADD HL,HL
ADD HL,HL ; H - ­®¬¥à ¡ ­ª¨
LD A,(ROM_DISK.Pages.Number)
INC H
CP H
LD L,H
LD H, high ROM_DISK.Pages.Number ; ROM-Disk pages!
LD A,(HL) ; PAGE-ROM
POP HL ; ¢®ááâ ­®¢¨âì  ¤à¥á ¢ ROM-Page
LD L,0 ; ¥á«¨ ¤ «¥ª® § å®â¥«¨ - ¢ë室 á ®è¨¡ª®©
JR C,.errorExit ; ROM-Disk-end
; DE - ¡ãä¥à
; HL -  ¤à¥á ¢ ROM
; B - ç¨á«® ᥪâ®à®¢
; A - ROM-Page
.loopRead:
DI
PUSH HL ; ®âªã¤ 
PUSH DE ; ªã¤ 
LD HL,-.stackDepth - .readProcedure.size ; memory stack use!
ADD HL,SP ; stack
PUSH HL ;  ¤à¥á ¯à®£à ¬¬ë .readProcedure
LD DE,.readProcedure ; ¯¥à¥­¥á⨠¯à®£à ¬¬ã ­  á⥪
EX DE,HL
LD BC,.readProcedure.size
LDIR ; ¯à®£à ¬¬  ­  á⥪¥
LD BC,#100 ; ¤«¨­  ᥪâ®à 
RET ; ¨á¯®«­¨âì ¯à®£à ¬¬ã .readProcedure, ­  á⥪¥  ¤à¥á  ¡ãä¥à  ¨ ROM
; DE - next address
; HL - ROM address
.readNext:
POP BC ; ç¨á«® ᥪâ®à®¥
INC C ; áç¥â稪 áç¨â ­­ëå ᥪâ®à®¢
DEC B ; ᥪâ®à  ª®­ç¨«¨áì?
JR Z,.normExit
BIT 6,H ; ç⥭¨¥ ­¥ § ª®­ç¥­®
PUSH BC ; á®åà ­¨âì áç¥â稪¨
JR Z,.loopRead ; ç¨â âì ¤ «ìè¥
POP BC
POP HL ; ­®¬¥à ᥪâ®à 
LD A,B
LD B,0
ADD HL,BC
LD B,A ; ¢ëç¨á«¨âì á«¥¤.ᥪâ®à
EX DE,HL ; ⥯¥àì HL -  ¤à¥á, DE ᥪâ®à, B - ᪮«ìª® ¥é¥ ç¨â âì
JP .loop ; ­ ç âì ¢á¥ á­®¢ !
; ç⥭¨¥ § ª®­ç¥­®
.normExit:
POP HL ; ᥪâ®à, ®âªã¤  ¢¥«®áì ç⥭¨¥
ADD HL,BC ; ¯® ¢®§¢à âã: HL - á«¥¤. ¤à¥á
EX DE,HL ; DE - á«¥¤.ᥪâ®à
AND A
RET
; ®è¨¡ª 
.errorExit: ; !TODO ᤥ« âì, ç⮡ ­  ¢ë室¥ ¯®ª §ë¢ «®áì ª®«¨ç¥á⢮ ¯à®ç¨â ­­ëå ᥪâ®à®¢
POP BC
POP DE
SCF
RET
; ¯à®æ¥¤ãà , ¯¥à¥­®á¨¬ ï ­  á⥪ ¤«ï ç⥭¨ï ¨§ ROM-Disk
; ®áâ®à®¦­¥¥ á PUSH, ¥á«¨ ­ ¤® ¬­®£®, ⮠㢥«¨ç¨¢ © .stackDepth
.readProcedure:
POP DE ; ªã¤ 
POP HL ; ®âªã¤ 
OUT (ROM.SLOT0),A ; ROM_PAGE
LDIR ; §¤¥áì ç¨â ¥âáï ¨§ ROM-Disk
LD B,A
XOR A
OUT (ROM.SLOT0),A
OUT (SYS_PORT.ON),A
LD A,B
JP .readNext
.stackDepth EQU 8 ; à ááâ®ï­¨¥ ®â ª®­æ  ¯à®æ¥¤ãàë ¤® ¢¥à設ë á⥪ .
.readProcedure.size EQU $-.readProcedure
;-----------------------------------------------------------------------;
;
;-----------------------------------------------------------------------;
; ROM-Disk pages ; [ ]  ªâ¨¢¨à®¢ âì ROM-DISK
_mInfoALIGN 256,#FF
; BLOCK #3F00-$,#FF
ROM_DISK.Pages.Number:
DB ROM_DISK.Pages.Size ; ç¨á«® áâà ­¨æ
; ã áâà ­¨æ ¢ëáâ ¢«¥­ bit4 ¤«ï ª®à४⭮© ¯®¤áâ ­®¢ª¨
;(¯®¤à®¡­¥¥ ¢ sp2000.inc - <EFBFBD>®àâ ã¯à ¢«¥­¨ï áâà ­¨æ ¬¨ <EFBFBD>)
ROM_DISK.Pages: ; áâà ­¨æë ROM-Disk
; ABYTE #10 #01,#02,#03,#04,#05,#06,#07,#09,#0A,#0B ; 163840 bytes - without ZX-ROMS
IFN SetFullZXromLoader
ABYTE #10 #06,#07,#09,#0A,#0B ; 81920 bytes
ELSE
ABYTE #10 #09,#0A,#0B ; 49152 bytes
ENDIF
.Size EQU $-ROM_DISK.Pages
; ª®­¥æ - FF
; DB #FF
;-----------------------------------------------------------------------;
;
_mInfoBLOCK ToBIOS_FromEXT-$,#FF
;------------[Return to ROM]------------
; #3FD0
; «ï ¢ë§®¢  ä㭪権 ¡¨®á  ¨§ áâà ­¨æë 0 <EFBFBD> (ROM Extension)
FN1_RET:
PUSH AF
LD A,ROM.EXPANSION
OUT (SYS_PORT.ON),A
POP AF
RST #18
JR FN1_RET
; !TODO Free 7 bytes
;---------------------------------------
;
;
_mInfoBLOCK #3FE0-$,#FF
;---------------[ Free ]----------------
; !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_table
;------------[HDD_5x portal]------------
; â®çª  ¢å®¤ /¢ë室  ¤«ï ä㭪権 5å ¨§ EXP
_mInfoBLOCK #3FE8-$,#FF
EXP_HDD: ;HDD_EXE:
PUSH AF
LD A,ROM.EXPANSION
OUT (SYS_PORT.ON),A
POP AF
RET
;---------------------------------------
;
;
_mInfoBLOCK #3FF0-$,#FF
;---------------[ Free ]----------------
; !TODO Free 8 bytes and entry point
;---------------------------------------
;
;
_mInfoBLOCK #3FF8-$,#FF
;-----[ From TR-DOS to API #80..#FF]-----
; ®çª  ¢å®¤ /¢ë室  ¤«ï TR-DOS
EXP_FNS_RET:
PUSH AF
LD A,ROM.EXT
OUT (SYS_PORT.OFF),A ; ®çª  ¢å®¤ /¢ë室  ¨§/¢ TR-DOS ¯à¨ ¢ë§®¢¥ ä㭪権 BIOS #80..#FF
JP EXP_FNS ; !TEST new_api
;---------------------------------------
;
;
_mInfoBLOCK #4000-$,#FF
;=======================================================================