894 lines
20 KiB
NASM
894 lines
20 KiB
NASM
;
|
||
;----------------------------[ ??????????? ]----------------------------;
|
||
; 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 |