Sprinter-Core/src/bios/exp/FLEX.asm
Anatoliy Belyanskiy 8bd9b2a3fc temp
2024-01-05 01:20:40 +10:00

794 lines
12 KiB
NASM

SYCLES EQU 0
;START EQU 1
ST1 EQU 2
DPAL1 EQU 3
ST2 EQU 4
DPAL2 EQU 5
MACRO NEXT_LIN_H
EX AF,AF'
INC A
OUT (RGADR),A
EX AF,AF'
ENDM
MACRO NEXT_LIN_HP
EX AF,AF'
INC A
OUT (RGADR),A
JR NZ,.MD_NO_INC_H
inc l
.MD_NO_INC_H:
EX AF,AF'
ENDM
;*****************************************
;
; ˆ­¨æ¨ «¨§ æ¨ï áâà ­¨æ ¤«ï
; ᯥªâà㬮¢áª®£® ०¨¬  ¨
; ¢®ááâ ­®¢«¥­¨¥ ᯥªâà㬮¢áª®£®
; íªà ­ 
;
; ‚®§¢à â ¯® IX
;
; !!! NO USE STACK !!!
;
;*****************************************
; ¨­¨æ¨ «¨§ æ¨ï áâà ­¨æ 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 03CH
; OUT (SLOT0),A
; INC A
; OUT (SLOT1),A
; INC A
; OUT (SLOT2),A
; INC A
; LD D,A
; LD BC,1FFDH
; XOR A
; OUT (C),A
; LD B,7FH
; 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)
;****************************************
; ‡ £à㧪  ०¨¬  íªà ­ .
;****************************************
; CALL SINC_DEF
; CALL SET_PAL_ZX
; RET
;****************************************
;!TODO âãâ äã­ªæ¨ï
CL0 EQU 200
CL1 EQU 240
SET_PAL_IBM:
LD DE,#8000
JR SET_PAL_TXT
SET_PAL_ZX:
LD DE,0
SET_PAL_TXT:
PUSH IX
IN A,(RGADR)
PUSH AF
IN A,(SLOT3)
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD IX,#C3F0 ; !HARDCODE  ¤à¥á ¯ «¨âàë?
.generate_loop:
CALL GENERATE_PAL1
LD A,E
OUT (RGADR),A
LD (IX),L ; R
LD (IX+1),B ; G
LD (IX+2),C ; B
LD (IX+3),H ; i ?
INC E
JR NZ,.generate_loop
;
LD BC,4
ADD IX,BC
INC D
LD A,D
AND 3
JR NZ,.generate_loop
EX AF,AF'
OUT (SLOT3),A
POP AF
OUT (RGADR),A
POP IX
RET
; £¥­¥à æ¨ï ᯥªâà㬮¢áª®© ¯ «¨âàë.
; ‚室: E -  âਡãâ, D - ­®¬¥à ¯ «¨âàë
; ‚›•Ž„: L - red, B - green, C - blue, H - intensity
GENERATE_PAL1: XOR A
LD C,A
LD B,A
LD L,A
BIT 7,D
JR NZ,GENERATE_IBM
BIT 1,D
JR NZ,.FLH
.NOF: BIT 0,D
JR Z,.PAPER
.INK: LD A,CL0
BIT 6,E
JR Z,.NOI1
LD A,CL1
.NOI1: BIT 0,E ; BLUE
JR Z,.NO1
LD C,A
.NO1: BIT 1,E ; RED
JR Z,.PP_NO2
LD L,A
.PP_NO2: BIT 2,E ; GREEN
JR Z,.PP_NO3
LD B,A
.PP_NO3: JR .PP_NO6
;
.FLH: BIT 7,E
JR Z,.NOF
BIT 0,D
JR Z,.INK
.PAPER: LD A,CL0
BIT 6,E
JR Z,.NOI2
LD A,CL1
.NOI2: BIT 3,E ; BLUE
JR Z,.PP_NO4
LD C,A
.PP_NO4: BIT 4,E ; RED
JR Z,.PP_NO5
LD L,A
.PP_NO5: BIT 5,E ; GREEN
JR Z,.PP_NO6
LD B,A
.PP_NO6: LD A,C
AND A
RRA
ADD A,L
RRA
ADD A,B
RRA
LD H,A ; B/W mode
RET
;****************************************
GENERATE_IBM:
BIT 7,E
JR Z,.NO_FLH
BIT 1,D
JR Z,.PAPER
.NO_FLH:
BIT 0,D
JR Z,.PAPER
.INK:
.NO_INTENS:
LD A,#A8
.INTENS:
BIT 0,E ; BLUE
JR Z,.PPI_NO4
LD C,A
.PPI_NO4:
BIT 2,E ; RED
JR Z,.PPI_NO5
LD L,A
.PPI_NO5:
BIT 1,E ; GREEN
JR Z,.PPI_NO6
LD B,A
.PPI_NO6:
LD A,E
AND #0F
CP 6
JR NZ,.no_correct
LD B,#54
.no_correct:
BIT 3,E
JR Z,GENERATE_PAL1.PP_NO6
LD A,#54
ADD A,C
LD C,A
LD A,#54
ADD A,B
LD B,A
LD A,#54
ADD A,L
LD L,A
JR GENERATE_PAL1.PP_NO6
.PAPER:
LD A,#A8
BIT 4,E ; BLUE
JR Z,.PPI_NO4X
LD C,A
.PPI_NO4X:
BIT 6,E ; RED
JR Z,.PPI_NO5X
LD L,A
.PPI_NO5X:
BIT 5,E ; GREEN
JR Z,.PPI_NO6X
LD B,A
.PPI_NO6X:
LD A,E
AND #70
CP #60
JR NZ,GENERATE_PAL1.PP_NO6
LD B,#54
JR GENERATE_PAL1.PP_NO6
;****************************************
;****************************************
;****************************************
; D - ­®¬¥à £à ä¨ç¥áª®© ¯ «¨âàë
SET_PAL_GRAF:
PUSH IX
IN A,(RGADR)
PUSH AF
IN A,(SLOT3)
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD IX,#C3E0
LD A,D
AND 3
ADD A,A
ADD A,A
LD E,A
LD D,0
ADD IX,DE
LD E,0
XOR A
LD B,A
LD C,A
LD L,A
LD H,A
SET_PAL_GR1:
LD A,E
OUT (RGADR),A
LD (IX),L
LD (IX+1),B
LD (IX+2),C
LD (IX+3),H
CALL GENERATE_PAL3
INC E
LD A,E
CP 40
JR NZ,SET_PAL_GR1
XOR A
LD B,A
LD C,A
LD L,A
LD H,A
SET_PAL_GR2:
LD A,E
OUT (RGADR),A
LD (IX),L
LD (IX+1),B
LD (IX+2),C
LD (IX+3),H
CALL GENERATE_PAL2
INC E
JR NZ,SET_PAL_GR2
EX AF,AF'
OUT (SLOT3),A
POP AF
OUT (RGADR),A
POP IX
RET
;
;;*********************************
;
GENERATE_PAL3: ; gray-scale
LD A,B
ADD A,6
LD B,A
LD C,A
LD L,A
LD A,C
AND A
RRA
ADD A,L
RRA
ADD A,B
RRA
LD H,A
RET
GENERATE_PAL2: ; C - BLUE; L - RED; B - GREEN; H - INTENSITY
LD A,C
ADD A,50
LD C,A
JR NC,GEN_PAL2_L1
LD C,0
LD A,L
ADD A,50
LD L,A
JR NC,GEN_PAL2_L1
LD L,0
LD A,B
ADD A,50
LD B,A
JR NC,GEN_PAL2_L1
LD B,0
GEN_PAL2_L1:
LD A,C
AND A
RR A
ADD A,L
RR A
ADD A,B
RR A
LD H,A
RET
;
;;*****************************************
FN_SYNC:
BIT 7,a
JR Z,.old_mode
ld h,a
and #60 ; check reserved bits
jr nz,.error
bit 2,h ; Set V-Sinc?
jr nz,.set_v_sinc
bit 4,h ; Set Waits?
jr z,.error ; Error - no parameters
.set_waits:
ld a,h
and 8 ; check waits. Z - no waits, NZ - waits
ld h,#FF
jr z,1F
ld h,#FB
1:
ld bc,(Port_All_Mode)
in a,(C)
and h
out (C),a
RET
.set_v_sinc:
ld a,h
and 3
jr z,.SetDefLines
dec a
jr z,.SetCmosLines
dec a
jr z,.Set320Lines
; jr Set312Lines
.set312lines:
ld a,Port_VSYNC.SET_312L
out (Port_VSYNC),a
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
ld a,(SYS_PAGE.VSyncAndWaits)
and 2
ld (SYS_PAGE.VSyncAndWaits),a
OUT (C),B
.end_set_v_sinc:
bit 4,h
ret z
jr .set_waits
.Set320Lines:
ld a,Port_VSYNC.SET_320L
out (Port_VSYNC),a
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
ld a,(SYS_PAGE.VSyncAndWaits)
or 1
ld (SYS_PAGE.VSyncAndWaits),a
OUT (C),B
jr .end_set_v_sinc
.SetCmosLines:
LD D,CMOS.Cell.ScreenSET
CALL CMOS_RD
AND CMOS.Cell.ScreenSET.Mask.Sinc ; ¢ ॣ¨áâॠA §­ ç¥­¨¥ ScreenSET
jr z,.SetDefLines
bit 6,a
jr z,.set312lines
jr .Set320Lines
.old_mode:
AND A
JR Z,.INT_DEF
DEC A
JR Z,.INT_SCORP
DEC A
JR Z,.INT_PENT
DEC A
JR Z,.INT_ORIG
DEC A
JR Z,.INT_CMOS_SINC
.error: SCF
RET
.SetDefLines:
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
ld a,(SYS_PAGE.VSyncAndWaits)
OUT (C),B
and 1
jr z,.set312lines
jr .Set320Lines
.INT_DEF:
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
LD DE,(SYS_PAGE.CONFIG_ALL)
OUT (C),B
CALL Test_CONFIG_ALL
jr nz,.INT_CMOS_SINC
jp (IX)
.INT_CMOS_SINC:
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
LD DE,(SYS_PAGE.CONFIG_ALL)
OUT (C),B
LD D,CMOS.Cell.ScreenSET
CALL CMOS_RD
AND CMOS.Cell.ScreenSET.Mask.Int ; ¢ ॣ¨áâॠA §­ ç¥­¨¥ ScreenSET
JR NZ,.skiptest
CALL Test_CONFIG_ALL
JP (IX) ; default int (non CMOS)
.skiptest:
cp #10
jr z,.INT_SCORP ; scorpion int
cp #20
jr z,.INT_PENT ; pentagon int
; jr ORIG_SINC ; original int
.INT_ORIG:
LD IX,SCREEN_TABLES.ORIGINAL
JR .PROG_SCR
.INT_SCORP:
LD IX,SCREEN_TABLES.SCORPION
JR .PROG_SCR
.INT_PENT:
LD IX,SCREEN_TABLES.PENTAGON
; JR PROG_SCR
.PROG_SCR:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
EX AF,AF'
LD (SYS_PAGE.COPY_SLOT3),A
IN A,(RGADR)
LD (SYS_PAGE.COPY_RGADR),A
LD (SYS_PAGE.CONFIG_ALL),IX
XOR A
;----[START]-----------------------[? 1]
.loop_1:
OUT (PORT_Y),A
EX AF,AF'
LD A,#50
OUT (SLOT3),A
LD HL,#C300
;----[START]------------------[v 2]-----
.loop_2:
LD C,(IX)
;----[START]-------------[v 3]----------
.loop_3:
; ¢§ïâì  ¤à¥á ¤ ­­ëå ¤«ï § ¯¨á¨ ¢ á«ã¦¥¡­ãî ®¡« áâì íªà ­ 
LD E,(IX+1) ; take adress of line X
LD D,(IX+2)
;----[START]--------[v 4]---------------
.loop_4:
LD A,(DE) ; take counter in table 1, line X, column Y
INC DE
AND A
JR Z,.loop_4_exit ; exit if zero-counter
LD B,A
LD A,(DE)
INC DE
;----[START]---[v 5]--------------------
.loop_5:
LD (HL),A
INC L
LD (HL),0
INC L
LD (HL),0
EX AF,AF'
INC A
OUT (PORT_Y),A
EX AF,AF'
LD (HL),0
DEC L
LD (HL),0
DEC L
LD (HL),A
EX AF,AF'
INC A
OUT (PORT_Y),A
EX AF,AF'
DJNZ .loop_5
;--------------[^ 5]--------------------
JR .loop_4
;-------------------[^ 4]---------------
.loop_4_exit:
INC HL ; next line
INC HL
INC HL
INC HL
IN A,(PORT_Y)
AND #80
OUT (PORT_Y),A
DEC C
JR NZ,.loop_3
;------------------------[^ 3]----------
INC IX ; next counter
INC IX
INC IX
LD A,(IX)
AND A
JR NZ,.loop_2
;-----------------------------[^ 2]-----
LD A,SYS_PAGE
OUT (SLOT3),A
LD IX,(SYS_PAGE.CONFIG_ALL)
EX AF,AF'
ADD A,#80
JR NC,.loop_1
;----------------------------------[^ 1]
; Exit
LD A,(SYS_PAGE.COPY_RGADR)
OUT (PORT_Y),A
LD A,(SYS_PAGE.COPY_SLOT3)
OUT (SLOT3),A
.exit: OR A
RET
;DE - ᮤ¥à¦¨¬®¥ CONFIG_ALL
Test_CONFIG_ALL:
LD HL,SCREEN_TABLES.SCORPION
AND A
SBC HL,DE
ld IX,FN_SYNC.INT_SCORP
RET Z
LD HL,SCREEN_TABLES.ORIGINAL
AND A
SBC HL,DE
ld IX,FN_SYNC.INT_ORIG
RET Z
LD HL,SCREEN_TABLES.PENTAGON
AND A
SBC HL,DE
ld IX,FN_SYNC.INT_PENT
RET Z
and a
RET
;--- Screen data table 1: counter1, data1 .. counterX, dataX
SCREEN_TABLES:
;
; | ç¨á«® | §­ ç¥­¨ï |
; | áâப | ¢ |
; | /2 | áâப å |
.SCR: DB 41 , #F8
DB 3 , #FC
DB 4 , #FC
DB 7 , #FC
DB 9 , #F8
DB 0
;.SCR: DB 41,#F8, 3,#FC, 4,#FC, 7,#FC, 9,#F8, 0
.INT: DB 40,#FC, 2,#FD, 6,#FC, 7,#FC, 9,#FC, 0 ;!TEST PENTAGON INT 2 ª¢ ¤à â¨ª 
.INT_SC: DB 41,#F8, 1,#FD, 6,#FC, 7,#FC, 9,#F8, 0
.BLN: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0
.SNC: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0
.RES: DB 41,#F8, 3,#FE, 4,#FE, 7,#FE, 9,#F8, 0
;---------------------------------------
;--- Screen data tables 2: counter1, data address1 .. counterX, data addressX
;
; | ç¨á«® | §­ ç¥­¨ï |
; |á⮫¡æ®¢| ¢ |
; | | á⮫¡æ å |
.PENTAGON: DB 33 : DW .SCR
DB 1 : DW .INT ; DW .BLN
DB 3 : DW .SNC
DB 1 : DW .BLN
DB 1 : DW .SCR
DB 1 : DW .RES
DB 0 ; end
.SCORPION: DB 31 : DW .SCR
DB 1 : DW .INT_SC
DB 1 : DW .SCR
DB 1 : DW .SNC
DB 3 : DW .SNC
DB 1 : DW .BLN
DB 2 : DW .RES
DB 0 ; end
.ORIGINAL: DB 33 : DW .SCR
DB 1 : DW .SNC
DB 1 : DW .INT
DB 2 : DW .SNC
DB 1 : DW .BLN
DB 1 : DW .SCR
DB 1 : DW .RES
DB 0 ; end
; ;!TEST
;.L_ORIGINAL: DB 32 : DW L_SCR
; DB 4 : DW L_SNC
; DB 1 : DW L_INT
; DB 1 : DW L_SNC
; DB 1 : DW L_BLN
; DB 1 : DW L_SCR
; DB 2 : DW L_RES
; DB 0 ; end
;---------------------------------------
FLEX_END: