Sprinter-Core/src/bios/rom/ZX/ZX_FUNC.ASM

894 lines
20 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.

;
;----------------------------[ ??????????? ]----------------------------;
; 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)
;
;PRINT_LINE:
; LD A,(HL)
; INC HL
; CP 0FFh
; RET Z
; RST 10H
; JR PRINT_LINE
;
; JP RESET_128
;-----------------------------------------------------------------------;
;
;-----------------------------------------------------------------------;
; ******* SERVICE *******
;-----------------------------------------------------------------------;
; ª®íä䍿¨¥­â ᬥ饭¨ï ¯® ­®¬¥àã â áª¨
; MACRO GET_ZX_TASK_DATA_OFFSET
; RLCA
; RLCA
; RLCA
; RLCA
; AND #30 ; ­®¢ ï § ¤ ç  0..3
; ENDM
;------[ „…˜ˆ<CB86>ˆŸ ŠŽŒ€<C592><EFBFBD>މ <E28098>ŽŠˆ,<2C><EFBFBD>…„€<E2809E><E282AC>މ „‹Ÿ "EXPANSION" ]-------;
COMAND_LINE:
LD HL,(#5C5D) ;!HARDCODE CH_ADR
COMAND_LOOP:
LD A,(HL)
INC HL
CP ":"
JR Z,COMAND_L1
CP ZX_Char.carriage_return
JR NZ,COMAND_LOOP
RET
COMAND_L1:
LD A,(HL)
CP ZX_Token.rem
RET NZ
INC HL
COMAND_OK: ; Ž<><C5BD><EFBFBD>“†…<E280A0>€ ŠŽŒ€<C592>„€ „‹Ÿ 'expansion'
LD A,(HL)
INC HL
CP ':'
JP Z,MENU_S1
CP ZX_Char.carriage_return
JP Z,MENU_S1
;
AND %1101'1111
CP 'I'
JR Z,COMMAND_HARDWARE_MENU
;CP 'T'
;JR Z,TASK_SWITCH
DEC HL
POP BC
JP BASIC_MENU
MENU_S1:
POP BC
CALL SERVICE
JP SW_ROM_1
COMMAND_HARDWARE_MENU:
LD A,(HL)
INC HL
AND %1101'1111
CP 'S'
RET NZ
;
POP BC
CALL Hardware_Menu
JP SW_ROM_1
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; *** UTILITES ***
;-----------------------------------------------------------------------;
; C_0030: ; ¯®«ãç¨âì à ¡ ®¡«
; CALL_48X 0030h
; RET
C_19E8: ; ®ç¨áâ¨âì à ¡ ®¡«
CALL_48X #19E8 ;!HARDCODE
RET
C_1655: ; ¯®«ãç¨âì ¯à®áâà ­á⢮
CALL_48X #1655 ;!HARDCODE
RET
CLS:
C_0D6B: CALL_48 #0D6B ;!HARDCODE
RET
CH_2: LD A,2
C_1601: ; OPEN CHANEL
CALL_48 #1601 ;!HARDCODE
RET
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; MANAGE_ZX_PAGES
;-----------------------------------------------------------------------;
;-------------------------------------------------------------------------------------------------------------------;
;‚ë¡®à ¢ Setup, çâ® £à㧨âì ¢ v<>‡“ ¯à¨ áâ àâ¥. ‚ à¨ ­âë:
;[x] 0 - <20>¥ £à㧨âì <20>‡“ ᯥªâà㬠, ¨­¨â¨âì áâà ­¨æã #41 ª ª ¢ 3.04
;[x] 1 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ áâ à⥠¥á«¨ ­¥â ä« £  ZX
;[x] 2 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ ª ¦¤®¬ ¯¥à¥§ ¯ã᪥ (¬®¦¥â ¡ëâì ®¯ á­®)
;-------------------------------------------------------------------------------------------------------------------;
; ¤«ï ¢å®¤  ¢ ०¨¬ ᯥªâà㬠:
; 0. <20>஢¥àª  ¬¥âª¨ ZX
; 1. CONFIG_DE.CNF_PORT ’¨¯ â çª¨, ª ª ¨­¨â¨âì ¯ ¬ïâì, à §¬¥à އ“, âãà¡ 
; 2. CONFIG_DE.ZX_START áâà ­¨æ  vROM ¤«ï § ¯ã᪠
; 3. <20> áâனª¨ íªà ­  (INT, Sync)
; 4. ’®à¬®¦¥­¨¥ ¯ ¬ï⨠(port all mode)
; 5. Block_ID.vROM
; 6. Block_ID.vRAM
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; [ ] free zx pages!
; ????? SYS_PAGE.SHARED_BUFFER_256b
;
; [ ] ‘âà ­¨æ  އ“ ¤«ï ᪮௠ ¢ SLOT0 ¤®«¦­  ᮢ¯ ¤ âì á ­ã«¥¢®© áâà ­¨æ¥© ¯®àâ  #7FFD
MODULE MANAGE_ZX_PAGES
;-----------------------------------------------------------------------;
; <20>¥ ¯®àâ¨âì DE
;‚室: A - TASK NUMBER
; GET_ZX_TASK_DATA:
; GET_ZX_TASK_DATA_OFFSET
; ADD A,_ZX_TASK_DATA
; LD C,A
; LD B,0
; LD IX,SYS_PAGE.ZX_TASK.CURRENT
; ADD IX,BC ; ¤ ­­ë¥ ­®¢®© § ¤ ç¨
; RET
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;‚•Ž„: HL - ᯨ᮪ áâà ­¨æ
; E - 0 = 128kb, 1 = 512kb
INIT_vRAM: XOR A
.set_1ffd: LD BC,#1FFD
OUT (C),A
; set 128
LD B,#7F
LD D,%0000'0000
CALL SET_7FFD
;
XOR A
OUT (C),A
BIT 0,E ; 128/512
RET Z
; set 128 + 384
LD A,SYS_PORT.CNF_512 + SYS_PORT.CNF_0 + SYS_PORT.TURBO.ON
OUT (SYS_PORT.ROM),A
;
LD D,%0100'0000
CALL SET_7FFD
LD D,%1000'0000
CALL SET_7FFD
LD D,%1100'0000
CALL SET_7FFD
;
XOR A
OUT (C),A
RET
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;‚•Ž„: HL - ᯨ᮪ áâà ­¨æ
; D - ­ ç «ì­®¥ §­ ç¥­¨¥ ¤«ï 7FFD
SET_7FFD: LD A,(HL)
OUT (C),D
OUT (SLOT3),A
INC HL
INC D
BIT 3,D ; ª®«¨ç¥á⢮ áâà ­¨æ
JR Z,SET_7FFD
RET
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;‚室: HL - ¡ãä¥à áâà ­¨æ (SLOT1..SLOT2) ­  ª®â®àë¥ ¬ ¯¯¨¬ (¢á¥£¤  11 èâ.)
; <09>¥à¢ë© ¡ ©â ᯨ᪠ - RAM BLOCK ID. „ «¥¥ ª ª 㣮¤­® ­®¬¥à 
; áâà ­¨æ ¤«ï ª ¦¤®£® ⨯  áâà ­¨æë vROM. …᫨ ª ª ï-â® áâà ­¨æ 
; vROM ­¥ ¨á¯®«ì§ã¥âáï, â® áâ ¢¨âáï #FF
INIT_vROM: LD A,(HL)
OR A
SCF
RET Z
INC A
JR NZ,.free_pages
LD (HL),A
JR .set_vROM
;
.free_pages: LD A,(SYS_PAGE.Block_ID.vROM)
CP (HL)
EX DE,HL
LD C,BIOS.FreeMem
CALL NZ,ToBIOS_FromEXT
EX DE,HL
;
LD A,(HL)
.set_vROM: LD (SYS_PAGE.Block_ID.vROM),A
; ãáâ ­®¢ª  ¯®à⮢ ROM
LD DE,.PORTS
LD B,.PORTS.Size
.loop: PUSH BC
INC HL
LD A,(HL)
CP #FF
JR NZ,.not_Spec_Page
LD A,Spec_Page
.not_Spec_Page: LD B,A
LD A,(DE)
INC DE
PUSH DE
PUSH HL
LD C,BIOS.SET_PORTS
CALL ToBIOS_FromEXT
;CALL SET_PORTS
POP HL
POP DE
POP BC
DJNZ .loop
; ãáâ ­®¢ª  ¬¥âª¨ ZX ¥á«¨ à ¬¡«®ª ­¥ 0
LD A,(SYS_PAGE.Block_ID.vROM)
OR A
RET Z
;
.set_ZX_flag: IN A,(SLOT3)
LD D,A
LD A,Spec_Page
OUT (SLOT3),A
;
LD HL,'XZ'
LD (Spec_Page.flag_Z),HL
;
LD A,D
OUT (SLOT3),A
RET
;
.PORTS: DB ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128
DB ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48
DB ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS
DB ACEX.vROM.ZX_EXPANSION ; ROM-ID - EXPANSION
DB ACEX.vROM.ZX_BIOS_1 ; ROM-ID - BIOS-1
DB ACEX.vROM.ZX_BIOS_2 ; ROM-ID - BIOS-2
DB ACEX.vROM.BASIC_128_2 ; BASIC 128 - 2
DB ACEX.vROM.BASIC_48_2 ; BASIC 48 - 2
DB ACEX.vROM.TR_DOS_2 ; TR-DOS - 2
DB ACEX.vROM.ZX_EXPANSION_2; BIOS (ZX_EXP) - 2
.PORTS.Size EQU $-.PORTS
;-----------------------------------------------------------------------;
;!FIXIT
;----------------[‚뤥«¥­¨¥/®á¢®¡®¦¤¥­¨¥ áâà ­¨æ ᯥªâà㬠]-------------;
;¢å®¤: ॣ B:
; FN 0x
; 0 - § à¥§¥à¢¨à®¢ ­®
; 1 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 48k. 3 áâà ­¨æë
; 2 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 128k. 2+6 áâà ­¨æë
; 3 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 512k. 2+30 áâà ­¨æë
; 4 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Scorpion 256k. 2+6+8 áâà ­¨æë
; 5..15 - § à¥§¥à¢¨à®¢ ­ë
; FN 1x
; 16 - ¯®«ãç¨âì à ¬¡«®ª¨ ¨­¨æ¨ «¨§¨à®¢ ­­ëå vROM ¨ VRAM
; 17..31 - § à¥§¥à¢¨à®¢ ­ë
; FN 2x ;!TODO
; 32 - § à¥§¥à¢¨à®¢ ­®
; 33 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Spectrum 48k ¨ ¨­¨â 1-© áâà ­¨æ vROM
; 34 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 128k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 35 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 512k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 36 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Scorpion 256k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 33..63 - § à¥§¥à¢¨à®¢ ­ë
; FN 4x
; 64 - ®á¢®¡®¤¨âì à ¬¡«®ª¨ vROM ¨ vRAM
; 65 - ®á¢®¡®¤¨âì à ¬¡«®ª vRAM
; 66 - ®á¢®¡®¤¨âì à ¬¡«®ª vROM
; 65..127 - § à¥§¥à¢¨à®¢ ­ë
; FN 8x
; 128 - ¨­¨æ¨ «¨§¨à®¢ âì ᢮© ­ ¡®à áâà ­¨æ vROM
;
; ॣ HL: ¯à¨ ॣ B[7]=1  ¤à¥á áâà ­¨æ (11 èâ):
; byte1 - RAM block ID, byte2..11 - áâà ­¨æë ¤«ï vROM - ZXSlot: 1,2,3(=0),à áè¨à¥­­ ï
;¢ë室: CF = 0: HL - ­®¬¥à  à ¬¡«®ª®¢ ¤«ï ०¨¬®¢ 0..16. H=vRAM, L=vROM
; CF = 1: A - ­®¬¥à ®è¨¡ª¨
;
;¥á«¨ áâíª ­ å®¤¨âáï ¢ âà¥â쥬 á«®â¥, â® ¢ë§®¢ á ¢ëª«î祭­ë¬¨ ¯à¥à뢠­¨ï¬¨
FN_ENTRANCE: ;!TODO A - TASK NUMBER
AND A
; LD A,BIOS.Error.NotSupported
; SCF
; RET NZ
; CCF
;
EXX
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
EXX
;
LD (SYS_PAGE.SP_SAVE),SP
LD SP,SYS_PAGE.SYS_SP
LD DE,.EXIT
PUSH DE
;-----------------------------------;
; Sub FN #8x
.API: BIT 7,B
JR NZ,INIT_vROM ; B = 128
; Sub FN #4x
BIT 6,B
JR NZ,FREE_vMEMORY ; B = 64..127
; Sub FN #2x ;!TODO ; [ ] free zx pages!
;BIT 5,B
;JR NZ, ; B = 32..63
; Sub FN #1x
BIT 4,B
JR Z,.x0x_FN ; B = 16
;
.GET_RAMBLOCK_IDs: ;‚室: A - TASK NUMBER. ‚ë室: H - vRAM block ID, L - vROM block ID
LD HL,(SYS_PAGE.Block_IDs)
RET
;
; Sub FN #0x
.x0x_FN: DEC B
JR Z,GET_48k_MEM ; B = 1
DEC B
JR Z,GET_128k_MEM ; B = 2
DEC B
JR Z,GET_512k_MEM ; B = 3
DEC B
JR Z,GET_SCORP_RAM ; B = 4
;-----------------------------------;
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
.EXIT: LD SP,(SYS_PAGE.SP_SAVE)
EXX
OUT (C),B
EXX
RET
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
FREE_vMEMORY: LD A,B
AND 3
JR Z,FREE_ALL_vMEMORY ; 0
DEC A
JR Z,FREE_vRAM ; 1
DEC A
JR Z,FREE_vROM ; 2
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;--------------;
FREE_vRAM: LD A,(SYS_PAGE.Block_ID.vRAM)
OR A
RET Z
LD C,BIOS.FreeMem
CALL ToBIOS_FromEXT
LD A,0
LD (SYS_PAGE.Block_ID.vRAM),A
RET
;--------------;
FREE_ALL_vMEMORY:
CALL FREE_vRAM
;--------------;
FREE_vROM: LD A,(SYS_PAGE.Block_ID.vROM)
OR A
RET Z
LD C,BIOS.FreeMem
CALL ToBIOS_FromEXT
PUSH AF
XOR A
LD (SYS_PAGE.Block_ID.vROM),A
;--------------;
RES_FLAG_ZXvROM: ; ­¥ ¤®«¦­® ¯®àâ¨âì DE
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
LD A,Spec_Page
OUT (SLOT3),A
XOR A
LD (Spec_Page.flag_Z),A
LD (Spec_Page.flag_X),A
EX AF,AF'
OUT (SLOT3),A
POP AF
RET
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;‚믮«­ï¥âáï ¤«ï ¢ë¤¥«¥­¨ï âàñå áâà ­¨æ އ“ 48k
GET_48k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_48k
JR GET_XXX_MEM
;‚믮«­ï¥âáï ¤«ï ¨­¨â  3 áâà ­¨æ އ“ 48k ¨ 29 áâà ­¨æ އ“ Pent512k
GET_512k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_512k
JR GET_XXX_MEM
;‚믮«­ï¥âáï ¤«ï ¢ë¤¥«¥­¨ï 3 áâà ­¨æ އ“ 48k ¨ 5 áâà ­¨æ އ“ 128k â ç¥ª
GET_128k_MEM: LD D,BIOS.ZX_MEMORY_MANAGER.MODE_128k
;JR GET_XXX_MEM
GET_XXX_MEM: CALL FREE_vRAM
.init: LD B,D
LD C,BIOS.GetMem
CALL ToBIOS_FromEXT
RET C
LD (SYS_PAGE.Block_ID.vRAM),A
RET
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;‚믮«­ï¥âáï ¤«ï ¢ë¤¥«¥­¨ï 3 áâà ­¨æ އ“ 48k ¨ 14 áâà ­¨æ އ“ Scorp256k
;‚室: ---
;‚ë室: A - RAM block ID
GET_SCORP_RAM: CALL FREE_vRAM
; ¢ë¤¥«¨âì áâà ­¨æë ᪮௠
XOR A
LD DE,#F0D0 ; ¤«ï 䨫ìâà . #F0 - ¬ áª , #D0 - áâà ­¨æë ISA #D0..#DF
LD BC,256*BIOS.ZX_MEMORY_MANAGER.MODE_256k/2 + #FF ; B - ª®«¨ç¥á⢮ áâà ­¨æ, C - Œ¥âª  ª®­æ  à ¬¡«®ª 
LD HL,SYS_PAGE.RAM_TABLE
.allocate_loop: DEC L
JR Z,.error_no_mem
CP (HL)
JR NZ,.allocate_loop
;
CALL .check_barred_pages
LD A,0
JR Z,.allocate_loop
;
LD (HL),C
LD C,L
DJNZ .allocate_loop
; L = 㪠§ â¥«ì 楯®çª¨.
AND A
LD D,L
; Get Pent128 mem
LD BC,256*BIOS.ZX_MEMORY_MANAGER.MODE_128k + BIOS.GetMem
CALL ToBIOS_FromEXT
;CALL EMM.GetMem
; A - Pent128 mem block id
LD B,D ; Scorp128 mem block id
LD C,BIOS.MergeMemBlocks
CALL ToBIOS_FromEXT
;CALL EMM.MergeMemBlocks
LD (SYS_PAGE.Block_ID.vRAM),A
RET
;
; 䨫ìâà ¤«ï áâà ­¨æ ᪮௠
;¢ë室: ZF=1 - áâà ­¨æ  ­¥ ¯®¤å®¤¨â
.check_barred_pages:
; check reset page
LD A,L
CP RESET_PAGE
RET C
RET Z
; check isa page
AND D
XOR E ; áâà ­¨æë ISA #D0..#DF
RET NZ
LD L,E
RET
;
.error_no_mem: LD A,C
LD C,BIOS.FreeMem
CALL ToBIOS_FromEXT
;CALL EMM.FreeMem
LD A,BIOS.Error.EMM.NoMemory
SCF
RET
;-----------------------------------------------------------------------;
ENDMODULE
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; [ ] free zx pages!
; ‚室: D: 0 - BASIC 128, 1 - BASIC 48, 2 - TR-DOS 128,
; 3 - EXPANSION. C § ªàëâ묨 128-¬¨ ¯®àâ ¬¨:
; 4 - TR-DOS, 5 - BASIC 48
; E: §­ ç¥­¨¥ ¤«ï SYS_PORT/CNF_PORT
; L: Block_ID.vROM
; H: Block_ID.vRAM
; B: Port All Mode
;A [1..0]: 1 - int scorp, 2 - int pent, 3 - int ZX
; A'[2]: 0 - set default palette, 1 - don't change palette
; A'[7]: 0 - 320, 1 - 312 áâப
GOTO_SPECTRUM: DI
LD C,A
;
; set shared pages
XOR A
OUT (SLOT2),A ; ZERO_PAGE
DEC A
OUT (SLOT1),A ; SHARED_PAGE
;
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD (SYS_PAGE.CONFIG_DE),DE
LD (SYS_PAGE.Block_IDs),HL ;!FIXIT ®á¢®¡®¤¨âì áâ àë¥ §­ ç¥­¨ï? ; [ ] free zx pages!
;
LD A,C
AND %0000'0011
LD SP,#C000
;!TODO ᤥ« âì  ªâ¨¢ æ¨î ¢¨­â  ¤«ï ¯ à ¬¥âà  ¨§ Setup
; ãáâ ­®¢ª  ¨­â 
EXX
LD C,BIOS.FN_SYNC
CALL ToBIOS_FromEXT
EXX
; ãáâ ­®¢ª  à §¢ñà⪨
LD A,C
EXX
RLCA
AND %0000'0001
OR %1000'0110
LD C,BIOS.FN_SYNC
CALL ToBIOS_FromEXT
EXX
;
LD A,C
PUSH BC
EXX
AND %0000'0100 ;!TODO § ¯®¬­¨âì/¢®ááâ ­®¢¨âì ª á⮬­ãî ¯ «¨âàã?
LD BC,BIOS.SET_PAL_INIT.ZX
CALL Z,ToBIOS_FromEXT
;
; [x] ä¨ªá ­¥¯®«­®© ¤¥è¨äà æ¨¨ ¯®àâ  #FFFD (¯¨èãâ ¢ #C0FD) ¤«ï ZX mode
LD A,#FF
LD HL,%00'010'1'1110'1101
LD DE,%10'111'1'1111'1111 ; CNF_0, CNF_1
LD BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG
CALL ToBIOS_FromEXT
;
LD E,0
LD BC,BIOS.LP_OPEN_S.ZX_32x24_Default
CALL ToBIOS_FromEXT
;
LD E,0
LD HL,#5104
LD BC,BIOS.LP_OPEN_S.ZX_32x24
CALL ToBIOS_FromEXT
;
LD BC,BIOS.SWAP_RAM_DRIVES.ZX
CALL ToBIOS_FromEXT
;
LD A,(SYS_PAGE.Block_ID.vRAM)
LD HL,SYS_PAGE.SHARED_BUFFER_256b
LD C,BIOS.GetMemBlkPages
CALL ToBIOS_FromEXT
;!FIXIT
;RET C
; !FIXIT ¯à®¢¥àª  à §¬¥à  ¡«®ª , ᤥ« âì, ç⮡ ¢ë¡¨à «áï ®¡êñ¬ ¯ ¬ïâ¨
;LD A,B
;CP 16
;
LD D,B
EXX
POP BC
EXX
;.TASK_0: § ¤ ç  0, ०¨¬ 256 ª¨«®¡ ©â
.START_TASK: XOR A
OUT (RGADR),A ; ॣ¨áâà ¢¨¤¥®  ¤à¥á 
OUT (RGMOD),A ; ॣ¨áâà ¬®¤ë
;
LD IY,.BASIC_128
JR INIT_PAGES ; ¨­¨æ¨ «¨§ æ¨ï ­®¬¥à®¢ áâà ­¨æ ०¨¬  ᯥªâà㬠
;start_basic:
.BASIC_128: LD SP,#C000
LD HL,RES128_PROG
LD DE,ZX_VARS.PRINTER_BUFFER ; § ¯ã᪠¯à®£à ¬¬ë ­  BASIC-¥.
LD BC,RES128_PROG.Size
LDIR
JP ZX_VARS.PRINTER_BUFFER
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;*****************************************
;
; ˆ­¨æ¨ «¨§ æ¨ï áâà ­¨æ ¤«ï
; ᯥªâà㬮¢áª®£® ०¨¬  ¨
; ¢®ááâ ­®¢«¥­¨¥ ᯥªâà㬮¢áª®£®
; íªà ­ 
;
; ‚®§¢à â ¯® IY
;
; !!! NO USE STACK !!!
;
;*****************************************
;!TODO á⥪ ãáâ ­®¢«¥­ ¢® ¢â®à®© áâà ­¨æ¥, ­¥ ¨á¯®«ì§®¢ âì ¨«¨ ãáâ ­ ¢«¨¢ âì ¢ ¤àã£ãî!
; ¨­¨æ¨ «¨§ æ¨ï áâà ­¨æ zx spectrum
; HL -  ¤à¥á ¡«®ª  áâà ­¨æ ¢ SYS_PAGE SLOT3
; D - ª®«¨ç¥á⢮ íâ¨å áâà ­¨æ
INIT_PAGES: LD A,SYS_PAGE
OUT (SLOT1),A
; [ ] free zx pages! ¯¥à¥¤¥« âì ¨­¨â. ¥á«¨ 512, â® ­¥â 1ffd ¨ ­ ®¡®à®â
LD A,SYS_PORT.TURBO.ON + SYS_PORT.CNF_0; + SYS_PORT.CNF_512
OUT (SYS_PORT.ROM),A
;
RES 7,H
;
LD A,D
CP BIOS.ZX_MEMORY_MANAGER.MODE_48k
JR Z,.set_48k
;
LD E,0 ; pent128
CP BIOS.ZX_MEMORY_MANAGER.MODE_256k
JR Z,.set_scorp
;
CP BIOS.ZX_MEMORY_MANAGER.MODE_128k
JR Z,.set_pent
INC E
CP BIOS.ZX_MEMORY_MANAGER.MODE_512k
JR Z,.set_pent
;!FIXIT ®¡à ¡®âª  ®è¨¡ª¨
DI
.error_loop: LD A,R
AND 7
OUT (BorderColor),A
JR .error_loop
;
.set_48k: LD A,5 ; !HARDCODE CONFIG_DE.ZX_START ‚•Ž„ BASIC 48 á § ªàëâ묨 128-¬¨ ¯®àâ ¬¨
LD (SYS_PAGE.CONFIG_DE.ZX_START - #8000),A
LD A,(HL) ; SLOT0, SLOT3 page
INC HL
LD E,(HL) ; SLOT1 page
INC HL
LD D,(HL) ; SLOT2 page
JR .set_slots
;
.set_scorp: CALL MANAGE_ZX_PAGES.INIT_vRAM
LD A,#10
CALL MANAGE_ZX_PAGES.INIT_vRAM.set_1ffd
; A = 0, BC = #7FFD
LD B,#1F
OUT (C),A
INC A ; reset ZF
;
.set_pent: CALL Z,MANAGE_ZX_PAGES.INIT_vRAM
; ¬¥­ï¥¬ ¯®à冷ª ¤«ï ¯à®æ¥¤ãàë set_48k
.set_table: LD A,(SYS_PAGE.SHARED_BUFFER_256b+2 - #8000) ; SLOT2 page
LD D,A
LD A,(SYS_PAGE.SHARED_BUFFER_256b+5 - #8000) ; SLOT1 page
LD E,A
LD A,(SYS_PAGE.SHARED_BUFFER_256b+0 - #8000) ; SLOT0, SLOT3 page
;
.set_slots: OUT (SLOT0),A
OUT (SLOT3),A
LD A,E
OUT (SLOT1),A
LD A,D
OUT (SLOT2),A
;
JP (IY)
;-----------------------------------------------------------------------;
;
;>$< >$< >$< >$< >$< >$< [ <20><EFBFBD>…Œ…™€…Œ€Ÿ އ“ ] >$< >$< >$< >$< >$< >$< ;
;--------[ <20>ணࠬ¬ , à §¬¥é ¥¬ ï á #5B00 ¤«ï § ¯ã᪠ Spectrum ]--------;
RES128_PROG:
DISP ZX_VARS.PRINTER_BUFFER ;#5B00
XOR A
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)
OUT (C),B
;
EXX
LD A,B
EXX
LD BC,Port_All_Mode
OUT (C),A
;
XOR A
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 ¯®ª  ­¥ à ¡®â ¥â. Page #45, BIOS (ZX_EXP) #E0
XOR A
OUT (C),A ; 7FFD
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
.Size EQU $-RES128_PROG
;-----------------------------------------------------------------------;
;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<;
;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
/*
;!TODO ¯¥à¥¤¥« âì ¯®¤ ¯¥à¥ª«î祭¨¥ ­  à §­ë¥ ᯥªâàã¬ë á § ¯ã饭­ë¬¨ § ¤ ç ¬¨
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)
GET_ZX_TASK_DATA_OFFSET
LD C,A
IN A,(SLOT3)
LD B,A ; 3-ï áâà ­¨æ  ⥪ã饩 § ¤ ç¨
LD A,SYS_PAGE
OUT (SLOT3),A
LD IX,SYS_PAGE.ZX_TASK.CURRENT ; ¤ ­­ë¥ § ¤ ç
LD A,_ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
ADD A,(IX) ; ᬥ饭¨¥ ¤ ­­ëå ⥪ã饩 § ¤ ç¨
LD E,A
LD D,0
ADD IX,DE ; ¤ ­­ë¥ ⥪ã饩 § ¤ ç¨
LD (IX + _ZX_TASK_DATA.SLOT3_PAGE),B ; á®åà ­¨âì áâà ­¨æã 3
LD HL,0
ADD HL,SP
LD (IX + _ZX_TASK_DATA.SP),L ; á®åà ­¨âì á⥪ § ¤ ç¨
LD (IX + _ZX_TASK_DATA.SP + 1),H
SET 0,(IX + _ZX_TASK_DATA.STATE) ; ãáâ ­®¢¨âì ä« £ á®åà ­¥­­®á⨠⥪ã饩 § ¤ ç¨
RES 1,(IX + _ZX_TASK_DATA.STATE) ; ãáâ ­®¢¨âì ä« £, çâ® § ¤ ç  ¯®ª¨­ãâ 
LD IX,SYS_PAGE.ZX_TASK.CURRENT
LD A,_ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
ADD A,C ; ᬥ饭¨¥ ¤ ­­ëå ­®¢®© § ¤ ç¨
LD E,A
LD D,0
ADD IX,DE ; ¤ ­­ë¥ ­®¢®© § ¤ ç¨
; BIT 1,(IX + _ZX_TASK_DATA.STATE)
; JR NZ,TASK_IN_WORK ; § ¤ ç  ¢ à ¡®â¥ ??? ­¥¢¥à­®¥ § ¢¥à襭¨¥
; ; á¡à á뢠âì ¨«¨ ¯à®áâ® ¢®§¢à é âìáï
BIT 0,(IX + _ZX_TASK_DATA.STATE) ; ¡ë«  á®åà ­¥­ /­¥â
JR NZ,TASK_SET ; § ¤ ç  áãé¥áâ¢ã¥â
; § ¤ ç¨ ­¥ ¡ë«®!
LD IX,SYS_PAGE.ZX_TASK.CURRENT
LD A,C ; § ¤ ç 
LD (IX),A ; ãáâ ­®¢¨âì ­®¢ãî § ¤ çã ⥪ã饩
JP GOTO_SPEC.START_TASK ; § ¯ãáâ¨âì ­®¢ãî § ¤ çã!
; ; ¨ ¯®ª  ¯®ä¨£ à á¯à¥¤¥«¥­¨¥ ¯ ¬ïâ¨!
TASK_SET:
IF FREE_ZX_PAGES
LD IY,TASK_RESTORE
ELSE
LD IX,TASK_RESTORE
ENDIF
LD A,C
EXX
JP INIT_PAGES ; ¯¥à¥ª«îç¨âì ¢á¥ áâà ­¨æë!
TASK_RESTORE:
EXX
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,C
LD IX,SYS_PAGE.ZX_TASK.CURRENT
LD (IX),A ; ãáâ ­®¢¨âì ­®¢ãî § ¤ çã ⥪ã饩
; !TEST
;LD E,A
;LD D,0
;ADD IX,DE ; ­®¢ ï § ¤ ç 
;LD E,16
ADD A,_ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
LD E,A
LD D,0
;
ADD IX,DE
LD L,(IX + _ZX_TASK_DATA.SP) ; ¢á¯®¬­¨âì á⥪
LD H,(IX + _ZX_TASK_DATA.SP + 1)
LD SP,HL
LD A,(IX + _ZX_TASK_DATA.SLOT3_PAGE); ¢á¯®¬­¨âì âà¥âìî áâà ­¨æã
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