ZX-SP-ROMs/ZX_EXP/EXP_FN.ASM
Anatoliy Belyanskiy 51b40b7af5 Setup
2023-06-17 04:36:58 +10:00

765 lines
11 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.

TAB_FNS:
;FN_80h
DW LP_OPEN_S ; ®âªàë⨥ ®ª­ 
DW LP_PRINT_ALL ; ¯¥ç âì ᨬ¢®«  ¢ ®ª­®
DW LP_PRINT_SYM ; ¯¥ç âì ᨬ¢®«  ¡¥§  âà
DW LP_PRINT_ATR ; ¯¥ç âì ⮫쪮  âਡãâ 
DW LP_SET_PLACE ; ãáâ ­®¢ª  ¯®§¨æ¨¨ ¯¥ç â¨
DW LP_PRINT_LINE ; ¯¥ç âì áâப¨ ¤«¨­®© B
DW LP_PRINT_LINE2 ; ¯¥ç âì áâப¨ -//- ¡¥§  âਡã⮢
DW LP_PRINT_LINE3 ; ¯¥ç âì áâப¨ ¤«¨­®© B ¤® D
;FN_88h
DW LP_PRINT_LINE4 ; ¯¥ç âì áâப¨ -//- ¡¥§  âਡã⮢
DW LP_CLS_WIN
DW LP_SCROLL_UD
DW LP_PRINT_LINE5
DW LP_PRINT_LINE6
DW LP_CLS_WIN_2
DW LP_GET_PLACE
DW FN_TURBO
;FN_90h
DW EMM_FN0 ; ­¥à §àãè î饥 ®¯à¥¤¥«¥­¨¥ ®¡ê¥¬  އ“.
DW EMM_FN1 ; ¨­¨æ¨ «¨§ æ¨ï à á¯à¥¤¥«¥­¨ï ¯ ¬ïâ¨
DW EMM_FN2 ; ¯®«ãç¨âì ¡«®ª ¯ ¬ïâ¨
DW EMM_FN3 ; ®á¢®¡®¤¨âì ¡«®ª ¯ ¬ïâ¨
DW EMM_FN4 ; ¯®«ãç¨âì ­®¬¥àa áâà ­¨æ RAM-Disk
DW EMM_FN5 ; ¯®«ãç¨âì á«¥¤ãîéãî áâà ­¨æã
DW EMM_FN6 ; ¯®«ãç¨âì  ¤à¥á  ¯®à⮢
DW EMM_FN7 ; ¨­¨æ¨ «¨§ æ¨ï ***
;FN_98h
DW RAMD_CALC_PAGE ; Fn 98h
DW SET_DISK_TYPE
DW DISK_REDIR
DW FN_NO
DW FN_NO
DW EMM_DIV ; à §¤¥«¥­¨ï ¡«®ª  ­  ¤¢ .
DW EMM_ADD ; ᫨ﭨ¥ ¤¢ãå ¡«®ª®¢
DW MSDOS_COLD_VARS ; ¨­¨æ¨ «¨§ æ¨ï ¢á¥© ¯ ¬ïâ¨
;FN_A0h
DW PIC_FN0 ; ŽŠ<E28099>ˆ… ŽŠ<C5BD>€ - Fn 0A0h
DW PIC_FN1 ; ‚›‚…‘’ˆ ’Ž—Š“
DW PIC_FN2 ; ‚›‚Ž„ ˆ<E280B9>ˆˆ COPY
DW PIC_FN3 ; ‚›‚Ž„ ˆ<E280B9>ˆˆ FILL
DW PIC_FN4 ; ‚›‚Ž„ <20>ˆ<CB86>
DW PIC_FN5 ; “<E28099>ŽŠ€ RGMOD
DW PIC_FN6 ; A - page_pal, E - ­®¬¥à ¯ «¨âàë, B - ⨯ ¯ «¨âàë
DW PIC_FN7
;FN_A8h
DW PIC_FN8
DW PIC_FN9
DW PIC_FN10
DW PIC_FN11
DW PIC_FN12
DW PIC_FN14
DW PIC_FN14
DW PIC_FN15
;FN_B0h
DW WIN_OPEN_WIN ; ®âªàë⨥ ®ª­  ¯® ®¯¨á â¥«î
DW WIN_CLOSE_WIN ; § ªàë⨥ ®ª­ 
DW WIN_COPY_WIN ; á®åà ­¥­¨¥ ⥪á⮢®£® ®ª­  ¢ ¯ ¬ïâ¨
DW WIN_REST_WIN ; ¢®ááâ ­®¢«¥­¨¥ ⥪á⮢®£® ®ª­  ¨§ ¯ ¬ïâ¨
DW WIN_GET_SYM ; ¢§ïâì ᨬ¢®«
DW WIN_PUT_SYM ; ¯®«®¦¨âì ᨬ¢®«
DW WIN_SET_ZG ; § £à㧪  §­ ª®£¥­¥à â®à 
DW WIN_MOVE_WIN ; ¯¥à¥¬¥áâ¨âì ®ª­®
;FN_B8h
DW WIN_GET_ZG ; ¯®«ãç¨âì §­ ª®£¥­¥à â®à
DW FN_NO
DW FN_NO
DW FN_NO
DW FN_NO
DW FN_NO
DW FN_NO
DW FN_NO
;FN_C0h
DW EMM_FN0 ; ¯®«ãç¨âì ¤ ­­ë¥ ®¡ ®¡ê¥¬¥ ¯ ¬ï⨠¨ ª®«-¢® ᢮¡. áâà.
DW EMM_FN1 ; ¨­¨æ¨ «¨§ æ¨ï à á¯à¥¤¥«¥­¨ï ¯ ¬ïâ¨
DW EMM_FN2M ; ¯®«ãç¨âì ¡«®ª ¯ ¬ïâ¨
DW EMM_FN3M ; ®á¢®¡®¤¨âì ¡«®ª ¯ ¬ïâ¨
DW EMM_FN4M ; ¯®«ãç¨âì ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ¯ ¬ïâ¨
DW EMM_FN5M ; ¯®«ãç¨âì ᯨ᮪ áâà ­¨æ ¡«®ª  ¯ ¬ïâ¨
DW EMM_FN6 ; ¯®«ãç¨âì  ¤à¥á  ¯®à⮢ ®ª®­
DW EMM_FN5 ; ¯®«ãç¨âì á«¥¤ãîéãî áâà ­¨æã ¡«®ª 
;FN_C8h
DW BLK_R_W ; äã­ªæ¨ï ç⥭¨ï/§ ¯¨á¨ ¢ ¡«®ª ¯ ¬ïâ¨
DW BLK_TO_RAMD ; ­ §­ ç¨âì ¡«®ª RAM-Disk-ã
DW RAMD_CLEAR ; ®á¢®¡®¤¨âì RAM-Disk
DW RAMD_TO_DRV ; ­ §­ ç¨âì RAM-Disk ­  ¤¨áª®¢®¤
DW FDD_TO_DRV ; ­ §­ ç¨âì REAL_DRIVE ­  ¤¨áª®¢®¤
DW HDD_TO_DRV ; ­ §­ ç¨âì HDD ­  ¤¨áª®¢®¤
DW GET_RAMD_ST ; ¯®«ãç¨âì ⨯ ­ §­ ç¥­¨ï ­  RAM-Disk
DW GET_DRV_ST ; ¯®«ãç¨âì ⨯ ­ §­ ç¥­¨ï ­  ¤¨áª®¢®¤
;FN_D0h
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
;FN_D8h
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
DW FN_LIB
;FN_E0h
DW LP_PRINT_LINE_DIR
DW FN_NO
DW FN_NO
DW FN_NO
DW FN_NO
DW FN_NO
DW FN_NO
DW FN_NO
;FN_E8h
DW FN_SENT_BYTE ; ¯®á« âì ¡ ©â ç¥à¥§ PC_link
DW FN_RESEIVE_B ; ¯à¨­ïâì ¡ ©â ç¥à¥§ PC_link
DW FN_KBD_OUT ; ¯®á« âì ¡ ©â ¢ ª« ¢¨ âãàã
DW FN_NO
DW FN_NO
DW FN_CRIPT
DW AY8910
DW FN_VERSION
;FN_F0h
DW SPRINTER_1
DW SPRINTER_2
DW FN_SINC
DW SPRINTER_ALL
DW DCP_FN0
DW CMOS_TEST
DW CMOS_RD
DW CMOS_WR
;FN_F8h
DW SET_ROM_PAGES
DW READ_PORTS ;
DW WRITE_PORTS ;
DW GOTO_SPEC ; Goto Spectrum!
DW FN_NO
DW FN_RESET
DW FN_NO ; SAVE_AUTOSTART
DW FN_VERSION
EXP_FNS: ; ‚室 ¢ äã­ªæ¨î ¨§ DOS
POP AF
CALL EXP_FNS1
CALL DOS_ON
JP EXP_FNS_RET
;************************************
EXP_FNS_RST18: ; ‚室 ¢ äã­ªæ¨î ¯® RST18 ¨ RST8
bit 7,c
JR Z,ower2_fn
CALL EXP_FNS1
RET
ower2_fn:
BIT 6,C
RES 6,C
JR NZ,EXP_HDD_X
SCF
RET
EXP_HDD_X:
CALL EXP_HDD
RET
;**********************************
FN_CRIPT:
DEC B
SCF
RET NZ
LD HL,(ROM_NUMBER)
LD A,(ROM_NUMBER+2)
LD BC,5281h
LD DE,47E8h
AND A
RET
;**********************************
START_DI:
PUSH AF
LD A,R
JP PE,XX_DI
LD A,R
XX_DI: LD A,80h
JP PE,XX_DI2
XOR A
XX_DI2: LD R,A
DI
POP AF
RET
END_DI: PUSH AF
LD A,R
BIT 7,A
JR Z,XX_DI3
EI
POP AF ; PE
RET
XX_DI3: DI
POP AF ; PO
RET
;**********************************
EXP_FNS1:
PUSH HL
PUSH AF
LD L,C
SLA L
LD H,TAB_FNS/256
LD A,(HL)
INC L
LD H,(HL)
LD L,A
POP AF
EX (SP),HL
RET
READ_PORTS:
WRITE_PORTS:
FN_NO:
SCF
RET
SET_ROM_PAGES: ; in A - page, B - new ROM-page
; out B - old ROM-page
EX AF,AF'
LD A,CNF_0
OUT (CNF_PORT),A
LD C,PAGE2 ; ¯®«ãç¨âì áâà ­¨æã
IN D,(C)
LD A,40H ; ãáâ ­®¢¨âì ­®¢ãî
OUT (C),A
LD A,(08000H) ; á®åà ­¨âì â® çâ® ¡ë«®
LD L,A
LD A,(08200H)
LD H,A
EX AF,AF' ; áâà ­¨æ 
LD (08000H),A ; ãáâ ­®¢¨âì ¯®àâ ROM TR-DOS
LD (08200H),A
EX AF,AF'
LD A,B
LD BC,0
EX AF,AF'
IN A,(C)
EX AF,AF'
OUT (C),A ; ãáâ ­®¢¨âì ­®¢ë© TR-DOS
EX AF,AF'
LD B,A
LD A,L
LD (08000H),A ; ¢¥à­ãâì ¯®àâ
LD A,H
LD (08200H),A ; ¢¥à­ãâì ¯®àâ
LD C,PAGE2
LD A,SYS_PAGE
OUT (C),A
LD A,(CONFIG_DE-4000H)
OUT (C),D ; ¢¥à­ãâì áâà ­¨æã
OUT (CNF_PORT),A
AND A
RET
;TAB_SIZE EQU $-TAB_FNS
;******************************************
;*********************************************
;*****************************************
;
; ”ã­ªæ¨ï ¤¥è¨äà â®à  ¯®à⮢.
; HL -  ¤à¥á
; DE - ¬ áª  - 0 ¨§¬¥­ï¥¬ë¥ ¡¨âë, 1 ­¥¨§¬¥­ï¥¬ë¥
; B - ¯®àâ
;
; ALL STACKS, DI
;
;*****************************************
DCP_FN0:
AND A
JP Z,PORTS_INIT
PUSH IX
LD IX,RET_DCP_FN0
IN A,(PAGE3)
EX AF,AF'
LD A,DCP_PAGE
OUT (PAGE3),A
JP DCP_FN0M
RET_DCP_FN0:
EX AF,AF'
OUT (PAGE3),A
AND A
POP IX
RET
BLK_TO_RAMD: ; RAM-Disk A, BLK - B
CP RAMD_KEY_NUM
CCF
RET C
PUSH HL
PUSH BC
LD L,A
IN A,(PAGE2)
LD C,A
LD A,SYS_PAGE
OUT (PAGE2),A
LD A,L
LD HL,RAMD_KEYS-4000H
ADD A,L
LD L,A
LD A,(HL) ; ª«îç ¡«®ª 
AND A
JR NZ,BLK_BUSY ; RAM-Disk § ­ïâ - ®è¨¡ª 
LD (HL),B
LD A,C
OUT (PAGE2),A
LD A,B
AND A
POP BC
POP HL
RET
BLK_BUSY:
LD A,C
OUT (PAGE2),A
SCF
POP HL
RET
RAMD_CLEAR: ; RAM-Disk A
CP RAMD_KEY_NUM
CCF
RET C
PUSH HL
LD L,A
IN A,(PAGE2)
LD C,A
LD A,SYS_PAGE
OUT (PAGE2),A
LD A,L
LD HL,RAMD_KEYS-4000H ; RAM-Disk ᢮¡®¤¥¬
ADD A,L
LD L,A
LD B,A ; § ¯®¬­¨âì 㤠«ï¥¬ë© à ¬¤¨áª
LD A,(HL)
AND A
JR Z,BLK_BUSY ; ¢®§¢à â á ®è¨¡ª®©
LD (HL),0
LD A,C
OUT (PAGE2),A
AND A
POP HL
RET
RAMD_TO_DRV: ; RAM-Disk A, DRV - B
CP RAMD_KEY_NUM
CCF
RET C
LD C,A
LD A,B
CP 4
CCF
RET C
LD HL,DISK_TYPE-4000H
LD L,B
IN A,(PAGE2)
LD B,A
LD A,SYS_PAGE
OUT (PAGE2),A
LD A,C
ADD A,4
LD (HL),A
LD A,B
OUT (PAGE2),A
AND A
RET
FDD_TO_DRV: ; Disk A, DRV - B
CP 4
CCF
RET C
LD C,A
LD A,B
CP 4
CCF
RET C
LD HL,DISK_TYPE-4000H
LD L,B
IN A,(PAGE2)
LD B,A
LD A,SYS_PAGE
OUT (PAGE2),A
LD (HL),C
LD A,B
OUT (PAGE2),A
AND A
RET
HDD_TO_DRV: ; HDD A, DRV - B
AND 0FH
LD C,A
LD A,B
CP 4
CCF
RET C
LD HL,DISK_TYPE-4000H
LD L,B
IN A,(PAGE2)
LD B,A
LD A,SYS_PAGE
OUT (PAGE2),A
LD A,C
ADD A,40H
LD (HL),A
LD A,B
OUT (PAGE2),A
AND A
RET
GET_RAMD_ST:
CP RAMD_KEY_NUM
CCF
RET C
PUSH BC
LD HL,RAMD_KEYS-4000H
ADD A,L
LD L,A
IN A,(PAGE2)
LD B,A
LD A,SYS_PAGE
OUT (PAGE2),A
LD C,(HL)
LD A,B
OUT (PAGE2),A
LD A,C
POP BC
AND A
RET
GET_DRV_ST:
CP 4
CCF
RET C
PUSH BC
LD HL,DISK_TYPE-4000H
ADD A,L
LD L,A
IN A,(PAGE2)
LD B,A
LD A,SYS_PAGE
OUT (PAGE2),A
LD C,(HL)
LD A,B
OUT (PAGE2),A
LD A,C
POP BC
AND A
RET
CMOS_EMU_WR:
PUSH DE
LD C,PAGE3
IN B,(C)
LD E,SYS_PAGE
OUT (C),E
LD E,D
LD D,0FFH
LD (DE),A
OUT (C),B
POP DE
RET
;***********************************************
;
; CMOS - 35h,36h - ãáâ ­®¢ª¨ ¡¥©á¨ª 
;
;***********************************************
CMOS_WR:
WR_CMOS: ; § ¯¨áì á CMOS
CALL CMOS_TEST
JR C,CMOS_EMU_WR
XWR_CMOS: ; § ¯¨áì á CMOS
LD BC,CMOS_AWR
OUT (C),D
LD BC,CMOS_DWR
OUT (C),A
RET
CMOS_EMU_RD:
PUSH DE
LD C,PAGE3
IN B,(C)
LD E,SYS_PAGE
OUT (C),E
LD E,D
LD D,0FFH
LD A,(DE)
OUT (C),B
POP DE
RET
CMOS_RD:
RD_CMOS: ; ç⥭¨¥ ¨§ CMOS
CALL CMOS_TEST
JR C,CMOS_EMU_RD
XRD_CMOS: ; ç⥭¨¥ ¨§ CMOS
LD BC,CMOS_AWR
OUT (C),D
LD BC,CMOS_DRD
IN A,(C)
RET
CMOS_TEST:
PUSH DE
PUSH BC
PUSH AF
LD D,3FH
CALL XRD_CMOS
LD E,A
CPL
CALL XWR_CMOS
CALL XRD_CMOS
CPL
CP E
JR NZ,CMOS_ERR
LD A,E
CALL XWR_CMOS
POP AF
POP BC
POP DE
AND A
RET
CMOS_ERR:
LD A,E
CALL XWR_CMOS
POP AF
POP BC
POP DE
SCF
RET
;
;DE - ªã¤  - áâà ­¨æ  ®âªàëâ !
;BC - ᪮«ìª®
;HL - ¡ãä¥à
;
; PUSH BC
; LD H,D
; LD L,E
; ADD HL,BC
; JR C,CUT
; LD HL,BUFER
; LDIR
; POP BC
; RET
;CUT:
; PUSH HL
; LD A,L
; LD L,C
; LD C,A
; LD A,H
; LD H,B
; LD B,A
;
; AND A
; SBC HL,BC
; LD B,H
; LD C,L
; LD HL,BUFER
; LDIR
; CALL NEXT_BANK
; POP BC
; LD A,B
; OR C
; JR Z,LAB
; LDIR
;LAB: POP BC
; RET
;
FN_TURBO:
CP 2
JR Z,FN_TB_ONOFF
CP 3
JR Z,FN_TB_ONOFF
SCF
RET
FN_TB_ONOFF:
LD C,A
IN A,(PAGE3)
LD B,A
LD A,SYS_PAGE
OUT (PAGE3),A
LD DE,(CONFIG_DE)
LD A,E
AND 0FCh
OR C
LD E,A
OUT (CNF_PORT),A
LD (CONFIG_DE),DE
LD A,B
OUT (PAGE3),A
AND A
RET
EMM_FN9:
EMM_DIV: ; à §¤¥«¨âì ¡«®ª ¯ ¬ï⨠­  ¤¢  ¡«®ª 
; A - ¡«®ª, B - ¤«¨­  ¯¥à¢®£® ¡«®ª  ¯®á«¥ à §¤¥«¥­¨ï
; ¢ë室: A - ¡«®ª 1, B - ¡«®ª 2
INC B
DEC B
SCF
RET Z
DEC B
LD E,A
CALL EMM_FN4M ; ¯®«ãç¨âì ­®¬¥à áâà ­¨æë ¡«®ª 
RET C
LD D,A
IN A,(PAGE2)
EX AF,AF'
LD A,SYS_PAGE
OUT (PAGE2),A
LD H,RAMD_FAT/256-40H
LD L,D
LD A,(HL)
LD (HL),0FFH
LD B,A
EX AF,AF'
OUT (PAGE2),A
LD A,E
AND A
RET
EMM_FN8:
EMM_ADD: ; ᫨âì ¤¢  ¡«®ª  ¯ ¬ï⨠¢ ®¤¨­
; € - ¡«®ª 1, B - ¡«®ª 2
; ¢ë室: € - ¡«®ª
LD E,A
IN A,(PAGE2)
EX AF,AF'
LD A,SYS_PAGE
OUT (PAGE2),A
LD H,RAMD_FAT/256-40H
LD L,E
LD C,B
LD B,0
EMM_ADD_L:
LD A,(HL)
AND A
JR Z,EMM_ADD_ERR
CP 0FFH
JR Z,EMM_ADD_NEXT
LD L,A
DJNZ EMM_ADD_L
EMM_ADD_ERR:
EX AF,AF'
OUT (PAGE2),A
SCF
RET
EMM_ADD_NEXT:
LD A,C
AND A
JR Z,EMM_ADD_ERR
LD (HL),A
EX AF,AF'
OUT (PAGE2),A
AND A
LD A,E
RET
FN_RESET: ; B - ¯ à ¬¥âà á¡à®á 
DEC B ; B = 1 - á¡à®á ¡¥§ ¯¥à¥§ £à㧪¨ á奬ë.
; B = 2 - á¡à®á á ¯¥à¥§ £à㧪®© á奬ë
; ?? B = 3 - á¡à®á á ¯¥à¥§ £à㧪®© EP1K30
JR Z,RESET_1
; DEC B
; JR Z,RESET_2
DEC B
RET NZ
INC B
RESET_1:
DI
LD A,0
LD BC,1FFDH
OUT (C),A
LD B,7FH
OUT (C),A
LD A,40H ;DCP_PAGE
OUT (PAGE3),A
LD A,5
OUT (PAGE1),A
LD A,2
OUT (PAGE3),A
LD A,0
OUT (PAGE0),A
OUT (RGADR),A
OUT (RGMOD),A
;OUT (#E9),A ; #E9 = RGSCR ­¥ ॠ«¨§®¢ ­® ¢ á奬¥
; JP Z,0
JP RESET_ALL