Sprinter-BIOS/src/bios/exp/FUNC_ZX.ASM
2024-08-19 05:14:31 +10:00

392 lines
7.2 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.

;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
; [ ] free zx pages!
; ????? SYS_PAGE.SHARED_BUFFER_256b
IF FREE_ZX_PAGES
;----------------[‚뤥«¥­¨¥/®á¢®¡®¦¤¥­¨¥ áâà ­¨æ ᯥªâà㬠]-------------;
;¢å®¤: ॣ B: 0 - ¨­¨â ¯ ¬ï⨠Spectrum 48k
; 1 - ¨­¨â ¯ ¬ï⨠Pentagon 128k
; 2 - ¨­¨â ¯ ¬ï⨠Pentagon 512k
; 3 - ¨­¨â ¯ ¬ï⨠Scorpion 256k
; ॣ A: âॡ㥬®¥ ª®«-¢® áâà ­¨æ ¤«ï vROM
;
;¢ë室: CF = 0: A - ­®¬¥à à ¬¡«®ª 
; CF = 1: A - ­®¬¥à ®è¨¡ª¨
MANAGE_ZX_PAGES:
.GET_SCORP: IN A,(SLOT3)
LD E,A
LD A,SYS_PAGE
OUT (SLOT3),A
; ¯à®¢¥à¨âì ­ «¨ç¨¥ ᢮¡®¤­ëå áâà ­¨æ ᪮௠
; B = ª®«¨ç¥á⢮ áâà ­¨æ
LD B,8
XOR A
.check_loop: DEC L
JR Z,.error_no_mem
CP (HL)
JR NZ,.check_loop
;
CALL .check_barred_pages
LD A,0
JR Z,.check_loop
DJNZ .check_loop
; A = 0
; ¢ë¤¥«¨âì áâà ­¨æë ᪮௠
LD B,8
.allocate_loop: DEC L
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
.exit: LD A,E
OUT (SLOT3),A
LD A,L
RET
; 䨫ìâà ¤«ï áâà ­¨æ ᪮௠
;¢ë室: ZF=1 - áâà ­¨æ  ­¥ ¯®¤å®¤¨â
.check_barred_pages:
; check reset page
LD A,L
CP RESET_PAGE
RET C
RET Z
; check isa page
AND #F0
XOR #D0 ; áâà ­¨æë ISA #D0..#DF
RET NZ
LD L,#D0
RET
;
.error_no_mem: LD L,BIOS.Error.EMM.NoMemory
SCF
JR .exit
;-----------------------------------------------------------------------;
ENDIF
;-----------------------------------------------------------------------;
;!TODO § ¤¥©á⢮¢ âì
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:
;!TODO ᤥ« âì  ªâ¨¢ æ¨î ¢¨­â  ¤«ï ¯ à ¬¥âà  ¨§ Setup
.ZX_MODE: LD A,#FE ; !HARDCODE ᤥ« âì ç¥à¥§ ¬¥âªã ACC-off Spectrum-MODE
LD BC,Port_All_Mode
OUT (C),A
LD SP,#C000
;
CALL FN_SYNC.INT_PENT
CALL SET_TXT_PALETTE.ZX
;
LD E,0
CALL LP_SET_32
;
LD E,0
LD HL,#5104
CALL LP_SET_32.X
; ????? ¬®¦­® ¨á¯®«ì§®¢ âì ª®£¤ -­¨¡ã¤ì ª ª-­¨¡ã¤ì
; LD D,#35
; CALL CMOS_RD
; BIT 0,A
; PUSH AF
; CALL Z,SPRINTER_1
; POP AF
; PUSH AF
; CALL NZ,AY8910
; POP AF
.TASK_0: XOR A ; § ¤ ç  0, ०¨¬ 256 ª¨«®¡ ©â
.START_TASK: LD IX,.BASIC_128
JP 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
DI
JP ZX_VARS.PRINTER_BUFFER
;-----------------------------------------------------------------------;
;
;>$< >$< >$< >$< >$< >$< [ <20><EFBFBD>…Œ…™€…Œ€Ÿ އ“ ] >$< >$< >$< >$< >$< >$< ;
;--------[ <20>ணࠬ¬ , à §¬¥é ¥¬ ï á #5B00 ¤«ï § ¯ã᪠ Spectrum ]--------;
RES128_PROG:
DISP ZX_VARS.PRINTER_BUFFER ;#5B00
LD A,ROM.BIOS
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)
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.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
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
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;*****************************************
;
; ˆ­¨æ¨ «¨§ æ¨ï áâà ­¨æ ¤«ï
; ᯥªâà㬮¢áª®£® ०¨¬  ¨
; ¢®ááâ ­®¢«¥­¨¥ ᯥªâà㬮¢áª®£®
; íªà ­ 
;
; ‚®§¢à â ¯® IX
;
; !!! NO USE STACK !!!
;
;*****************************************
;!TODO
; ¨­¨æ¨ «¨§ æ¨ï áâà ­¨æ zx spectrum
INIT_PAGES:
AND A
LD E,A
EX AF,AF'
LD A,E
; BIT 7,A
; JR Z,SCORPION_256_MODE
; BIT 6,A
; JR Z,PENTAGON_128_MODE
;
;PENTAGON_48_MODE:
; AND #3C
; OUT (SLOT0),A
; INC A
; OUT (SLOT1),A
; INC A
; OUT (SLOT2),A
; INC A
; LD D,A
; LD BC,#1FFD
; XOR A
; OUT (C),A
; LD B,#7F
; OUT (C),A
; LD A,D
; OUT (SLOT3),A
; JR INIT_VIDEO_REG
;
;
; PENTAGON_128_MODE:
; LD D,8
; AND #38
; JR ALL_MODE
SCORPION_256_MODE:
LD D,16
AND #30 ; ¤® 4-å ᯥªâà㬮¢
ALL_MODE:
OUT (SLOT0),A
XOR 5
OUT (SLOT1),A
XOR 7
OUT (SLOT2),A
OR #0F
LD E,A
.loop: DEC D
LD A,D
RLCA
AND #10
LD BC,#1FFD
OUT (C),A
LD A,D
AND 7
OR #40
LD B,#7F
OUT (C),A
LD A,E
OUT (SLOT3),A
DEC E
DEC D
INC D
JR NZ,.loop
INIT_VIDEO_REG:
XOR A
OUT (RGADR),A ; ॣ¨áâà ¢¨¤¥®  ¤à¥á 
; OUT (RGSCR),A ; ॣ¨áâà íªà ­ 
OUT (RGMOD),A ; ॣ¨áâà ¬®¤ë
;!TEST
; Restore old Spectrum Screen
;; LD HL,#4000
;; LD DE,#4000
;; LD BC,#1B00
;; LDIR
; EX AF,AF'
; BIT 6,A
; JR NZ,NO_SCREEN_ALT
; EX AF,AF'
; LD A,7 ; ᥤ쬠ï íªà ­­ ï áâà ­¨æ 
; LD BC,#7FFD
; OUT (C),A
; Restore old Spectrum Screen 2
;; LD HL,#C000
;; LD DE,#C000
;; LD BC,#1B00
;; LDIR
; XOR A
; LD BC,#7FFD
; OUT (C),A
;
EX AF,AF'
NO_SCREEN_ALT:
AND A
JP (IX)
;-----------------------------------------------------------------------;
;---------------------[ ‡€ƒ‹“˜Šˆ „‹Ÿ #41 <E28098><EFBFBD>ˆ]----------------------;
;-------------[RST 08]
RAM_BIOS_PROG: ; for CALL BIOS in #41 page
DISP Spec_Page.to_bios
PUSH AF
LD A,ROM.BIOS
OUT (SYS_PORT.ROM),A
POP AF
RET
ENT
.Length EQU $-RAM_BIOS_PROG
;-------------------[]
;
;-------------[RST 38]
PROG_NO_ROM:
DISP Spec_Page.no_zx_rom
DI
;
LD A,#FF
OUT (SLOT3),A
OUT (SLOT2),A
OUT (SLOT1),A
;
LD SP,#BF00
;
LD E,0
LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
RST ToBIOS
;
LD DE,0
LD HL,#2050
LD C,BIOS.LP_CLS_WIN
RST ToBIOS
; set scr-2
LD A,1
OUT (SCREEN_SWITCH),A
;
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.CGA.FLASH + COLORS.CGA.INK.RED
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
;
.loop: DI
HALT
JR .loop
;
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
;-------------------[]
;-----------------------------------------------------------------------;
;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<;
;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
;