mirror of
https://github.com/romychs/Sprinter-FT.git
synced 2025-04-19 18:39:52 +03:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a91a33196e | ||
![]() |
60c79c00da | ||
![]() |
d48227f0ae | ||
![]() |
490ca266e4 |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
11349
Export/PCB_Sprinter-FT_v1.1.0.BOTTOM.pdf
Normal file
11349
Export/PCB_Sprinter-FT_v1.1.0.BOTTOM.pdf
Normal file
File diff suppressed because it is too large
Load Diff
16782
Export/PCB_Sprinter-FT_v1.1.0.TOP.pdf
Normal file
16782
Export/PCB_Sprinter-FT_v1.1.0.TOP.pdf
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 646 KiB |
BIN
Export/Schematic_Sprinter-FT_v1.1.0.pdf
Normal file
BIN
Export/Schematic_Sprinter-FT_v1.1.0.pdf
Normal file
Binary file not shown.
5
Export/Schematic_Sprinter-FT_v1.1.0.svg
Normal file
5
Export/Schematic_Sprinter-FT_v1.1.0.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 757 KiB |
BIN
Export/preview.png
Normal file
BIN
Export/preview.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 487 KiB |
Binary file not shown.
Before Width: | Height: | Size: 73 KiB |
Binary file not shown.
BIN
Gerber/Sprinter-FT_v1.1.0.zip
Normal file
BIN
Gerber/Sprinter-FT_v1.1.0.zip
Normal file
Binary file not shown.
@ -10,7 +10,7 @@
|
||||
|
||||
[Файлы для производства](Export/Gerbers/Sprinter-FT_v1.0.0.zip)
|
||||
|
||||

|
||||

|
||||
|
||||
[Спринтер в Телеграм](https://t.me/zx_sprinter)
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
1
Sources/PCB_Sprinter-FT-v1.1.0.json
Normal file
1
Sources/PCB_Sprinter-FT-v1.1.0.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
Sources/Schematic_Sprinter-FT-v1.1.0.json
Normal file
1
Sources/Schematic_Sprinter-FT-v1.1.0.json
Normal file
File diff suppressed because one or more lines are too long
4
Tester/README.md
Normal file
4
Tester/README.md
Normal file
@ -0,0 +1,4 @@
|
||||
FT-Tester
|
||||
=========
|
||||
|
||||
Test program for Sprinter-FT ISA-8 card.
|
74
Tester/dss.inc
Normal file
74
Tester/dss.inc
Normal file
@ -0,0 +1,74 @@
|
||||
; ======================================================
|
||||
; Defines for DSS Estex for Sprinter computer
|
||||
; By Roman Boykov. Copyright (c) 2024
|
||||
; https://github.com/romychs
|
||||
; ======================================================
|
||||
|
||||
IFNDEF _DSS_INC
|
||||
DEFINE _DSS_INC
|
||||
|
||||
; DSS RST Entry
|
||||
DSS EQU 0x10
|
||||
|
||||
; DSS Functions
|
||||
DSS_CURDISK EQU 0x02
|
||||
DSS_CREATE_FILE EQU 0x0B
|
||||
DSS_OPEN_FILE EQU 0x11
|
||||
DSS_CLOSE_FILE EQU 0x12
|
||||
DSS_READ_FILE EQU 0x13
|
||||
DSS_WRITE EQU 0x14
|
||||
DSS_MOVE_FP_CP EQU 0x0115
|
||||
DSS_FIND_FIRST EQU 0x0119
|
||||
DSS_FIND_NEXT EQU 0x011A
|
||||
DSS_MKDIR EQU 0x1B
|
||||
DSS_CHDIR EQU 0x1D
|
||||
DSS_CURDIR EQU 0x1E
|
||||
DSS_SCANKEY EQU 0x31
|
||||
DSS_ECHOKEY EQU 0x32
|
||||
DSS_SETMEM EQU 0x38
|
||||
DSS_GETMEM EQU 0x3D
|
||||
DSS_FREEMEM EQU 0x3E
|
||||
DSS_EXIT EQU 0x41
|
||||
DSS_WAITKEY EQU 0x48
|
||||
DSS_SETVMOD EQU 0x50
|
||||
DSS_GETVMOD EQU 0x51
|
||||
DSS_CLEAR EQU 0x56
|
||||
DSS_PUTCHAR EQU 0x5B
|
||||
DSS_PCHARS EQU 0x5C
|
||||
|
||||
|
||||
DSS_VMOD_T40 EQU 0x02 ; text 40x32, 16 colors
|
||||
DSS_VMOD_T80 EQU 0x03 ; text 80x32, 16 colors
|
||||
DSS_VMOD_G320 EQU 0x81 ; graphics 320x256, 256 colors
|
||||
DSS_VMOD_G640 EQU 0x82 ; graphics 640x256, 16 colors
|
||||
|
||||
|
||||
; DSS Error codes
|
||||
E_FILE_EXISTS EQU 7
|
||||
E_FILE_NOT_FOUND EQU 3
|
||||
|
||||
; Keyboard Shift key status bits
|
||||
KB_R_ALT EQU 0x01
|
||||
KB_R_CTRL EQU 0x02
|
||||
KB_L_ALT EQU 0x04
|
||||
KB_L_CTRL EQU 0x08
|
||||
KB_ALT EQU 0x10
|
||||
KB_CTRL EQU 0x20
|
||||
KB_R_SHIFT EQU 0x40
|
||||
KB_L_SHIFT EQU 0x80
|
||||
|
||||
|
||||
; File attributes
|
||||
FA_READONLY EQU 0x01
|
||||
FA_HIDDEN EQU 0x02
|
||||
FA_SYSTEM EQU 0x04
|
||||
FA_LABEL EQU 0x08
|
||||
FA_DIRECTORY EQU 0x10
|
||||
FA_ARCHIVE EQU 0x20
|
||||
|
||||
; File Access mode
|
||||
FM_READ_WRITE EQU 0x00
|
||||
FM_READ EQU 0x01
|
||||
FM_WRITE EQU 0x02
|
||||
|
||||
ENDIF
|
316
Tester/ftlib.asm
Normal file
316
Tester/ftlib.asm
Normal file
@ -0,0 +1,316 @@
|
||||
; ======================================================
|
||||
; Library for Sprinter-FT ISA Card
|
||||
; By Roman Boykov. Copyright (c) 2025
|
||||
; https://github.com/romychs
|
||||
; License: BSD 3-Clause
|
||||
; ======================================================
|
||||
|
||||
IFNDEF _FT_LIB
|
||||
DEFINE _FT_LIB
|
||||
|
||||
|
||||
INCLUDE "isa.asm"
|
||||
INCLUDE "util.asm"
|
||||
INCLUDE "ftlib.inc"
|
||||
|
||||
MODULE FT
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Reset ESP module
|
||||
; ------------------------------------------------------
|
||||
|
||||
FT_RESET
|
||||
PUSH AF,HL
|
||||
|
||||
CALL ISA.ISA_OPEN
|
||||
|
||||
; TODO: FT Init code here
|
||||
|
||||
XOR A
|
||||
LD (PORT_FT_CTRL),A
|
||||
|
||||
CALL ISA.ISA_CLOSE
|
||||
|
||||
; wait 2s for ESP firmware boot
|
||||
LD HL,2000
|
||||
CALL UTIL.DELAY
|
||||
|
||||
POP HL,AF
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Init FT videomode
|
||||
; Inp: A - videomode
|
||||
; ------------------------------------------------------
|
||||
FT_INIT
|
||||
LD H, 0
|
||||
LD L, A
|
||||
CALL UTIL.MUL_10
|
||||
LD IX, FT_MODE
|
||||
ADD IX, BC ; IX -> Mode parameters
|
||||
|
||||
ft_cmd FT_CMD_PWRDOWN
|
||||
ft_cmd FT_CMD_ACTIVE
|
||||
ft_cmd FT_CMD_SLEEP
|
||||
ft_cmd FT_CMD_CLKEXT
|
||||
|
||||
LD A, (IX + f_mul) ; ft_cmdp(FT_CMD_CLKSEL, mode->f_mul | 0x40);
|
||||
AND 0x40
|
||||
LD C, A
|
||||
LD B, FT_CMD_CLKSEL
|
||||
CALL FT_CMD_P
|
||||
|
||||
ft_cmd FT_CMD_ACTIVE
|
||||
ft_cmd FT_CMD_RST_PULSE
|
||||
|
||||
; Wait for reset complete
|
||||
; while ft_rreg8(FT_REG_ID) != FT_ID)
|
||||
.IN_CMPL1
|
||||
ft_rreg8 FT_REG_ID
|
||||
CP FT_ID
|
||||
JP NZ, .IN_CMPL1
|
||||
; while (ft_rreg16(FT_REG_CPURESET) != 0);
|
||||
.IN_CMPL2
|
||||
ft_rreg16 FT_REG_CPURESET
|
||||
LD A, B
|
||||
OR C
|
||||
JP NZ, .IN_CMPL2
|
||||
|
||||
; TODO: Init videomode
|
||||
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Check ISA slots for Sprinter-FT card
|
||||
; Out: CF if no card found;
|
||||
; A = Slot number, 0 - ISA-1, 1 - ISA2
|
||||
; ------------------------------------------------------
|
||||
FT_FIND
|
||||
PUSH BC, HL
|
||||
|
||||
LD HL, ISA.ISA_SLOT
|
||||
XOR A
|
||||
LD (HL),A
|
||||
LD B,2
|
||||
|
||||
.FT_CHK_SLOT:
|
||||
CALL ISA.ISA_OPEN
|
||||
LD A, (PORT_FT_CTRL)
|
||||
CALL ISA.ISA_CLOSE
|
||||
CP 0xFC
|
||||
JR Z, .FT_FOUND
|
||||
; HL -> ISA.ISA_SLOT
|
||||
INC (HL)
|
||||
DJNZ .FT_CHK_SLOT
|
||||
SCF
|
||||
.FT_FOUND
|
||||
LD A, (HL)
|
||||
POP HL, BC
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Activate FT chip. Sent ACTIVE command
|
||||
; ------------------------------------------------------
|
||||
FT_ACTIVATE
|
||||
XOR A
|
||||
LD B, A
|
||||
LD C, A
|
||||
CALL FT_CMD_P
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Get FT chip info
|
||||
; Out: A = 0x10..0x14 for FT810-814
|
||||
; DE -> response buffer: 0x08, id=0x10..0x14, 0x01, 0x00
|
||||
; ------------------------------------------------------
|
||||
FT_GET_CHIP_ID
|
||||
;PUSH HL
|
||||
CALL ISA.ISA_OPEN
|
||||
LD HL, PORT_FT_DATA
|
||||
LD BC, PORT_FT_CTRL
|
||||
|
||||
; #FT_CS="0" active
|
||||
LD A, (BC)
|
||||
OR FT_CS_ON
|
||||
LD (BC), A
|
||||
|
||||
; Send cmd read addr 0xC0000
|
||||
LD A, 0x0C
|
||||
LD (HL), A ; addr3
|
||||
XOR A
|
||||
LD (HL), A ; addr2
|
||||
NOP
|
||||
LD (HL), A ; addr1
|
||||
NOP
|
||||
LD (HL), A ; dummy
|
||||
|
||||
; Get response (4 bytes)
|
||||
LD DE, FT_BUFFER
|
||||
|
||||
LD A, (HL) ; dummy ZC
|
||||
NOP
|
||||
|
||||
LD A, (HL)
|
||||
LD (DE), A
|
||||
INC DE
|
||||
|
||||
LD A, (HL)
|
||||
LD (DE), A
|
||||
;PUSH AF
|
||||
INC DE
|
||||
|
||||
LD A, (HL)
|
||||
LD (DE), A
|
||||
INC DE
|
||||
|
||||
LD A, (HL)
|
||||
LD (DE), A
|
||||
INC DE
|
||||
|
||||
; #FT_CS="1" deactivate
|
||||
LD A, (BC)
|
||||
AND FT_CS_OFF
|
||||
LD (BC), A
|
||||
|
||||
; close ISA and return
|
||||
CALL ISA.ISA_CLOSE
|
||||
;LD DE, FT_BUFFER
|
||||
;POP AF
|
||||
RET
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Send command to FT
|
||||
; Inp: A - cmd to send
|
||||
; ------------------------------------------------------
|
||||
FT_CMD_P
|
||||
PUSH BC
|
||||
LD B, A
|
||||
LD C, 0
|
||||
CALL FT_CMD
|
||||
POP BC
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Send command to FT
|
||||
; Inp: B - cmd code;
|
||||
; C = cmd parameter
|
||||
; ------------------------------------------------------
|
||||
FT_CMD
|
||||
PUSH HL, DE
|
||||
CALL START_SPI
|
||||
; Send cmd
|
||||
LD A, B ; code
|
||||
LD (HL), A ;
|
||||
LD A, C ; parameter
|
||||
LD (HL), A ;
|
||||
XOR A
|
||||
LD (HL), A ; dummy 0
|
||||
CALL STOP_SPI
|
||||
POP DE, HL
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Read 8 bit FT register
|
||||
; Inp: BC - Register
|
||||
; Out: A - value
|
||||
; ------------------------------------------------------
|
||||
FT_RREG8
|
||||
PUSH HL, DE
|
||||
CALL START_SPI
|
||||
|
||||
LD A, FT_RAM_REG >> 16
|
||||
LD (HL), A
|
||||
NOP
|
||||
LD (HL), B
|
||||
NOP
|
||||
LD (HL), C
|
||||
NOP
|
||||
LD (HL), C ; dummy (FT812)
|
||||
NOP
|
||||
LD A, (HL) ; dummy (ZC)
|
||||
NOP
|
||||
LD B, (HL)
|
||||
CALL STOP_SPI
|
||||
LD A, B
|
||||
POP DE, HL
|
||||
RET
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Read 16 bit FT register
|
||||
; Inp: BC - Register
|
||||
; Out: BC - value
|
||||
; ------------------------------------------------------
|
||||
FT_RREG16
|
||||
PUSH HL, DE
|
||||
CALL START_SPI
|
||||
|
||||
LD A, FT_RAM_REG >> 16
|
||||
LD (HL), A
|
||||
NOP
|
||||
LD (HL), B
|
||||
NOP
|
||||
LD (HL), C
|
||||
NOP
|
||||
LD (HL), C ; dummy FT
|
||||
|
||||
NOP
|
||||
LD A, (HL) ; dummy (ZC)
|
||||
NOP
|
||||
LD B, (HL)
|
||||
NOP
|
||||
LD C, (HL)
|
||||
|
||||
CALL STOP_SPI
|
||||
POP DE, HL
|
||||
RET
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Open ISA and apply FT_CS=0 (active)
|
||||
; ------------------------------------------------------
|
||||
START_SPI
|
||||
CALL ISA.ISA_OPEN
|
||||
LD HL, PORT_FT_DATA
|
||||
LD DE, PORT_FT_CTRL
|
||||
|
||||
; #FT_CS="0" active
|
||||
LD A, (DE)
|
||||
OR FT_CS_ON
|
||||
LD (DE), A
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Apply FT_CS=1 (passive) and close ISA
|
||||
; ------------------------------------------------------
|
||||
STOP_SPI
|
||||
; #FT_CS="1" deactivate
|
||||
LD A, (DE)
|
||||
AND FT_CS_OFF
|
||||
LD (DE), A
|
||||
|
||||
; close ISA and return
|
||||
CALL ISA.ISA_CLOSE
|
||||
RET
|
||||
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Read byte from FT (ISA will be opened)
|
||||
; Inp: DE -> buffer to receive byte
|
||||
; Out: A - received byte;
|
||||
; DE = DE+1
|
||||
; ------------------------------------------------------
|
||||
FT_READ_BYTE
|
||||
LD A, (PORT_FT_DATA)
|
||||
LD (DE), A
|
||||
INC DE
|
||||
RET
|
||||
|
||||
FT_BUFFER DS FT_BUFFER_SIZE, 0
|
||||
|
||||
|
||||
ENDMODULE
|
||||
|
||||
ENDIF
|
458
Tester/ftlib.inc
Normal file
458
Tester/ftlib.inc
Normal file
@ -0,0 +1,458 @@
|
||||
IFNDEF _FT_LIB_INC
|
||||
DEFINE _FT_LIB_INC
|
||||
|
||||
|
||||
FT_CTRL EQU 0x77
|
||||
FT_DATA EQU 0x57
|
||||
FT_BUFFER_SIZE EQU 128
|
||||
|
||||
FT_CS_ON EQU 0x04
|
||||
FT_CS_OFF EQU 0xFB
|
||||
|
||||
PORT_FT_CTRL EQU ISA_BASE_A + FT_CTRL ; Memory address to read Strinter-FT Control port
|
||||
PORT_FT_DATA EQU ISA_BASE_A + FT_DATA ; Memory address to read Strinter-FT Data port
|
||||
|
||||
|
||||
|
||||
FT_MODE_640_480_57 EQU 0 ; 0: 640x480@57Hz (48MHz)
|
||||
FT_MODE_640_480_74 EQU 1 ; 1: 640x480@74Hz (64MHz)
|
||||
FT_MODE_640_480_76 EQU 2 ; 2: 640x480@76Hz (64MHz)
|
||||
FT_MODE_800_600_60 EQU 3 ; 3: 800x600@60Hz (40MHz)
|
||||
FT_MODE_800_600_60_80MHZ EQU 4 ; 4: 800x600@60Hz (80MHz)
|
||||
FT_MODE_800_600_69 EQU 5 ; 5: 800x600@69Hz (48MHz)
|
||||
FT_MODE_800_600_85 EQU 6 ; 6: 800x600@85Hz (56MHz)
|
||||
FT_MODE_1024_768_59 EQU 7 ; 7: 1024x768@59Hz (64MHz)
|
||||
FT_MODE_1024_768_67 EQU 8 ; 8: 1024x768@67Hz (72MHz)
|
||||
FT_MODE_1024_768_76 EQU 9 ; 9: 1024x768@76Hz (80MHz)
|
||||
FT_MODE_1280_1024_60_HALF EQU 10 ; 10: 1280/2x1024@60Hz (56MHz)
|
||||
FT_MODE_1280_720_58 EQU 11 ; 11: 1280x720@58Hz (72MHz)
|
||||
FT_MODE_1280_720_60 EQU 12 ; 12: 1280x720@60Hz (72MHz)
|
||||
FT_MODE_800_600_48_7 EQU 13 ; 13: 800x600@48.7Hz (40MHz) - for ZX-Evo sync
|
||||
FT_MODE_1024_768_48_7 EQU 14 ; 14: 1024x768@48.7Hz (64MHz) - for ZX-Evo sync
|
||||
FT_MODE_MAX EQU 15
|
||||
|
||||
|
||||
|
||||
; Videomode parameters 10 bytes each
|
||||
FT_MODE
|
||||
; f_mul, f_div, h_fporch, h_sync, h_bporch, h_visible, v_fporch, v_sync, v_bporch, v_visible
|
||||
DW 6, 2, 16, 96, 48, 640, 11, 2, 31, 480 ; 0: 640x480@57Hz (48MHz)
|
||||
DW 8, 2, 24, 40, 128, 640, 9, 3, 28, 480 ; 1: 640x480@74Hz (64MHz)
|
||||
DW 8, 2, 16, 96, 48, 640, 11, 2, 31, 480 ; 2: 640x480@76Hz (64MHz)
|
||||
DW 5, 1, 40, 128, 88, 800, 1, 4, 23, 600 ; 3: 800x600@60Hz (40MHz)
|
||||
DW 10, 2, 40, 128, 88, 800, 1, 4, 23, 600 ; 4: 800x600@60Hz (80MHz)
|
||||
DW 6, 1, 56, 120, 64, 800, 37, 6, 23, 600 ; 5: 800x600@69Hz (48MHz)
|
||||
DW 7, 1, 32, 64, 152, 800, 1, 3, 27, 600 ; 6: 800x600@85Hz (56MHz)
|
||||
DW 8, 1, 24, 136, 160, 1024, 3, 6, 29, 768 ; 7: 1024x768@59Hz (64MHz)
|
||||
DW 9, 1, 24, 136, 144, 1024, 3, 6, 29, 768 ; 8: 1024x768@67Hz (72MHz)
|
||||
DW 10, 1, 16, 96, 176, 1024, 1, 3, 28, 768 ; 9: 1024x768@76Hz (80MHz)
|
||||
DW 7, 1, 24, 56, 124, 640, 1, 3, 38, 1024 ; 10: 1280/2x1024@60Hz (56MHz)
|
||||
DW 9, 1, 110, 40, 220, 1280, 5, 5, 20, 720 ; 11: 1280x720@58Hz (72MHz)
|
||||
DW 9, 1, 93, 40, 187, 1280, 5, 5, 20, 720 ; 12: 1280x720@60Hz (72MHz)
|
||||
DW 5, 1, 40, 128, 88, 800, 1, 4, 23, 748 ; 13: 800x600@48.7Hz (40MHz) - for ZX-Evo sync
|
||||
DW 8, 1, 24, 136, 160, 1024, 3, 6, 29, 938 ; 14: 1024x768@48.7Hz (64MHz) - for ZX-Evo sync
|
||||
; Offsets in FT_MODE table
|
||||
f_mul EQU 0
|
||||
f_div EQU 2
|
||||
h_fporch EQU 4
|
||||
h_sync EQU 6
|
||||
h_bporch EQU 8
|
||||
h_visible EQU 10
|
||||
v_fporch EQU 12
|
||||
v_sync EQU 14
|
||||
v_bporch EQU 16
|
||||
v_visible EQU 18
|
||||
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Memory addresses
|
||||
; -------------------------------------------------------
|
||||
FT_RAM_G EQU 0x000000 ; Main graphics RAM
|
||||
FT_ROM_CHIPID EQU 0x0C0000 ; Chip ID and revision
|
||||
FT_ROM_FONT EQU 0x1E0000 ; Fonts
|
||||
FT_ROM_FONT_ADDR EQU 0x2FFFFC ; Font table pointer address
|
||||
FT_RAM_DL EQU 0x300000 ; Display list RAM
|
||||
FT_RAM_REG EQU 0x302000 ; Registers
|
||||
FT_RAM_CMD EQU 0x308000 ; Coprocessor command buffer
|
||||
FT_RAM_ERR_REPORT EQU 0x309800 ; Error message
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Commands
|
||||
; -------------------------------------------------------
|
||||
FT_CMD_ACTIVE EQU 0x00 ; cc 00 00
|
||||
FT_CMD_STANDBY EQU 0x41 ; cc 00 00
|
||||
FT_CMD_SLEEP EQU 0x42 ; cc 00 00
|
||||
FT_CMD_PWRDOWN EQU 0x43 ; cc 00 00
|
||||
FT_CMD_CLKEXT EQU 0x44 ; cc 00 00
|
||||
FT_CMD_CLKINT EQU 0x48 ; cc 00 00
|
||||
FT_CMD_PDROMS EQU 0x49 ; cc xx 00
|
||||
FT_CMD_CLKSEL EQU 0x61 ; cc xx 00 -> [5:0] - mul, [7:6] - PLL range (0 for mul=0..3, 1 for mul=4..5)
|
||||
FT_CMD_RST_PULSE EQU 0x68 ; cc 00 00
|
||||
|
||||
; -------------------------------------------------------
|
||||
; ID
|
||||
; -------------------------------------------------------
|
||||
FT_ID EQU 0x7C
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Registers
|
||||
; -------------------------------------------------------
|
||||
FT_REG_ID EQU 0x302000
|
||||
FT_REG_FRAMES EQU 0x302004
|
||||
FT_REG_CLOCK EQU 0x302008
|
||||
FT_REG_FREQUENCY EQU 0x30200C
|
||||
FT_REG_RENDERMODE EQU 0x302010
|
||||
FT_REG_SNAPY EQU 0x302014
|
||||
FT_REG_SNAPSHOT EQU 0x302018
|
||||
FT_REG_SNAPFORMAT EQU 0x30201C
|
||||
FT_REG_CPURESET EQU 0x302020
|
||||
FT_REG_TAP_CRC EQU 0x302024
|
||||
FT_REG_TAP_MASK EQU 0x302028
|
||||
FT_REG_HCYCLE EQU 0x30202C
|
||||
FT_REG_HOFFSET EQU 0x302030
|
||||
FT_REG_HSIZE EQU 0x302034
|
||||
FT_REG_HSYNC0 EQU 0x302038
|
||||
FT_REG_HSYNC1 EQU 0x30203C
|
||||
FT_REG_VCYCLE EQU 0x302040
|
||||
FT_REG_VOFFSET EQU 0x302044
|
||||
FT_REG_VSIZE EQU 0x302048
|
||||
FT_REG_VSYNC0 EQU 0x30204C
|
||||
FT_REG_VSYNC1 EQU 0x302050
|
||||
FT_REG_DLSWAP EQU 0x302054
|
||||
FT_REG_ROTATE EQU 0x302058
|
||||
FT_REG_OUTBITS EQU 0x30205C
|
||||
FT_REG_DITHER EQU 0x302060
|
||||
FT_REG_SWIZZLE EQU 0x302064
|
||||
FT_REG_CSPREAD EQU 0x302068
|
||||
FT_REG_PCLK_POL EQU 0x30206C
|
||||
FT_REG_PCLK EQU 0x302070
|
||||
FT_REG_TAG_X EQU 0x302074
|
||||
FT_REG_TAG_Y EQU 0x302078
|
||||
FT_REG_TAG EQU 0x30207C
|
||||
FT_REG_VOL_PB EQU 0x302080
|
||||
FT_REG_VOL_SOUND EQU 0x302084
|
||||
FT_REG_SOUND EQU 0x302088
|
||||
FT_REG_PLAY EQU 0x30208C
|
||||
FT_REG_GPIO_DIR EQU 0x302090
|
||||
FT_REG_GPIO EQU 0x302094
|
||||
FT_REG_GPIOX_DIR EQU 0x302098
|
||||
FT_REG_GPIOX EQU 0x30209C
|
||||
FT_REG_INT_FLAGS EQU 0x3020A8
|
||||
FT_REG_INT_EN EQU 0x3020AC
|
||||
FT_REG_INT_MASK EQU 0x3020B0
|
||||
FT_REG_PLAYBACK_START EQU 0x3020B4
|
||||
FT_REG_PLAYBACK_LENGTH EQU 0x3020B8
|
||||
FT_REG_PLAYBACK_READPTR EQU 0x3020BC
|
||||
FT_REG_PLAYBACK_FREQ EQU 0x3020C0
|
||||
FT_REG_PLAYBACK_FORMAT EQU 0x3020C4
|
||||
FT_REG_PLAYBACK_LOOP EQU 0x3020C8
|
||||
FT_REG_PLAYBACK_PLAY EQU 0x3020CC
|
||||
FT_REG_PWM_HZ EQU 0x3020D0
|
||||
FT_REG_PWM_DUTY EQU 0x3020D4
|
||||
FT_REG_MACRO_0 EQU 0x3020D8
|
||||
FT_REG_MACRO_1 EQU 0x3020DC
|
||||
FT_REG_CMD_READ EQU 0x3020F8
|
||||
FT_REG_CMD_WRITE EQU 0x3020FC
|
||||
FT_REG_CMD_DL EQU 0x302100
|
||||
FT_REG_TOUCH_MODE EQU 0x302104
|
||||
FT_REG_TOUCH_ADC_MODE EQU 0x302108
|
||||
FT_REG_TOUCH_CHARGE EQU 0x30210C
|
||||
FT_REG_TOUCH_SETTLE EQU 0x302110
|
||||
FT_REG_TOUCH_OVERSAMPLE EQU 0x302114
|
||||
FT_REG_TOUCH_RZTHRESH EQU 0x302118
|
||||
FT_REG_TOUCH_RAW_XY EQU 0x30211C
|
||||
FT_REG_TOUCH_RZ EQU 0x302120
|
||||
FT_REG_TOUCH_SCREEN_XY EQU 0x302124
|
||||
FT_REG_TOUCH_TAG_XY EQU 0x302128
|
||||
FT_REG_TOUCH_TAG EQU 0x30212C
|
||||
FT_REG_TOUCH_TAG1_XY EQU 0x302130
|
||||
FT_REG_TOUCH_TAG1 EQU 0x302134
|
||||
FT_REG_TOUCH_TAG2_XY EQU 0x302138
|
||||
FT_REG_TOUCH_TAG2 EQU 0x30213C
|
||||
FT_REG_TOUCH_TAG3_XY EQU 0x302140
|
||||
FT_REG_TOUCH_TAG3 EQU 0x302144
|
||||
FT_REG_TOUCH_TAG4_XY EQU 0x302148
|
||||
FT_REG_TOUCH_TAG4 EQU 0x30214C
|
||||
FT_REG_TOUCH_TRANSFORM_A EQU 0x302150
|
||||
FT_REG_TOUCH_TRANSFORM_B EQU 0x302154
|
||||
FT_REG_TOUCH_TRANSFORM_C EQU 0x302158
|
||||
FT_REG_TOUCH_TRANSFORM_D EQU 0x30215C
|
||||
FT_REG_TOUCH_TRANSFORM_E EQU 0x302160
|
||||
FT_REG_TOUCH_TRANSFORM_F EQU 0x302164
|
||||
FT_REG_TOUCH_CONFIG EQU 0x302168
|
||||
FT_REG_CTOUCH_TOUCH4_X EQU 0x30216C
|
||||
FT_REG_BIST_EN EQU 0x302174
|
||||
FT_REG_TRIM EQU 0x302180
|
||||
FT_REG_ANA_COMP EQU 0x302184
|
||||
FT_REG_SPI_WIDTH EQU 0x302188
|
||||
FT_REG_TOUCH_DIRECT_XY EQU 0x30218C
|
||||
FT_REG_TOUCH_DIRECT_Z1Z2 EQU 0x302190
|
||||
FT_REG_DATESTAMP EQU 0x302564
|
||||
FT_REG_CMDB_SPACE EQU 0x302574
|
||||
FT_REG_CMDB_WRITE EQU 0x302578
|
||||
FT_REG_ADAPTIVE_FRAMERATE EQU 0x30257C
|
||||
FT_REG_PLAYBACK_PAUSE EQU 0x3025EC
|
||||
FT_REG_FLASH_STATUS EQU 0x3025F0
|
||||
REG_MEDIAFIFO_READ EQU 0x309014
|
||||
REG_MEDIAFIFO_WRITE EQU 0x309018
|
||||
FT_REG_FLASH_SIZE EQU 0x309024
|
||||
|
||||
FT_REG_TRACKER EQU 0x309000
|
||||
FT_REG_TRACKER_1 EQU 0x309004
|
||||
FT_REG_TRACKER_2 EQU 0x309008
|
||||
FT_REG_TRACKER_3 EQU 0x30900C
|
||||
FT_REG_TRACKER_4 EQU 0x309010
|
||||
FT_REG_MEDIAFIFO_READ EQU 0x309014
|
||||
FT_REG_MEDIAFIFO_WRITE EQU 0x309018
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Co-processor commands
|
||||
; -------------------------------------------------------
|
||||
FT_CCMD_APPEND EQU 0xFFFFFF1E
|
||||
FT_CCMD_BGCOLOR EQU 0xFFFFFF09
|
||||
FT_CCMD_BITMAP_TRANSFORM EQU 0xFFFFFF21
|
||||
FT_CCMD_BUTTON EQU 0xFFFFFF0D
|
||||
FT_CCMD_CALIBRATE EQU 0xFFFFFF15
|
||||
FT_CCMD_CLOCK EQU 0xFFFFFF14
|
||||
FT_CCMD_COLDSTART EQU 0xFFFFFF32
|
||||
FT_CCMD_CRC EQU 0xFFFFFF03
|
||||
FT_CCMD_CSKETCH EQU 0xFFFFFF35
|
||||
FT_CCMD_DIAL EQU 0xFFFFFF2D
|
||||
FT_CCMD_DLSTART EQU 0xFFFFFF00
|
||||
FT_CCMD_EXECUTE EQU 0xFFFFFF07
|
||||
FT_CCMD_FGCOLOR EQU 0xFFFFFF0A
|
||||
FT_CCMD_FLASHATTACH EQU 0xFFFFFF49
|
||||
FT_CCMD_FLASHDETACH EQU 0xFFFFFF48
|
||||
FT_CCMD_FLASHERASE EQU 0xFFFFFF44
|
||||
FT_CCMD_FLASHFAST EQU 0xFFFFFF4A
|
||||
FT_CCMD_FLASHRX EQU 0xFFFFFF4D
|
||||
FT_CCMD_FLASHSOURCE EQU 0xFFFFFF4E
|
||||
FT_CCMD_FLASHSPIDESEL EQU 0xFFFFFF4B
|
||||
FT_CCMD_FLASHTX EQU 0xFFFFFF4C
|
||||
FT_CCMD_FLASHUPDATE EQU 0xFFFFFF47
|
||||
FT_CCMD_GAUGE EQU 0xFFFFFF13
|
||||
FT_CCMD_GETMATRIX EQU 0xFFFFFF33
|
||||
FT_CCMD_GETPOINT EQU 0xFFFFFF08
|
||||
FT_CCMD_GETPROPS EQU 0xFFFFFF25
|
||||
FT_CCMD_GETPTR EQU 0xFFFFFF23
|
||||
FT_CCMD_GRADCOLOR EQU 0xFFFFFF34
|
||||
FT_CCMD_GRADIENT EQU 0xFFFFFF0B
|
||||
FT_CCMD_HAMMERAUX EQU 0xFFFFFF04
|
||||
FT_CCMD_IDCT_DELETED EQU 0xFFFFFF06
|
||||
FT_CCMD_INFLATE EQU 0xFFFFFF22
|
||||
FT_CCMD_INTERRUPT EQU 0xFFFFFF02
|
||||
FT_CCMD_INT_RAMSHARED EQU 0xFFFFFF3D
|
||||
FT_CCMD_INT_SWLOADIMAGE EQU 0xFFFFFF3E
|
||||
FT_CCMD_KEYS EQU 0xFFFFFF0E
|
||||
FT_CCMD_LOADIDENTITY EQU 0xFFFFFF26
|
||||
FT_CCMD_LOADIMAGE EQU 0xFFFFFF24
|
||||
FT_CCMD_LOGO EQU 0xFFFFFF31
|
||||
FT_CCMD_MARCH EQU 0xFFFFFF05
|
||||
FT_CCMD_MEDIAFIFO EQU 0xFFFFFF39
|
||||
FT_CCMD_MEMCPY EQU 0xFFFFFF1D
|
||||
FT_CCMD_MEMCRC EQU 0xFFFFFF18
|
||||
FT_CCMD_MEMSET EQU 0xFFFFFF1B
|
||||
FT_CCMD_MEMWRITE EQU 0xFFFFFF1A
|
||||
FT_CCMD_MEMZERO EQU 0xFFFFFF1C
|
||||
FT_CCMD_NUMBER EQU 0xFFFFFF2E
|
||||
FT_CCMD_PLAYVIDEO EQU 0xFFFFFF3A
|
||||
FT_CCMD_PROGRESS EQU 0xFFFFFF0F
|
||||
FT_CCMD_REGREAD EQU 0xFFFFFF19
|
||||
FT_CCMD_ROMFONT EQU 0xFFFFFF3F
|
||||
FT_CCMD_ROTATE EQU 0xFFFFFF29
|
||||
FT_CCMD_SCALE EQU 0xFFFFFF28
|
||||
FT_CCMD_SCREENSAVER EQU 0xFFFFFF2F
|
||||
FT_CCMD_SCROLLBAR EQU 0xFFFFFF11
|
||||
FT_CCMD_SETBASE EQU 0xFFFFFF38
|
||||
FT_CCMD_SETBITMAP EQU 0xFFFFFF43
|
||||
FT_CCMD_SETFONT EQU 0xFFFFFF2B
|
||||
FT_CCMD_SETFONT2 EQU 0xFFFFFF3B
|
||||
FT_CCMD_SETMATRIX EQU 0xFFFFFF2A
|
||||
FT_CCMD_SETROTATE EQU 0xFFFFFF36
|
||||
FT_CCMD_SETSCRATCH EQU 0xFFFFFF3C
|
||||
FT_CCMD_SKETCH EQU 0xFFFFFF30
|
||||
FT_CCMD_SLIDER EQU 0xFFFFFF10
|
||||
FT_CCMD_SNAPSHOT EQU 0xFFFFFF1F
|
||||
FT_CCMD_SNAPSHOT2 EQU 0xFFFFFF37
|
||||
FT_CCMD_SPINNER EQU 0xFFFFFF16
|
||||
FT_CCMD_STOP EQU 0xFFFFFF17
|
||||
FT_CCMD_SWAP EQU 0xFFFFFF01
|
||||
FT_CCMD_SYNC EQU 0xFFFFFF42
|
||||
FT_CCMD_TEXT EQU 0xFFFFFF0C
|
||||
FT_CCMD_TOGGLE EQU 0xFFFFFF12
|
||||
FT_CCMD_TOUCH_TRANSFORM EQU 0xFFFFFF20
|
||||
FT_CCMD_TRACK EQU 0xFFFFFF2C
|
||||
FT_CCMD_TRANSLATE EQU 0xFFFFFF27
|
||||
FT_CCMD_VIDEOFRAME EQU 0xFFFFFF41
|
||||
FT_CCMD_VIDEOSTART EQU 0xFFFFFF40
|
||||
|
||||
; ubsigned long
|
||||
FT_OPT_CENTER EQU 1536
|
||||
FT_OPT_CENTERX EQU 512
|
||||
FT_OPT_CENTERY EQU 1024
|
||||
FT_OPT_FLAT EQU 256
|
||||
FT_OPT_MONO EQU 1
|
||||
FT_OPT_NOBACK EQU 4096
|
||||
FT_OPT_NODL EQU 2
|
||||
FT_OPT_NOHANDS EQU 49152
|
||||
FT_OPT_NOHM EQU 16384
|
||||
FT_OPT_NOPOINTER EQU 16384
|
||||
FT_OPT_NOSECS EQU 32768
|
||||
FT_OPT_NOTICKS EQU 8192
|
||||
FT_OPT_RIGHTX EQU 2048
|
||||
FT_OPT_SIGNED EQU 256
|
||||
OPT_NOTEAR EQU 4
|
||||
OPT_FULLSCREEN EQU 8
|
||||
OPT_MEDIAFIFO EQU 16
|
||||
OPT_SOUND EQU 32
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Primitives
|
||||
; -------------------------------------------------------
|
||||
FT_BITMAPS EQU 1
|
||||
FT_POINTS EQU 2
|
||||
FT_LINES EQU 3
|
||||
FT_LINE_STRIP EQU 4
|
||||
FT_EDGE_STRIP_R EQU 5
|
||||
FT_EDGE_STRIP_L EQU 6
|
||||
FT_EDGE_STRIP_A EQU 7
|
||||
FT_EDGE_STRIP_B EQU 8
|
||||
FT_RECTS EQU 9
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Formats
|
||||
; -------------------------------------------------------
|
||||
FT_ARGB1555 EQU 0
|
||||
FT_L1 EQU 1
|
||||
FT_L4 EQU 2
|
||||
FT_L8 EQU 3
|
||||
FT_RGB332 EQU 4
|
||||
FT_ARGB2 EQU 5
|
||||
FT_ARGB4 EQU 6
|
||||
FT_RGB565 EQU 7
|
||||
FT_TEXT8X8 EQU 9
|
||||
FT_TEXTVGA EQU 10
|
||||
FT_BARGRAPH EQU 11
|
||||
FT_PALETTED565 EQU 14
|
||||
FT_PALETTED4444 EQU 15
|
||||
FT_PALETTED8 EQU 16
|
||||
FT_L2 EQU 17
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Blend functions
|
||||
; -------------------------------------------------------
|
||||
FT_ZERO EQU 0
|
||||
FT_ONE EQU 1
|
||||
FT_SRC_ALPHA EQU 2
|
||||
FT_DST_ALPHA EQU 3
|
||||
FT_ONE_MINUS_SRC_ALPHA EQU 4
|
||||
FT_ONE_MINUS_DST_ALPHA EQU 5
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Stencil test functions
|
||||
; -------------------------------------------------------
|
||||
FT_NEVER EQU 0
|
||||
FT_LESS EQU 1
|
||||
FT_LEQUAL EQU 2
|
||||
FT_GREATER EQU 3
|
||||
FT_GEQUAL EQU 4
|
||||
FT_EQUAL EQU 5
|
||||
FT_NOTEQUAL EQU 6
|
||||
FT_ALWAYS EQU 7
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Stencil operations
|
||||
; -------------------------------------------------------
|
||||
FT_KEEP EQU 1
|
||||
FT_REPLACE EQU 2
|
||||
FT_INCR EQU 3
|
||||
FT_DECR EQU 4
|
||||
FT_INVERT EQU 5
|
||||
FT_INCR_WRAP EQU 6 ; undocumented???
|
||||
FT_DECR_WRAP EQU 7 ; undocumented???
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Bitmap wrap mode
|
||||
; -------------------------------------------------------
|
||||
FT_REPEAT EQU 1
|
||||
FT_BORDER EQU 0
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Bitmap filtering mode
|
||||
; -------------------------------------------------------
|
||||
FT_NEAREST EQU 0
|
||||
FT_BILINEAR EQU 1
|
||||
|
||||
; -------------------------------------------------------
|
||||
; DL_SWAP modes
|
||||
; -------------------------------------------------------
|
||||
FT_DLSWAP_DONE EQU 0
|
||||
FT_DLSWAP_LINE EQU 1
|
||||
FT_DLSWAP_FRAME EQU 2
|
||||
|
||||
; -------------------------------------------------------
|
||||
; INT sources
|
||||
; -------------------------------------------------------
|
||||
FT_INT_SWAP EQU 1
|
||||
FT_INT_TOUCH EQU 2
|
||||
FT_INT_TAG EQU 4
|
||||
FT_INT_SOUND EQU 8
|
||||
FT_INT_PLAYBACK EQU 16
|
||||
FT_INT_CMDEMPTY EQU 32
|
||||
FT_INT_CMDFLAG EQU 64
|
||||
FT_INT_CONVCOMPLETE EQU 128
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Playback formats
|
||||
; -------------------------------------------------------
|
||||
FT_LINEAR_SAMPLES EQU 0
|
||||
FT_ULAW_SAMPLES EQU 1
|
||||
FT_ADPCM_SAMPLES EQU 2
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Touch ADC modes
|
||||
; -------------------------------------------------------
|
||||
FT_ADC_SINGLE_ENDED EQU 0
|
||||
FT_ADC_DIFFERENTIAL EQU 1
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Touch modes
|
||||
; -------------------------------------------------------
|
||||
FT_TOUCHMODE_OFF EQU 0
|
||||
FT_TOUCHMODE_ONESHOT EQU 1
|
||||
FT_TOUCHMODE_FRAME EQU 2
|
||||
FT_TOUCHMODE_CONTINUOUS EQU 3
|
||||
|
||||
; -------------------------------------------------------
|
||||
; Constants
|
||||
; -------------------------------------------------------
|
||||
FT_DL_SIZE EQU 8192 ; 8KB Display List buffer size
|
||||
FT_CMD_FIFO_SIZE EQU 4096 ; 4KB coprocessor Fifo size
|
||||
FT_CMD_SIZE EQU 4 ; 4 byte per coprocessor command of EVE
|
||||
FT_GPU_NUMCHAR_PERFONT EQU 128
|
||||
FT_GPU_FONT_TABLE_SIZE EQU 148
|
||||
|
||||
|
||||
|
||||
MACRO ft_cmd cmd
|
||||
LD A, cmd
|
||||
CALL @FT.FT_CMD
|
||||
ENDM
|
||||
|
||||
MACRO ft_rreg8 reg16
|
||||
LD BC, reg16
|
||||
CALL @FT.FT_RREG8
|
||||
ENDM
|
||||
|
||||
MACRO ft_rreg16 reg16
|
||||
LD BC, reg16
|
||||
CALL @FT.FT_RREG16
|
||||
ENDM
|
||||
|
||||
MACRO ft_cmdp cmd, par
|
||||
LD B, cmd
|
||||
LD C, par
|
||||
CALL @FT.FT_CMDP
|
||||
ENDM
|
||||
|
||||
ENDIF
|
146
Tester/ftt.asm
Normal file
146
Tester/ftt.asm
Normal file
@ -0,0 +1,146 @@
|
||||
; ======================================================
|
||||
; FT-Test to test Sprinter-FT
|
||||
; FT812 Video card for Sprinter computer
|
||||
; By Roman Boykov. Copyright (c) 2025
|
||||
; https://github.com/romychs
|
||||
; License: BSD 3-Clause
|
||||
; ======================================================
|
||||
|
||||
; Set to 1 to turn debug ON with DeZog VSCode plugin
|
||||
; Set to 0 to compile .EXE
|
||||
DEBUG EQU 0
|
||||
|
||||
; Set to 1 to output TRACE messages
|
||||
TRACE EQU 0
|
||||
|
||||
; Version of EXE file, 1 for DSS 1.70+
|
||||
EXE_VERSION EQU 0
|
||||
|
||||
; Timeout to wait ESP response
|
||||
DEFAULT_TIMEOUT EQU 2000
|
||||
|
||||
SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
|
||||
|
||||
DEVICE NOSLOT64K
|
||||
|
||||
INCLUDE "macro.inc"
|
||||
INCLUDE "dss.inc"
|
||||
INCLUDE "sprinter.inc"
|
||||
|
||||
MODULE MAIN
|
||||
|
||||
ORG 0x8080
|
||||
; ------------------------------------------------------
|
||||
EXE_HEADER
|
||||
DB "EXE"
|
||||
DB EXE_VERSION ; EXE Version
|
||||
DW 0x0080 ; Code offset
|
||||
DW 0
|
||||
DW 0 ; Primary loader size
|
||||
DW 0 ; Reserved
|
||||
DW 0
|
||||
DW 0
|
||||
DW START ; Loading Address
|
||||
DW START ; Entry Point
|
||||
DW STACK_TOP ; Stack address
|
||||
DS 106, 0 ; Reserved
|
||||
|
||||
ORG 0x8100
|
||||
@STACK_TOP
|
||||
|
||||
; ------------------------------------------------------
|
||||
START
|
||||
|
||||
IFDEF DEBUG
|
||||
; LD IX,CMD_LINE1
|
||||
LD SP, STACK_TOP
|
||||
; JP MAIN_LOOP
|
||||
ENDIF
|
||||
|
||||
// CALL @WCOMMON.INIT_VMODE
|
||||
|
||||
PRINTLN MSG_START
|
||||
|
||||
CALL ISA.ISA_RESET ; Reset ISA Devices
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Do Some
|
||||
; ------------------------------------------------------
|
||||
|
||||
MAIN_LOOP
|
||||
|
||||
; Find FT
|
||||
CALL FT.FT_FIND
|
||||
LD HL, MSG_NO_FT
|
||||
JR C, MSG_NF_OUT
|
||||
; FT is Found
|
||||
; A = ISA slot
|
||||
ADD A, '1' ; 0x31
|
||||
LD (MSG_SLOT_NO), A
|
||||
PRINTLN MSG_IS_FT
|
||||
|
||||
; Activate
|
||||
;CALL FT.FT_ACTIVATE
|
||||
LD A, FT_MODE_800_600_60
|
||||
CALL FT.FT_INIT
|
||||
|
||||
; Get FT chip info
|
||||
PRINTLN MSG_GET_CHIP_ID
|
||||
CALL FT.FT_GET_CHIP_ID
|
||||
|
||||
LD HL, FT.FT_BUFFER
|
||||
LD DE, MSG_CTB
|
||||
LD B, 4
|
||||
.NXT_ID
|
||||
LD C, (HL)
|
||||
CALL UTIL.HEXB
|
||||
INC HL
|
||||
DJNZ .NXT_ID
|
||||
PRINTLN MSG_CHIP_TYPE
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
OK_EXIT
|
||||
LD B, 0
|
||||
NOK_EXIT
|
||||
DSS_EXEC DSS_EXIT
|
||||
|
||||
; Out message about FT slot
|
||||
MSG_NF_OUT
|
||||
PRINTLN_HL
|
||||
LD B, 1
|
||||
JR NOK_EXIT
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Custom messages
|
||||
; ------------------------------------------------------
|
||||
|
||||
MSG_START
|
||||
DB "Sprinter-FT tester by Sprinter Team. v1.0.b1, ", __DATE__, "\r\n", 0
|
||||
|
||||
MSG_NO_FT
|
||||
DB "Sprinter-FT not found!", 0
|
||||
|
||||
MSG_GET_CHIP_ID
|
||||
DB "Read Chip Identification Code", 0
|
||||
MSG_IS_FT
|
||||
DB "Sprinter-FT found at ISA-"
|
||||
MSG_SLOT_NO
|
||||
DB 0, 0
|
||||
|
||||
MSG_CHIP_TYPE
|
||||
DB "Chip type bytes: 0x"
|
||||
MSG_CTB
|
||||
DS 9, 0
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Custom commands
|
||||
; ------------------------------------------------------
|
||||
|
||||
ENDMODULE
|
||||
|
||||
INCLUDE "ftlib.asm"
|
||||
INCLUDE "util.asm"
|
||||
INCLUDE "isa.asm"
|
||||
|
||||
END MAIN.START
|
BIN
Tester/ftt.exe
Normal file
BIN
Tester/ftt.exe
Normal file
Binary file not shown.
94
Tester/isa.asm
Normal file
94
Tester/isa.asm
Normal file
@ -0,0 +1,94 @@
|
||||
; ======================================================
|
||||
; ISA Library for Sprinter computer
|
||||
; By Roman Boykov. Copyright (c) 2024
|
||||
; https://github.com/romychs
|
||||
; License: BSD 3-Clause
|
||||
; ======================================================
|
||||
|
||||
IFNDEF _ISA
|
||||
DEFINE _ISA
|
||||
|
||||
INCLUDE "sprinter.inc"
|
||||
INCLUDE "util.asm"
|
||||
|
||||
PORT_ISA EQU 0x9FBD
|
||||
PORT_SYSTEM EQU 0x1FFD
|
||||
|
||||
ISA_BASE_A EQU 0xC000 ; Базовый адрес портов ISA в памяти
|
||||
|
||||
; --- PORT_ISA bits
|
||||
ISA_A14 EQU 0x01
|
||||
ISA_A15 EQU 0x02
|
||||
ISA_A16 EQU 0x04
|
||||
ISA_A17 EQU 0x08
|
||||
ISA_A18 EQU 0x10
|
||||
ISA_A19 EQU 0x20
|
||||
ISA_AEN EQU 0x40
|
||||
ISA_RST EQU 0x80
|
||||
NOP_FOR_DELAY EQU 5
|
||||
|
||||
MODULE ISA
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Reset ISA device
|
||||
; ------------------------------------------------------
|
||||
ISA_RESET
|
||||
PUSH AF, BC
|
||||
LD BC, PORT_ISA
|
||||
LD A, ISA_RST | ISA_AEN ; RESET=1 AEN=1
|
||||
OUT (C), A
|
||||
DUP NOP_FOR_DELAY
|
||||
NOP
|
||||
EDUP
|
||||
;CALL @UTIL.DELAY_100uS
|
||||
XOR A
|
||||
OUT (C), A ; RESET=0 AEN=0
|
||||
;CALL @UTIL.DELAY_100uS
|
||||
POP BC, AF
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Open access to ISA ports as memory
|
||||
; Inp: A = 0 - ISA slot 0, 1 - ISA SLOT 1
|
||||
; ------------------------------------------------------
|
||||
ISA_OPEN
|
||||
PUSH AF,BC
|
||||
LD BC, PAGE3
|
||||
IN A,(C)
|
||||
LD (SAVE_MMU3), A
|
||||
LD BC, PORT_SYSTEM
|
||||
LD A, 0x11
|
||||
OUT (C), A
|
||||
ISA_SLOT EQU $+1
|
||||
LD A, 0x00
|
||||
SLA A
|
||||
OR A, 0xD4 ; D4 - ISA1, D6 - ISA2
|
||||
LD BC, PAGE3
|
||||
OUT (C), A
|
||||
LD BC, PORT_ISA
|
||||
XOR A
|
||||
OUT (C), A
|
||||
POP BC,AF
|
||||
RET
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Close access to ISA ports
|
||||
; ------------------------------------------------------
|
||||
ISA_CLOSE
|
||||
PUSH AF,BC
|
||||
LD A,0x01
|
||||
LD BC,PORT_SYSTEM
|
||||
OUT (C),A
|
||||
LD BC,PAGE3
|
||||
LD A,(SAVE_MMU3)
|
||||
OUT (C),A
|
||||
POP BC,AF
|
||||
RET
|
||||
|
||||
; To save memory page 3
|
||||
SAVE_MMU3 DB 0
|
||||
|
||||
ENDMODULE
|
||||
|
||||
ENDIF
|
70
Tester/macro.inc
Normal file
70
Tester/macro.inc
Normal file
@ -0,0 +1,70 @@
|
||||
; ======================================================
|
||||
; Macros for Sprinter-WiFi utilities
|
||||
; By Roman Boykov. Copyright (c) 2024
|
||||
; https://github.com/romychs
|
||||
; License: BSD 3-Clause
|
||||
; ======================================================
|
||||
|
||||
IFNDEF _MACRO
|
||||
DEFINE _MACRO
|
||||
|
||||
; Transmit data|command via UART and check response
|
||||
MACRO SEND_CMD data
|
||||
LD HL, data
|
||||
CALL @WIFI.UART_TX_CMD
|
||||
CALL CHECK_ERROR
|
||||
ENDM
|
||||
|
||||
; Print data forn HL - pointer to ASCIIZ string to screen
|
||||
MACRO PRINT_HL
|
||||
LD C,DSS_PCHARS
|
||||
RST DSS
|
||||
ENDM
|
||||
|
||||
; Print data forn HL - pointer to ASCIIZ string to screen, and <CR><LF>
|
||||
MACRO PRINTLN_HL
|
||||
PRINT_HL
|
||||
LD HL, UTIL.LINE_END
|
||||
PRINT_HL
|
||||
ENDM
|
||||
|
||||
; Print data ASCIIZ string to screen
|
||||
MACRO PRINT data
|
||||
LD HL,data
|
||||
PRINT_HL
|
||||
ENDM
|
||||
|
||||
; Print data ASCIIZ string to screen and <CR><LF>
|
||||
MACRO PRINTLN data
|
||||
LD HL,data
|
||||
PRINTLN_HL
|
||||
ENDM
|
||||
|
||||
; Print data ASCIIZ string to screen if TRACE enabled
|
||||
MACRO TRACELN data
|
||||
IFDEF TRACE
|
||||
PUSH BC,DE
|
||||
PRINTLN data
|
||||
POP DE,BC
|
||||
ENDIF
|
||||
ENDM
|
||||
|
||||
; Execute specified DSS function
|
||||
MACRO DSS_EXEC func
|
||||
IF func>255
|
||||
LD BC,func
|
||||
ELSE
|
||||
LD C,func
|
||||
ENDIF
|
||||
RST DSS
|
||||
ENDM
|
||||
|
||||
; If current work mode is upload, go to label
|
||||
MACRO IF_UPLOAD_GO lbl
|
||||
LD A,(WORK_MODE)
|
||||
;CP WM_UPLOAD
|
||||
DEC A
|
||||
JR Z,lbl
|
||||
ENDM
|
||||
|
||||
ENDIF
|
37
Tester/sprinter.inc
Normal file
37
Tester/sprinter.inc
Normal file
@ -0,0 +1,37 @@
|
||||
; ======================================================
|
||||
; Defines for Sprinter computer hardware
|
||||
; By Roman Boykov. Copyright (c) 2024
|
||||
; https://github.com/romychs
|
||||
; ======================================================
|
||||
|
||||
IFNDEF _SPRINTER
|
||||
DEFINE _SPRINTER
|
||||
|
||||
; Memory pages
|
||||
PAGE0_ADDR EQU 0x0000
|
||||
PAGE1_ADDR EQU 0x4000
|
||||
PAGE2_ADDR EQU 0x8000
|
||||
PAGE3_ADDR EQU 0xC000
|
||||
|
||||
; Sprinter ports to switch mem pages
|
||||
PAGE0 EQU 0x82
|
||||
PAGE1 EQU 0xA2
|
||||
PAGE2 EQU 0xC2
|
||||
PAGE3 EQU 0xE2
|
||||
|
||||
; CTC Control register ports
|
||||
CTC_CH0 EQU 0x10
|
||||
CTC_CH1 EQU 0x11
|
||||
CTC_CH2 EQU 0x12
|
||||
CTC_CH3 EQU 0x13
|
||||
|
||||
CTC_CR_VEC EQU 0x01 ; 1 - Vector, 0 - Control
|
||||
CTC_CR_SWR EQU 0x02 ; 1 - Software Reset, 0 - Continued operation
|
||||
CTC_CR_TCF EQU 0x04 ; 1 - TYime const follows
|
||||
CTC_CR_TTR EQU 0x08 ; 1 - Time trigger
|
||||
CTC_CT_TRE EQU 0x10 ; 1 - Trigger Edge
|
||||
CTC_CT_PRE EQU 0x20 ; 1 - 256 Prescaler, 0 - 16
|
||||
CTC_CT_CTR EQU 0x40 ; 0 - Timer, 1 - Counter
|
||||
CTC_CT_EI EQU 0x80 ; Interrupt 1 - enable, 0 - disable
|
||||
|
||||
ENDIF
|
425
Tester/util.asm
Normal file
425
Tester/util.asm
Normal file
@ -0,0 +1,425 @@
|
||||
; ======================================================
|
||||
; Utility code for Sprinter-WiFi utilities
|
||||
; By Roman Boykov. Copyright (c) 2024
|
||||
; https://github.com/romychs
|
||||
; License: BSD 3-Clause
|
||||
; ======================================================
|
||||
|
||||
IFNDEF _UTIL
|
||||
DEFINE _UTIL
|
||||
|
||||
MODULE UTIL
|
||||
|
||||
MAX_BUFF_SIZE EQU 2048
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Small delay
|
||||
; Inp: HL - number of cycles, if HL=0, then 2000
|
||||
; ------------------------------------------------------
|
||||
DELAY
|
||||
PUSH AF,BC,HL
|
||||
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,.DELAY_NXT
|
||||
LD HL,20
|
||||
|
||||
.DELAY_NXT
|
||||
CALL .DELAY_1MS_INT
|
||||
DEC HL
|
||||
LD A,H
|
||||
OR L
|
||||
JP NZ,.DELAY_NXT
|
||||
|
||||
POP HL,BC,AF
|
||||
RET
|
||||
|
||||
.DELAY_1MS_INT
|
||||
LD BC,400
|
||||
.SBD_NXT
|
||||
DEC BC
|
||||
LD A, B
|
||||
OR C
|
||||
JR NZ, .SBD_NXT
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Delay for about 1ms
|
||||
; ------------------------------------------------------
|
||||
DELAY_1MS
|
||||
PUSH BC
|
||||
CALL DELAY.DELAY_1MS_INT
|
||||
POP BC
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Delay for about 100us
|
||||
; ------------------------------------------------------
|
||||
DELAY_100uS
|
||||
PUSH BC
|
||||
LD BC,40
|
||||
CALL DELAY.SBD_NXT
|
||||
POP BC
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Calc length of zero ended string
|
||||
; Inp: HL - pointer to string;
|
||||
; Out: BC - length of string
|
||||
; ------------------------------------------------------
|
||||
;;IFUSED STRLEN
|
||||
STRLEN
|
||||
PUSH DE, HL, HL
|
||||
LD BC, MAX_BUFF_SIZE
|
||||
XOR A
|
||||
CPIR
|
||||
POP DE
|
||||
SBC HL, DE ; length of zero ended string
|
||||
LD BC, HL
|
||||
LD A, B
|
||||
OR C
|
||||
JR Z, .STRL_NCOR
|
||||
DEC BC
|
||||
.STRL_NCOR
|
||||
POP HL, DE
|
||||
RET
|
||||
;ENDIF
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Compare strings
|
||||
; Inp: HL, DE - pointers to asciiz strings to compare;
|
||||
; Out: CF=0 - equal, CF=1 - not equal
|
||||
; ------------------------------------------------------
|
||||
;;IFUSED STRCMP
|
||||
STRCMP
|
||||
PUSH DE,HL
|
||||
.STC_NEXT
|
||||
LD A, (DE)
|
||||
CP (HL)
|
||||
JR NZ,.STC_NE
|
||||
AND A
|
||||
JR Z,.STC_EQ
|
||||
INC DE
|
||||
INC HL
|
||||
JR .STC_NEXT
|
||||
.STC_NE
|
||||
SCF
|
||||
.STC_EQ
|
||||
POP HL,DE
|
||||
RET
|
||||
;;ENDIF
|
||||
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Compare first BC chars for two zero-ended strings
|
||||
; Inp: HL, DE - pointers to strings to compare;
|
||||
; BC - Number of chars to compare;
|
||||
; Out: ZF=0 - not equal, ZF=1 - equal
|
||||
; ------------------------------------------------------
|
||||
;IFUSED STRNCMP
|
||||
STRNCMP
|
||||
PUSH HL,DE,BC
|
||||
.STRN_NXT
|
||||
LD A,(DE)
|
||||
SUB (HL)
|
||||
JR NZ,.STRN_NE
|
||||
LD A,(DE)
|
||||
OR A
|
||||
JR Z,.STRN_NE
|
||||
INC DE
|
||||
INC HL
|
||||
DEC BC
|
||||
LD A,B
|
||||
OR C
|
||||
JP NZ,.STRN_NXT
|
||||
.STRN_NE
|
||||
POP BC,DE,HL
|
||||
RET
|
||||
;ENDIF
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Checks whether a string (HL) starts with the strinf (DE)
|
||||
; Inp: DE - points to start string;
|
||||
; HL - points to string;
|
||||
; Out: ZF=0 - not equal, ZF=1 - equal
|
||||
; ------------------------------------------------------
|
||||
;;IFUSED STARTSWITH
|
||||
STARTSWITH
|
||||
PUSH HL,DE
|
||||
.STRW_NXT
|
||||
LD A,(DE)
|
||||
OR A
|
||||
JR Z,.STRW_END
|
||||
LD A,(DE)
|
||||
CP (HL)
|
||||
JR NZ,.STRW_END
|
||||
INC HL
|
||||
INC DE
|
||||
JR .STRW_NXT
|
||||
.STRW_END
|
||||
POP DE,HL
|
||||
RET
|
||||
;;ENDIF
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Skip spaces at start of zero ended string
|
||||
; Inp: HL - pointer to string;
|
||||
; Out: HL - points to first non space symbol
|
||||
; ------------------------------------------------------
|
||||
;;IFUSED LTRIM
|
||||
LTRIM
|
||||
LD A, (HL)
|
||||
OR A
|
||||
RET Z
|
||||
CP 0x21
|
||||
RET P
|
||||
INC HL
|
||||
JR LTRIM
|
||||
;;ENDIF
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Convert string to number
|
||||
; Inp: DE - ptr to zero ended string;
|
||||
; Out: HL - Result
|
||||
; ------------------------------------------------------
|
||||
;;IFUSED ATOU
|
||||
ATOU
|
||||
PUSH BC
|
||||
LD HL,0x0000
|
||||
.ATOU_L1
|
||||
LD A,(DE)
|
||||
AND A
|
||||
JR Z, .ATOU_LE
|
||||
SUB 0x30
|
||||
CP 10
|
||||
JR NC, .ATOU_LE
|
||||
INC DE
|
||||
LD B,H
|
||||
LD C,L
|
||||
ADD HL,HL
|
||||
ADD HL,HL
|
||||
ADD HL,BC
|
||||
ADD HL,HL
|
||||
ADD A,L
|
||||
LD L,A
|
||||
JR NC,.ATOU_L1
|
||||
INC H
|
||||
JP .ATOU_L1
|
||||
.ATOU_LE
|
||||
POP BC
|
||||
RET
|
||||
;;ENDIF
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Convert 16 bit unsigned number to string
|
||||
; Inp: HL - number;
|
||||
; DE - ptr to buffer;
|
||||
; Out: DE -> asciiz string representing a number
|
||||
; ------------------------------------------------------
|
||||
;;IFUSED UTOA
|
||||
UTOA:
|
||||
PUSH BC, HL
|
||||
XOR A
|
||||
PUSH AF ; END MARKER A=0, Z
|
||||
.UTOA_L1
|
||||
CALL DIV_10
|
||||
ADD '0'
|
||||
PUSH AF ; DIGIT: A>0, NZ
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,.UTOA_L1
|
||||
.UTOA_L2
|
||||
POP AF
|
||||
LD (DE),A
|
||||
INC DE
|
||||
JR NZ,.UTOA_L2
|
||||
POP HL, BC
|
||||
RET
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Division by 10
|
||||
; Inp: HL - number;
|
||||
; Out: HL - quotient;
|
||||
; A - remainder;
|
||||
; ------------------------------------------------------
|
||||
DIV_10:
|
||||
PUSH BC
|
||||
LD BC,0x0D0A
|
||||
XOR A
|
||||
ADD HL,HL
|
||||
RLA
|
||||
ADD HL,HL
|
||||
RLA
|
||||
ADD HL,HL
|
||||
RLA
|
||||
.DDL1
|
||||
ADD HL,HL
|
||||
RLA
|
||||
CP C
|
||||
JR C,.DDL2
|
||||
SUB C
|
||||
INC L
|
||||
.DDL2
|
||||
DJNZ .DDL1
|
||||
POP BC
|
||||
RET
|
||||
;;ENDIF
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Multiplication by 10
|
||||
; Inp: HL - number;
|
||||
; Out: BC - result;
|
||||
; ------------------------------------------------------
|
||||
MUL_10
|
||||
ADD HL, HL
|
||||
ADD HL, HL
|
||||
LD B, H
|
||||
LD C, L ; BC = HL*4
|
||||
ADD HL, HL
|
||||
ADD HL, HL ; HL*16
|
||||
ADD HL, BC
|
||||
LD B, H
|
||||
LD C, L
|
||||
RET
|
||||
|
||||
|
||||
; ------------------------------------------------------
|
||||
; FAST_UTOA
|
||||
; Inp: HL - number;
|
||||
; DE - Buffer;
|
||||
; CF is set to write leading zeroes;
|
||||
; Out: DE - address of destination string
|
||||
; ------------------------------------------------------
|
||||
;;IFUSED FAST_UTOA
|
||||
FAST_UTOA
|
||||
LD BC,0+256
|
||||
PUSH BC
|
||||
LD BC,-10+256
|
||||
PUSH BC
|
||||
INC H
|
||||
DEC H
|
||||
JR Z, .EIGHT_BIT
|
||||
|
||||
LD C,0xFF & (-100+256)
|
||||
PUSH BC
|
||||
|
||||
LD BC,-1000+256
|
||||
PUSH BC
|
||||
|
||||
LD BC,-10000
|
||||
|
||||
JR C,.LEADING_ZEROES
|
||||
|
||||
.NO_LEADING_ZEROES
|
||||
|
||||
CALL .DIVIDE
|
||||
CP '0'
|
||||
JR NZ,.WRITE
|
||||
|
||||
POP BC
|
||||
DJNZ .NO_LEADING_ZEROES
|
||||
|
||||
JR .WRITE1S
|
||||
|
||||
.LEADING_ZEROES
|
||||
CALL .DIVIDE
|
||||
|
||||
.WRITE
|
||||
LD (DE),A
|
||||
INC DE
|
||||
|
||||
POP BC
|
||||
DJNZ .LEADING_ZEROES
|
||||
|
||||
.WRITE1S
|
||||
LD A,L
|
||||
ADD A,'0'
|
||||
|
||||
LD (DE),A
|
||||
INC DE
|
||||
RET
|
||||
|
||||
.DIVIDE
|
||||
LD A,'0'-1
|
||||
|
||||
.DIVLOOP
|
||||
INC A
|
||||
ADD HL,BC
|
||||
JR C, .DIVLOOP
|
||||
|
||||
SBC HL,BC
|
||||
RET
|
||||
|
||||
.EIGHT_BIT
|
||||
LD BC,-100
|
||||
JR NC, .NO_LEADING_ZEROES
|
||||
|
||||
; write two leading zeroes to output string
|
||||
LD A,'0'
|
||||
LD (DE),A
|
||||
INC DE
|
||||
LD (DE),A
|
||||
INC DE
|
||||
|
||||
JR .LEADING_ZEROES
|
||||
;;ENDIF
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Find char in string
|
||||
; Inp: HL - ptr to zero endeds string;
|
||||
; A - char to find;
|
||||
; Outp: CF=0, HL points to char if found;
|
||||
; CF=1 - Not found
|
||||
; ------------------------------------------------------
|
||||
;;IFUSED STRCHR
|
||||
STRCHR
|
||||
PUSH BC
|
||||
.STCH_NEXT
|
||||
LD C,A
|
||||
LD A,(HL)
|
||||
AND A
|
||||
JR Z, .STCH_N_FOUND
|
||||
CP C
|
||||
JR Z, .STCH_FOUND
|
||||
INC HL
|
||||
JR .STCH_NEXT
|
||||
.STCH_N_FOUND
|
||||
SCF
|
||||
.STCH_FOUND
|
||||
POP BC
|
||||
RET
|
||||
;;ENDIF
|
||||
|
||||
; ------------------------------------------------------
|
||||
; Convert Byte to hex
|
||||
; Inp: C - byte to convert;
|
||||
; DE -> buffer for string;
|
||||
; Out: DE -> points after last char
|
||||
; ------------------------------------------------------
|
||||
HEXB
|
||||
LD A,C
|
||||
RRA
|
||||
RRA
|
||||
RRA
|
||||
RRA
|
||||
CALL .CONV_NIBLE
|
||||
LD A,C
|
||||
|
||||
.CONV_NIBLE
|
||||
AND 0x0f
|
||||
ADD A,0x90
|
||||
DAA
|
||||
ADC A,0x40
|
||||
DAA
|
||||
LD (DE), A
|
||||
INC DE
|
||||
RET
|
||||
|
||||
LINE_END
|
||||
DB "\r\n",0
|
||||
|
||||
ENDMODULE
|
||||
|
||||
ENDIF
|
Loading…
Reference in New Issue
Block a user