Compare commits

..

4 Commits

Author SHA1 Message Date
boykovra
a91a33196e SD card support 2025-02-22 00:26:45 +03:00
boykovra
60c79c00da Init FT like as in Evo SDK 2025-02-19 21:35:46 +03:00
boykovra
d48227f0ae Original device image 2025-02-18 14:23:04 +03:00
boykovra
490ca266e4 Sptinter-FT tester, first impl. 2025-02-18 14:12:23 +03:00
27 changed files with 29763 additions and 18731 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 646 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 757 KiB

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.

Binary file not shown.

View File

@ -10,7 +10,7 @@
[Файлы для производства](Export/Gerbers/Sprinter-FT_v1.0.0.zip)
![image](Export/render.png)
![image](Export/preview.png)
[Спринтер в Телеграм](https://t.me/zx_sprinter)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
Tester/README.md Normal file
View File

@ -0,0 +1,4 @@
FT-Tester
=========
Test program for Sprinter-FT ISA-8 card.

74
Tester/dss.inc Normal file
View 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
View 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
View 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
View 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

Binary file not shown.

94
Tester/isa.asm Normal file
View 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
View 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
View 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
View 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