ZX-SP-ROMs/ZX_EXP.ASM
Anatoliy Belyanskiy c87bd450cd refactoring
2023-07-19 01:20:00 +10:00

1749 lines
27 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) 1997 ELSY Co.
;
;********************************************************************
;
;R0003 22-09-2001 ¨á¯à ¢«¥­¨¥ ­ §¢ ­¨© ¢ ¬¥­î "Hardware"
;R0002 22-09-2001 ¢áâ ¢«¥­ ­®¬¥à <20>‡“ ¨ äã­ªæ¨ï ¡¨®á  ¤«ï ­¥£® 0EDh
;R0001 22-09-2001 ¤®¡ ¢«¥­  äã­ªæ¨ï GOTO Spectrum 0FBh
;
;********************************************************************
ORG 0
SPRIN2 EQU 2 ; 1 - ¢ª«î祭¨¥ Sprinter-1 ¯¥à¢®© ¯à®è¨¢ª®©
; 2 - ¢ª«î祭¨¥ Sprinter-2 ¯¥à¢®© ¯à®è¨¢ª®©
INCLUDE 'INC/SPRINT00.INC' ; ª®­áâ ­âë, ¬ ªà®áë..
INCLUDE 'shared_includes/constants/zx_char_codes.inc'
PORT_JOI EQU 0FFh
;******************************
; ***** BEGIN EXPANSION *****
;******************************
A_0000:
JP GLOBAL_RESET
JR SET_BIOS_TO_RAM
;R0002
ROM_NUMBER: DW 0001h
;***************************************
DEFS 8-$
EXP_FNS_2_RET:
PUSH AF
LD A,D_ROM16OFF
OUT (SYS_PORT_OFF),A
POP AF
JR RST_18_1
;***************************************
DEFS 16-$
JR RST10
;***************************************
DEFS 24-$
JP EXP_FNS_RST18
RST_18_1:
CALL EXP_FNS_RST18
JR EXP_FNS_2_RET
; DEFS 2Bh-$
;***************************************
DEFS 20h-$
DEFS 28h-$
DEFS 30h-$
DEFS 38h-$
RST38: EI
RETI
; PUSH AF
; PUSH HL
; CALL INT_PROG1
; POP HL
; POP AF
; RET
RST10:
CALL_48 10h
RET
;**********************************
DEFS 66h-$ ; NMI
; RET ; १¥à¢ 3 ¡ ©â  ¤«ï ª®¬ ­¤ë JP
; NOP
; NOP
RETN
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
;**********************************
;INKEYS:
; BIT 5,(IY+1)
; RET Z
; RES 5,(IY+1)
; LD A,(05C08h)
; RET
;
;WAIT_KEY:
; CALL INKEYS
; CALL NZ,BEEP
; RET NZ
; EI
; HALT
; JR WAIT_KEY
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
DEFS 0A0H-$
TABLE_X: ; â ¡«¨æ  ¤«ï Sprinter POST-Tester-a
DB 00101000b ; "0"
DB 10111101b ; "1"
DB 00110010b ; "2"
DB 00110100b ; "3"
DB 10100101b ; "4"
DB 01100100b ; "5"
DB 01100000b ; "6"
DB 00111101b ; "7"
DB 00100000b ; "8"
DB 00100100b ; "9"
DB 00100001b ; "A"
DB 11100000b ; "B"
DB 01101010b ; "C"
DB 10110000b ; "D"
DB 01100010b ; "E"
DB 01100011b ; "F"
; ==========================
DEFS 0C0H-$
;****** ‚•Ž„ <20>Ž RANDOMIZE USR 15600 ***************
BEGIN: ; ‚室 ç¥à¥§ USR 15600
CALL CH_2
CALL COMAND_LINE ; <E2809A>Ž<C5BD><EFBFBD>ˆ… ŠŽŒ€<C592>, …‘‹ˆ …‘’œ
;****** ‚室 ¡¥§ ª®¬ ­¤ë. *************************
JP SW_ROM_1 ; އ<E280A1> << MAIN MENU >>
;
CLS:
C_0D6B: ; CLS
CALL_48 0D6Bh
RET
;___________________________
RESTARTS EQU 0FFE0H
GLOBAL_RESET:
DI
IM 1
LD HL,RESTARTS
LD DE,RESTART_TXT
LD B,RESTART_TXT_L-4
RESTART_TEST:
LD A,(DE)
CP (HL)
JR NZ,NO_RESTART
INC HL
INC DE
DJNZ RESTART_TEST
JP RESTARTS
;**********************************
RESTART_TXT:
LD HL,RESTARTS ; 3
LD B,16 ; 2
REST_LOOP:
LD (HL),0 ; 2
INC HL ; 1
DJNZ REST_LOOP ; 2
NOP ; 1
NOP ; 1
LD A,1 ; 2
OUT (PAGE3),A ; 2
RESTART_TXT_L EQU $-RESTART_TXT
;**********************************
BLOCK #100 - $,255
; ‚믮«­ï¥âáï á  ¤à¥á  #C000
SETUP_TXT:
LD A,CNF_0+D_ROM16ON
OUT (CNF_PORT),A
LD HL,#1000
LD DE,#8000
LD BC,#3000
LDIR
LD A,CNF_0+D_ROM16OFF
OUT (CNF_PORT),A
LD HL,#8005
LD A,#FE
LD BC,#204E ;ALL_MODE
OUT (C),A
LD A,#7F
IN A,(#FE)
CPL
AND 1
EX AF,AF'
LD A,#FF
OUT (C),A
EX AF,AF'
JP (HL)
SETUP_TXT_LEN EQU $-SETUP_TXT
;**********************************
SYSTEM_ID_TXT:
DB "NEW_BIOS"
NO_RESTART:
LD SP,0BFFFH
; CALL DCP_INIT
LD A,5 ; COM port for Printer OUT
OUT (COM_A),A
LD A,062H
OUT (COM_A),A
LD A,0CFH ; BITS I/O
OUT (LPT1_C),A
XOR A
OUT (LPT1_C),A
OUT (LPT1_D),A ; PRINTER - PORT - all zeros
;******* INIT SYSTEM PORTS ********************
LD BC,0FFEEh
XOR A
OUT (C),A ; 0 register - waits
INC C
OUT (C),A ; set 0 Waits
DEC C
DEC A ; A->3
; LD A,3 ; 3-nd register - boundaries
OUT (C),A
INC C
XOR A
OUT (C),A ; disable CS0,CS1
; no boundary set!
; ==== POST PROCs ==================================
POST_TEST:
; ************************************************
; ===== Point 0 =======
; ************************************************
LD A,(00A0h)
OUT (LPT1_D),A ; "0" - start
; ==== TEST RAM BUS ========
TEST_RAM_BUS:
LD BC,0
LD HL,0C000h
LD DE,00055h
LOOP_TEST_RB:
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_TEST_RB
LD A,E
CPL
LD E,A
INC L
INC L
BIT 4,L
JR Z,LOOP_TEST_RB
LD A,B
OR C
JR Z,POST_RET_1
; ************************************************
; JP POST_RET_1 ; for test POST procedure
; ************************************************
ERROR_RAM_BUS:
LD HL,0A0h
ERB_2:
BIT 0,C
JR Z,ERB_1
LD A,(HL)
AND 11011111b
OUT (LPT1_D),A
LD DE,0
LOOP_WTT:
DEC DE
LD A,D
OR E
JR NZ,LOOP_WTT
ERB_1:
LD A,C
RRA
RR B
RR C
INC L
LD A,L
AND 0AFh
LD L,A
JR ERB_2
; ************************************************
; ===== Point 1 ==============
; ************************************************
POST_RET_1:
LD A,(0A1h)
OUT (LPT1_D),A
; ===== TEST ADRESS BUS ======
TEST_ADRESS_BUS:
; LD B,0
; LD HL,0C001h
; LD (HL),B
; ADD HL,HL
; LD A,H
; OR 0C0h
; LD H,A
; INC B
LD HL,0C000h
LD DE,00000h
TSAB_1:
LD (HL),E
INC L
LD (HL),D
INC HL
INC DE
INC DE
BIT 7,H
JR NZ,TSAB_1
DEC HL
DEC DE
DEC DE
TSAB_2:
LD A,(HL)
CP D
JR NZ,ER_TSA
DEC HL
LD A,(HL)
CP E
JR NZ,ER_TSA
DEC HL
DEC DE
DEC DE
LD A,H
CP 0BFh
JR NZ,TSAB_2
JR POST_RET_2
ER_TSA:
; ************************************************
; JP POST_RET_2 ; for test POST procedure
; ************************************************
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 0Fh
OR 0A0h
LD L,A
LD H,0
LD A,(HL)
AND B
OUT (LPT1_D),A
EXX
LD DE,0
LOOP_WTT2:
DEC DE
LD A,D
OR E
JR NZ,LOOP_WTT2
LD A,0FFh
OUT (LPT1_D),A
LOOP_WTT21:
DEC DE
LD A,D
OR E
JR NZ,LOOP_WTT21
EXX
LD A,C
AND 0Fh
OR 0A0h
LD L,A
LD A,(HL)
OUT (LPT1_D),A
EXX
LD DE,0
LOOP_WTT3:
DEC DE
LD A,D
OR E
JR NZ,LOOP_WTT3
LD A,0FFh
OUT (LPT1_D),A
LOOP_WTT31:
DEC DE
LD A,D
OR E
JR NZ,LOOP_WTT31
EXX
JP (IX)
; ************************************************
; ===== Point 2 =========
; ************************************************
POST_RET_2:
LD A,(0A2h)
OUT (LPT1_D),A
; ===== INIT DCP ========
LD HL,POST_RET_3 ; INIT PORTS
JP DCP_INIT
; ************************************************
; ===== Point 3 =========
; ************************************************
POST_RET_3:
LD A,(0A3h)
OUT (LPT1_D),A
IN A,(PAGE3) ; First IN command - OPEN DCP
; ===== TEST RAM PAGES ==
IN A,(PAGE3)
EX AF,AF'
POST_TEST_PAGES:
LD B,0
TSPG_1:
LD A,0FFh
LD I,A
LD A,B
OUT (PAGE3),A
LD A,0
LD I,A
IN A,(PAGE3)
CP B
JR NZ,ERTP
DJNZ TSPG_1
EX AF,AF'
OUT (PAGE3),A
JR POST_RET_4
ERTP:
LD C,B
LD IX,ERTP_1
ERTP_1: LD B,11011111b
JP OUT_C_BYTE
; ************************************************
; ===== Point 4 =========
; ************************************************
POST_RET_4:
LD A,(0A4h)
OUT (LPT1_D),A
LD B,0
loop4test:
IN A,(0)
CP 0FFh
; JR NZ,error_bus
DJNZ loop4test
JR POST_RET_5
error_bus:
LD C,A
erb1:
LD IX,erbr1
LD B,11011111b
JP OUT_C_BYTE
erbr1:
LD A,11011111b
OUT (LPT1_D),A
LD DE,0
LOOP_WTT4:
DEC DE
LD A,D
OR E
JR NZ,LOOP_WTT4
JR erb1
; ************************************************
; ===== Point 5 =========
; ************************************************
POST_RET_5:
LD A,(0A5h)
OUT (LPT1_D),A
;=== post end ===============
;-( )===========================
; LD SP,0BFFFh
; CALL EMM_FN7 ; ¨­¨æ¨ «¨§ æ¨ï ¯ ¬ïâ¨
; JP Spectrum_0 ; for TEST!
;-( )===========================
IN A,(PAGE3)
EX AF,AF' ; SAVE
LD A,SYS_PAGE
OUT (PAGE3),A
; LD HL,SYSTEM_ID
; LD DE,SYSTEM_ID_TXT
; LD B,8
;NEW_BIOS_L:
; LD A,(DE)
; CP (HL)
; JR NZ,NO_NEW_BIOS
; INC HL
; INC DE
; DJNZ NEW_BIOS_L
; LD A,(HL)
; DEC HL
; LD (HL),0 ; § ¡¨âì "NEW_BIOS" ¤«ï ¢ë室  ¯® RESET
; OUT (PAGE3),A
; JP 0C003H ; INIT_NEW_BIOS
NO_SUMX_EQ:
LD A,SYS_PAGE
OUT (PAGE3),A
NO_NEW_BIOS:
DB 0FDH
LD A,L
LD L,A
DB 0FDH
LD A,H
LD H,A
; LD SP,SYS_SP
; PUSH IY
; POP HL
LD BC,0107H
AND A
SBC HL,BC
JR NZ,NO_CONFIG_
LD (CONFIG_BYTE),IX
NO_CONFIG_:
LD HL,(CONFIG_BYTE)
EX AF,AF'
OUT (PAGE3),A
;*********************************
LD A,0
OUT (PAGE3),A
OUT (PAGE0),A
LD A,5
OUT (PAGE1),A
LD A,2
OUT (PAGE2),A
LD SP,0BFFFH
PUSH HL
CALL PORTS_INIT
CALL EMM_FN7 ; ¨­¨æ¨ «¨§ æ¨ï ¯ ¬ïâ¨
POP HL ; ª®­ä¨£ãà æ¨ï
LD A,H
CP #FF
JR NZ,NO_SETUP_1
LD A,L
IF SPRIN2 = 2
CP #FD
; LD BC,0FFFDH ; Š®­ä¨£ãà æ¨ï Sprinter-2
PG_SP1 EQU #EC
PG_SP2 EQU #EE
PG_AY EQU #EA
ELSE
; LD BC,0FFFEH ; Š®­ä¨£ãà æ¨ï Sprinter-1
CP #FE
PG_AY EQU #EA
ENDIF
JR NZ,NO_SETUP_2
; AND A
; SBC HL,BC
; JR NZ,NO_SETUP_
;**************************************
; COPY BIOS ’Ž RAM ????
;**************************************
;
;
;
;**************************************
; LD A,07FH
; IN A,(0FEH)
; RRCA
; JR NC,NO_SETUP_
; LD A,0
; OUT (PAGE3),A
; OUT (PAGE0),A
; LD A,5
; OUT (PAGE1),A
; LD A,2
; OUT (PAGE2),A
LD A,0FFh
LD BC,204Eh ; system_port
OUT (C),A
LD SP,#BFFF
LD HL,L_PENTAGON
CALL SINC_DEF
LD SP,#BFFF
LD HL,L_PENTAGON
CALL SINC_DEF
LD HL,SETUP_TXT
LD DE,#C000
LD BC,SETUP_TXT_LEN
LDIR
CALL #C000
JP NO_SETUP_1
GOTO_SPEC:
IN A,(PAGE3)
EX AF,AF'
LD A,SYS_PAGE
OUT (PAGE3),A
LD A,B
LD (CONFIG_DE+1),A
EX AF,AF'
OUT (PAGE3),A
NO_SETUP_2:
; CP 0FCH
; JR Z,SPECTRUM_0 ; Š®­ä¨£ãà æ¨ï AY
NO_SETUP_1:
LD A,(TABLE_X + 8)
OUT (LPT1_D),A
LD A,0FEh ; ACC-off
LD BC,204Eh
OUT (C),A
SND_TEST_RET:
LD SP,#BFFF
LD HL,L_PENTAGON
CALL SINC_DEF
CALL SET_PAL_ZX
LD HL,4104H
LD E,0
LD B,4
CALL LP_OPEN_S
LD HL,5104H
LD E,0
LD B,4
CALL LP_OPEN_S
;*************************************
LD D,35H
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,0BFFFH
LD DE,5B00H ; § ¯ã᪠¯à®£à ¬¬ë ­  BASIC-¥.
LD HL,RES128_PROG
LD BC,LEN_RES128
LDIR
DI
JP 5B00H
;***********************************
; ˆ­¨æ¨ «¨§ æ¨ï ¯®à⮢
PORTS_INIT:
LD BC,ISA_PORT
LD A,0FFH
OUT (C),A
RESETTTT:
DEC A
JR NZ,RESETTTT
OUT (C),A
LD A,D_TBON+CNF_0
OUT (CNF_PORT),A
LD A,D_ROM16OFF ; AROM16 = 0
OUT (CNF_PORT),A ; ¢ª«îç¨âì á¨á⥬­ãî áâà ­¨æã
CALL DOS_OFF
XOR A
LD BC,01FFDH
OUT (C),A ; Scorp port !!!
LD B,7FH
OUT (C),A ; 128 port !!!
LD BC,0FFEFh ; á¡à®á WAIT-®¢ !!!
LD A,0
OUT (C),A
;
; ˆ­¨æ¨ «¨§ æ¨ï ¯®á«¥¤®¢ â¥«ì­®£® ¯®àâ  ª« ¢¨ âãàë
LD A,0
OUT (COM_A),A
LD A,1
OUT (COM_A),A
LD A,0 ; 18H ¢ª«î祭¨¥ ¯à¥à뢠­¨©
OUT (COM_A),A
LD A,3
OUT (COM_A),A
LD A,0C1h
OUT (COM_A),A
LD A,4
OUT (COM_A),A
LD A,5h ; 5/7 ¯ à¨â¥â?
OUT (COM_A),A
LD A,5
OUT (COM_A),A
LD A,062H
OUT (COM_A),A
; ˆ­¨æ¨ «¨§ æ¨ï ¬ëè¨
LD A,0 ; for MOUSE
OUT (COM_B),A
LD A,1
OUT (COM_B),A
LD A,0
OUT (COM_B),A
LD A,3
OUT (COM_B),A
LD A,041H
OUT (COM_B),A
LD A,4
OUT (COM_B),A
LD A,44H
OUT (COM_B),A
LD A,5
OUT (COM_B),A
LD A,0E0H
OUT (COM_B),A
; ˆ­¨æ¨ «¨§ æ¨ï â ©¬¥à  ¬ëè¨
LD A,85 ; for MOUSE
OUT (STC0_C),A
LD A,45
OUT (STC0_C),A
; ˆ­¨æ¨ «¨§ æ¨ï ¯ à ««¥«ì­®£® ¯®àâ  1 (¯à¨­â¥à)
; LD A,0CFH ; BITS I/O
; OUT (LPT1_C),A
; XOR A
; OUT (LPT1_C),A
; OUT (LPT1_D),A ; PRINTER - PORT - all zeros
LD A,00FH ; OUT
OUT (LPT1_C),A
OUT (LPT1_C),A
; ˆ­¨æ¨ «¨§ æ¨ï ¯ à ««¥«ì­®£® ¯®àâ  2 (INT/DMA ISA)
LD BC,LPT2_C
LD A,0CFH ; BITS I/O
OUT (C),A
LD A,03FH
OUT (C),A
LD A,0C0h
OUT (LPT2_D),A
; ‡ ­ã«¥­¨¥ ª®¢®ªá 
LD A,0
OUT (0FBH),A
; ‘¡à®á ª®­â஫«¥à  ¤¨áª®¢®¤ 
LD BC,7FFDH
LD A,10H
OUT (C),A ; BASIC_48
CALL DOS_ON ; DOS_on
XOR A
OUT (CBL_DIR),A
OUT (P_DOS_FF),A
push hl
pop hl
LD A,3CH
OUT (P_DOS_FF),A
LD A,0
OUT (WG_COM),A
LD A,21h
OUT (0BCh),A ; set HDD1/not-HDD2
CALL DOS_OFF
LD BC,7FFDH
XOR A
OUT (C),A ; BASIC_128
RET
RES128_PROG:
LD A,D_ROM16OFF
OUT (SYS_PORT_OFF),A ; ‚®§¢à â ¢ 128k ROM
LD C,PAGE3
IN B,(C)
LD A,SYS_PAGE
OUT (PAGE3),A
LD DE,(CONFIG_DE)
XOR A
LD (CONFIG_DE+1),A
OUT (C),B
LD BC,1FFDH
OUT (C),A ; Scorp ¯®àâ
LD B,7FH
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,10H
OUT (C),A
DEC D
JP Z,0 ; 1 ‚•Ž„ BASIC-48
LD HL,0
PUSH HL
DEC D
JP Z,3D29H ; 2 ‚•Ž„ TR-DOS
XOR A
OUT (C),A
LD A,02H
LD B,1FH
OUT (C),A
DEC D
JP Z,0 ; 3 ‚•Ž„ EXPANSION ???
LD A,0
OUT (C),A
LD A,30H
LD B,7FH
OUT (C),A
DEC D
JP Z,3D29H ; 4 ‚•Ž„ TR-DOS á § ªàëâ묨 128-¬¨ ¯®àâ ¬¨
JP 0 ; 5 ‚•Ž„ BASIC-48 á § ªàëâ묨 128-¬¨ ¯®àâ ¬¨
LEN_RES128 EQU $-RES128_PROG
CH_2: LD A,2
C_1601: ; OPEN CHANEL
CALL_48 #1601
RET
TURBO_OFF:
LD A,D_TBOFF
OUT (CNF_PORT),A
RET
TURBO_ON:
LD A,D_TBON
OUT (CNF_PORT),A
RET
PRINT_LINE:
LD A,(HL)
INC HL
CP 0FFh
RET Z
RST 10H
JR PRINT_LINE
JP_HL: JP (HL)
; JP RESET_128
;********************************
; *** UTILITES ***
;********************************
; ¯®«ãç¨âì à ¡ ®¡«
C_0030: CALL_48X 0030h
RET
; ®ç¨áâ¨âì à ¡ ®¡«
C_19E8: CALL_48X 19E8h
RET
; ¯®«ãç¨âì ¯à®áâà ­á⢮
C_1655: CALL_48X 1655h
RET
;****************************************
; ******* SERVICE *******
;****************************************
;*******************************************************
; „…˜ˆ<CB86>ˆŸ ŠŽŒ€<C592><EFBFBD>މ <E28098>ŽŠˆ,<2C><EFBFBD>…„€<E2809E><E282AC>މ „‹Ÿ "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: ; Ž<><C5BD><EFBFBD>“†…<E280A0>€ ŠŽŒ€<C592>„€ „‹Ÿ '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,(PAGE3)
LD B,A ; 3-ï áâà ­¨æ  ⥪ã饩 § ¤ ç¨
LD A,SYS_PAGE
OUT (PAGE3),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 (PAGE3),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 (PAGE3),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
INCLUDE 'ZX_EXP/SERVICE.ASM'
; DSS 7FDh,255
; DB 'END'
;**************************************
INCLUDE 'ZX_EXP/TEST.ASM'
; INCLUDE MAGIC.ASM
;****************************************
;**********************************************
INCLUDE 'ZX_EXP/EXP_DCP2.ASM'
INCLUDE 'ZX_EXP/FLEX.ASM'
INCLUDE 'ZX_EXP/EXP_SCR.ASM'
; INCLUDE EXP_PIC.ASM
INCLUDE 'ZX_EXP/EXP_PIC2.ASM'
INCLUDE 'ZX_EXP/EXP_FN2.ASM'
;**********************************************
;BLOCK 1400H - $,255
; #-5kb-##############################
; #::::::::::::::::::::::::::::::::::#\
; #:::: Œ¥áâ® ¤ ­­ëå ¤«ï FLEX :::::::#\
; #::::::::::::::::::::::::::::::::::#\
; ####################################\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;**********************************************
BLOCK 2800H - $,255
; #-2kb-##############################
; #::::::::::::::::::::::::::::::::::#\
; #:::: ‡¤¥áì ¬¥áâ® ¤«ï IBM-ZG ::::::#\
; #::::::::::::::::::::::::::::::::::#\
; ####################################\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; INCLUDE ZGLION.ASM
INCLUDE 'ZX_EXP/FONT.ASM'
;**********************************************
BLOCK 3000H - $,255
INCLUDE 'ZX_EXP/EXP_FN.ASM'
INCLUDE 'ZX_EXP/EXP_LP2.ASM'
; INCLUDE EXP_LP3.ASM
;**********************************************
FN_SENT_BYTE:
LD E,A ; á®åà ­¨âì ¡ ©â
CALL SENT_POLU_BYTE ; ¯¥à¥¤ âì ¯®«ã¡ ©â ¨§ …
RET C ; ¢®§¢à â ¯® ®è¨¡ª¥
LD A,E ; ᤢ¨­ãâì ¡ ©â ­  4 ¡¨â 
RRCA
RRCA
RRCA
RRCA
LD E,A
SENT_POLU_BYTE: ; ¯¥à¥¤ âì ¯®«®¢¨­ã ¡ ©â  _E_!!
LD A,E
OR 0F0h ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (LPT1_D),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_SENT_1:
IN A,(PORT_JOI) ; ¯à®¢¥à¨âì ¡¨â 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 0Fh ; á¡à®á¨âì áâ à訥 ¡¨âë LPT -
OUT (LPT1_D),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_SENT_2:
IN A,(PORT_JOI) ; ¯à®¢¥à¨âì ¡¨â 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 0F0h ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (LPT1_D),A
XOR A
SCF ; â ©¬- ãâ
RET
CONTINUE_SENT2: ; ¯®«ã¡ ©â ¯¥à¥¤ ­
LD A,E
OR 0F0h ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (LPT1_D),A
XOR A
RET
FN_RESEIVE_B: ; ¯à¨­ïâì ¡ ©â ¢ A
CALL RESEIVE_POLU_BYTE ; ¯à¨­ïâì ¯®«ã¡ ©â
RET C ; ¢®§¢à â ¯® ®è¨¡ª¥
RLCA
RLCA
RLCA
RLCA
AND 0F0h
LD E,A
CALL RESEIVE_POLU_BYTE ; ¢â®à®©
RET C
AND 0Fh
OR E
RET ; ¡ ©â ¯à¨­ïâ
RESEIVE_POLU_BYTE: ; ¯à¨­ïâì ¯®«®¢¨­ã ¡ ©â  ¢ …
LD A,0F0h ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (LPT1_D),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_RES_1:
IN A,(PORT_JOI) ; ¯à®¢¥à¨âì ¡¨â 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 (LPT1_D),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_RES_2:
IN A,(PORT_JOI) ; ¯à®¢¥à¨âì ¡¨â 4 ­  0 - á®®¡é¥­¨¥ ®â PC
BIT 4,A
JR Z,CONTINUE_RES2
DEC BC
LD A,B
OR C
JR NZ,WAIT_RES_2
LD A,0F0h ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (LPT1_D),A
SCF
RET ; ®è¨¡ª 
CONTINUE_RES2: ; ¯®«ã¡ ©â ¢ëáâ ¢«¥­
LOOP_EQ: ; ¯à®ç¨â âì ¥é¥ à §, çâ® ¡ë ᮢ¯ «®
AND 0Fh
LD B,A
IN A,(PORT_JOI)
AND 0Fh
CP B
JR NZ,LOOP_EQ
OR 0F0h ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â  ¢ 1 - ¯à¨­ïâ®
OUT (LPT1_D),A
RET
;
;**********************************************
; BLOCK #3C10 - $,255
;KBD_RET:
; LD A,D_ROM16OFF
; OUT (SYS_PORT_OFF),A
; JR KBD_EXP
; NOP
; NOP
;KBD_RET2:
; LD A,D_ROM16OFF
; OUT (SYS_PORT_OFF),A
; JR KBD_OFF1
; NOP
; NOP
;KBD_EXP:
; CALL RET_INS
; PUSH HL
; CALL INT_PROG1
; POP HL
; CALL DOS_ON
; JR KBD_RET
;KBD_OFF1:
; CALL RET_INS
; CALL KBD_OFF
; CALL DOS_ON
; JR KBD_RET2
;******************************************************
;******************************************************
BLOCK #3CC0 - $,255
MAGIC_1: ; ‡€ƒ‹“˜Š€ „‹Ÿ MAGIC
PUSH AF
LD A,D_ROM16OFF
OUT (SYS_PORT_OFF),A
POP AF
JP MAGIC_1
MAGIC_3:
PUSH AF
LD A,D_ROM16OFF
OUT (SYS_PORT_OFF),A
POP AF
RETN
MAGIC_2:
; CALL MG_BEGIN
JR MAGIC_3
;*************************
BLOCK #3CE0-$,0
SW_ROM_1:
LD HL,#259F
PUSH HL
LD HL,5B00h
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>
; DEFS 3CF0h-$
;JMP_48:
; LD HL,00h
; JR JP_HL_48
;
; NOP
; NOP
; NOP
DEFS 3CF8H-$
JP_HL_48:
PUSH HL
SW_ROM:
PUSH AF
LD A,D_ROM16OFF
OUT (SYS_PORT_OFF),A
POP AF
RET
;******************************************
BLOCK 3D00H - $,255
DOS_ON:
NOP
RET
;******************************************
BLOCK 3D13H - $,255
NOP
JP 18H
;******************************************
BLOCK 3E00H - $,255
DOS_OFF:
PUSH AF
PUSH BC
LD BC,(5BFFH)
LD A,0C9H
LD (5BFFh),A
CALL 5BFFh
LD (5BFFh),BC
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,2050H
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,80H
; LD B,0
; LD E,0
; CALL LP_OPEN_S
; LD DE,0
; LD C,84H
; CALL LP_SET_PLACE
; LD HL,HDD_MSG
; LD B,HDD_MSG_LEN
; LD E,47H
; 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 3F00H - $,255
FN_LIB:
SCF
RET
IN A,(PAGE3)
LD B,A
LD A,SYS_PAGE
OUT (PAGE3),A
PUSH HL
LD L,C
LD H,0C1H
LD A,(HL)
POP HL
AND A
SCF
JR Z,FN_LIB_RET
OUT (PAGE3),A
LD (0C0FEH),SP
LD SP,0C0F0H
PUSH BC
CALL 0C100H
POP BC
LD SP,(0C0FEH)
LD A,B
OUT (PAGE3),A
RET
FN_LIB_RET:
LD A,B
OUT (PAGE3),A
SCF
RET
FN_KBD_OUT: ; ¢å®¤ A - byte
; B - speed_parameter
AND A
LD E,A
LD D,0FFh
JP PE,kbd_parity ; ãáâ ­®¢ª  ¯ à¨â¥â  PE/PO ???
LD D,0FEh
kbd_parity:
AND A ; ¯¥à¢ë© ¡¨â - start-bit - 0
RL E
RL D ; ¢ DE - 11 ¡¨â ¤«ï ¯¥à¥¤ ç¨
LD C,11
kbd_loop:
LD A,5
OUT (COM_A),A
LD A,60h
BIT 0,E
JR NZ,no_inv
XOR 2 ; ¤ ­­ë¥
no_inv:
LD L,A
OUT (COM_A),A ; ¢ëáâ ¢¨âì ¤ ­­ë¥
LD A,5
OUT (COM_A),A
LD A,L
OR 80h ; ᨭåந¬¯ã«ìá
OUT (COM_A),A ; ¨¬¯ã«ìá ᨭåà®
LD A,B ; speed_par
kbd_loop1:
PUSH HL
POP HL
DEC A
JR NZ,kbd_loop1
LD A,5
OUT (COM_A),A
LD A,L
OUT (COM_A),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 (COM_A),A
LD A,60h
OUT (COM_A),A ; § ª®­ç¨âì ¯¥à¥¤ çã
AND A
RET
;***********************************************************************;
;!FIXIT not used
BLOCK #3FD0 - $,0
; FN1_RET:
; PUSH AF
; LD A,D_ROM16ON
; OUT (CNF_PORT),A
; POP AF
; RST #18
; JR FN1_RET
;***********************************************************************;
;!FIXIT not used
BLOCK #3FE0 - $,255
; SOUND_TEST:
; LD A,D_ROM16ON ; AROM16 = 1
; OUT (CNF_PORT),A
; JP SND_TEST_RET
;***********************************************************************;
BLOCK #3FE8 - $,255
EXP_HDD:
PUSH AF
LD A,D_ROM16ON
OUT (CNF_PORT),A
POP AF
RET
;***********************************************************************;
BLOCK #3FF0-$,255
;***********************************************************************;
BLOCK #3FF8-$,255
EXP_FNS_RET:
PUSH AF
LD A,D_ROM16OFF
OUT (SYS_PORT_OFF),A
JP EXP_FNS
;***********************************************************************;
BLOCK #4000-$,255
;