1. Правильная генерация серийного номера по доке от M$

2. Исправление максимального размера раздела для FAT 16
3. Мелкие правки
This commit is contained in:
Anatoliy Belyanskiy 2023-08-17 22:36:36 +10:00 committed by Tolik
parent eceb6093d1
commit 6e9ce03009
12 changed files with 1794 additions and 1 deletions

@ -1 +1 @@
Subproject commit 64c3057bcecb671ebc5dd593a54c2ab1836222da
Subproject commit a26f6ad2cf2eab977cab8baa0c83b0c2a91a5e53

16
format/build.inc Executable file
View File

@ -0,0 +1,16 @@
BUILD_COUNT EQU 103
define BUILD_COUNT_T "103"
BUILD_DAY EQU 22
define BUILD_DAY_T "24"
BUILD_MONTH EQU 01
define BUILD_MONTH_T "01"
BUILD_YEAR EQU 2026
define BUILD_YEAR_T "2026"
define BUILD_DATE_T "22.01.26"
define BUILD_DATE_NS_T "220126"
define BUILD_TIME_T "22:41"

1
format/build.txt Executable file
View File

@ -0,0 +1 @@
100

148
format/console.asm Executable file
View File

@ -0,0 +1,148 @@
;Color settings
col_blue = 1
col_green = 2
col_violet = 3
col_red = 4
col_magenta = 5
col_brown = 6
col_white = 7
col_yellow = 10
col_white_light = 15
col_cmd = 16
IFUSED ClearScr
ClearScr: ld bc,0x0756 ;c = ESTEX_clearscr
ld de,0
ld hl,0x2050
ld a,space
rst 0x10
ld de,0
SYS ESTEX_setcursor
ld de,0
ld (coords),DE
ret
ENDIF
IFUSED winClearScr
;<3B>ந§¢®¤¨â ®âç¨áâªã ¢ë¡à ­­®© ®¡« á⨠⥪á⮢®£® íªà ­  (ª®­á®«¨).
;in:
; HL = ¢ëá®â , è¨à¨­ 
; DE = Y,X
; BC = new cursor position (Y,X)
winClearScr: push bc
ld a,space
ld b,7
SYS ESTEX_clearscr
pop de
ld (coords),de
SYS ESTEX_setcursor
ret
ENDIF
; IFUSED ScrBackup
;in:
;IX = buf addr
;ScrBackup: ld de,0 ;XY 0,0
; ld hl,0x2050 ;h,w: 32x80
; ex af,af
; in a,(mmu3)
; ex af,af
; SYS ESTEX_scrwincopy
; ret
; ENDIF
;
;
; IFUSED ScrRestore
;;in:
;;IX = buf addr
;ScrRestore: ld de,0 ;XY 0,0
; ld hl,0x2050 ;h,w: 32x80
; ex af,af
; in a,(mmu3)
; ex af,af
; SYS ESTEX_scrwinrest
IFUSED GetXY
GetXY: SYS ESTEX_getcursor
ld (coords),de
ret
ENDIF
IFUSED SetXY
SetXY: ld de,(coords)
SYS ESTEX_setcursor
ret
ENDIF
IFUSED Check_Vmode
;check for enabled TextMode
Check_Vmode: SYS ESTEX_getvmode
jr c,getvmodeErr
.next0: ld (vmode),a ;current vmode
ex af,af
ld a,b
ld (vmode.screen),a ;screen (0 or 1)
ex af,af
cp _VMODE._T80 ;text 80x32 mode?
jr nz,.set_t80_mode ;if no, then set it
ret
.set_t80_mode: ld a,_VMODE._T80
ld b,0
SYS ESTEX_setvmode
jp c,setvmodeErr
ret
ENDIF
IFUSED Return_Vmode
Return_Vmode: ld a,(vmode)
cp _VMODE._T80
ret z
ex af,af
ld a,(vmode.screen)
ld b,a
ex af,af
SYS ESTEX_setvmode
jp c,setvmodeErr
ret
ENDIF
IFUSED getvmodeErr
getvmodeErr: PrintChars errGetvmodeMsg
ld b,-1
jp quit0
ENDIF
IFUSED setvmodeErr
setvmodeErr: PrintChars errSetvmodeMsg
ld b,-20
jp quit0
ENDIF
IFUSED vmode
vmode: db 0
.screen: db 0
ENDIF
;-------------------------------------------------------------
IFUSED errGetvmodeMsg
errGetvmodeMsg: db cr,lf
db "ERROR: Failed to get video mode!",cr,lf
db cr,lf,0
ENDIF
IFUSED errSetvmodeMsg
errSetvmodeMsg: db cr,lf
db "ERROR: Failed to set video mode!",cr,lf
db cr,lf,0
ENDIF
;-------------------------------------------------------------

848
format/format.asm Executable file
View File

@ -0,0 +1,848 @@
;ÚÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¿
;³ FORMAT - Disk Format Utility for Sprinter ³
;³ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ³
;³ by Sayman 2021 ³
;ÀÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÙ
DEVICE ZXSPECTRUM128
Start_addr = 0x8100
INCLUDE "include/estex_h.asm"
INCLUDE "include/head_short.inc"
INCLUDE "include/macro.s"
INCLUDE "build.inc"
LoaderStart: JP main
;===================================================
INCLUDE "console.asm"
INCLUDE "printf.asm"
INCLUDE "muldiv.asm"
;===================================================
;[]=========================================================================[]
;[] Converting latin symbols a...z to upper registry []
;[] IN: A - symbol for convert []
;[] OUT: A - converted symbol []
;[]=========================================================================[]
CapsLetter: CP "a" ;<"a"
JR C,.not_lat
CP "z"+1 ;>"z"
JR NC,.not_lat
AND %11011111 ;set D5 for upper registry
RET
.not_lat: AND A
SCF
RET
;===================================================
main: DI
PUSH IX
LD A,(ix-3)
SYS ESTEX_fclose
CALL Check_Vmode ;check text mode and (if not) set it
CALL GetXY
LD DE,about_Msg.ptr
CALL cPrint
POP HL
CALL ParseCL
CALL confirmation
LD DE,Process_Msg.ptr
CALL cPrint
CALL prepare
JR NC,.ok_drive
;
LD A,"\a" ; bell
SYS ESTEX_pchar
LD DE,ProcessErr_Msg.ptr
CALL cPrint
LD B,#0D ;.UNKNOWN_FORMAT
JP quit0
;
.ok_drive: CALL calc_bpb
CALL gen_serial
LD BC,0x0105 ;read 1 sector
LD HL,0
LD IX,0
LD A,(FMTDISK)
LD DE,buff
RST 0x18 ;get start sector via read (drv)
LD D,IXH ;this function return next sector
LD E,IXL
LD A,D
OR E
JR NZ,.next0
DEC HL
.next0: DEC DE ;and correct it (-1)
LD (BPB.hide_sectors+2),HL ;!FIXIT çñ ¯à®¨á室¨â?
LD (BPB.hide_sectors),DE
LD HL,buff
PUSH HL
LD DE,buff+1
LD BC,512
XOR A
LD (HL),A
LDIR
SYS ESTEX_getver
PUSH DE
LD A,D
LD DE,BPB.OEM+4
CALL ConvNumTxt8
POP DE
LD A,E
LD DE,BPB.OEM+6
CALL ConvNumTxt8
;write boot sector, init first FAT sector, write it
;clear buff (zeroed), write other FAT sectors
;repeat for FAT copy
;write zeroed ROOT directory
LD IX,0
LD HL,0 ;boot sector
LD A,(FMTDISK)
LD BC,0x0106 ;save boot sector
LD DE,BPB
RST 0x18
CALL init_fat
LD IX,(BPB.reserved_secs)
LD HL,0
PUSH IX
PUSH HL
CALL wr_fat0 ;write first sector of FAT
CALL clear_buff
POP HL
POP IX
INC IX ;next FAT sector
CALL wr_fat1 ;write other FAT sectors
CALL init_fat
LD IX,(BPB.reserved_secs) ;low bits
LD DE,(BPB.fat_sectors)
ADD IX,DE
LD HL,0
PUSH HL
PUSH IX
CALL wr_fat0
CALL clear_buff
POP IX
POP HL
PUSH HL
PUSH IX
INC IX
CALL wr_fat1
POP IX
POP HL
LD DE,(BPB.fat_sectors)
ADD IX,DE
LD A,(BPB.root_handles)
LD B,A
CALL wr_fat1.loop0
LD DE,ProcessOK_Msg.ptr
CALL cPrint
CALL showInfo
; CALL Return_Vmode
; XOR A
LD B,0
JP quit0
wr_fat0: LD A,(FMTDISK)
LD BC,0x0106 ;save FAT sector
LD DE,buff
RST 0x18 ;next sector not returned!!!
RET
wr_fat1: LD A,(BPB.fat_sectors)
LD B,A
DEC B ;-first FAT sector
.loop0: PUSH BC
PUSH HL
PUSH IX
LD BC,0x0106
LD A,(FMTDISK)
LD DE,buff
RST 0x18
POP IX
POP HL
POP BC
INC IX ;next sector (low)
DJNZ .loop0
RET
init_fat: LD HL,buff
LD (HL),0xf8 ;init FAT
INC HL
LD (HL),0xff ;first 2 reserved clusters
INC HL
LD (HL),0xff
INC HL
LD A,(fat12_flg)
RET NZ
LD (HL),0xff ;0xfff8, 0xffff for FAT16
RET
clear_buff: LD HL,buff
LD DE,buff+1
LD BC,512
XOR A
LD (HL),A
LDIR
RET
showInfo: LD HL,(sectors+2)
LD DE,(sectors)
PUSH HL
PUSH DE
LD (DskInfo_Msg.sectors),DE
LD (DskInfo_Msg.sectors+2),HL
LD A,(BPB.cluster_size)
RRA
LD B,0
LD C,A
JR NC,.next0
LD BC,512
LD A,"B"
LD (DskInfo_Msg.u_sym),A
.next0: LD (DskInfo_Msg.u_size),BC
POP DE
POP HL
LD C,E ;/256
LD E,D
LD D,L
LD H,0
LD B,H
SRL D ;/8
RR E
SRL D
RR E
SRL D
RR E
LD (DskInfo_Msg.mb),DE
LD HL,(BPB.serial_id)
LD DE,(BPB.serial_id+2)
LD (DskInfo_Msg.serial),DE
LD (DskInfo_Msg.serial+2),HL
LD A,(fat12_flg)
OR A
JR Z,.next1
LD A,"2"
LD (DskInfo_Msg.FS+20),A
.next1: LD DE,DskInfo_Msg.ptr
CALL cPrint
;bugfix with last printed line with colors
;scrolling in console set color column...
CALL GetXY ;get YX in DE
LD HL,0x0150
LD B,D
LD C,E
CALL winClearScr
RET
;===================================================
;need to get the size of the disk in sectors and check for FAT12 limitation
prepare: LD A,(FMTDISK)
;
CP 2
JR NC,.begin
;
PUSH AF
SYS ESTEX_diskinfo
JP C,Usage
POP AF
;
.begin: LD BC,0x0008 ;B = subcommand, C = IOCTL func.
LD DE,0x55aa ;IOCTL requires Magic num
RST 0x18 ;HLDE = disk size in sectors
;
LD (cfg),A
EX AF,AF
AND #F0
LD (BPB.drv_code),A
; EX AF,AF
; LD A,H
; OR L
CALL testDskSize
; CF = 0, ­®à¬ «ì­®¥ § ¢¥à襭¨¥
; CF = 1, ®è¨¡ª 
;
EXX
LD (BPB.sec_per_trk),BC
LD (BPB.heads),DE
EXX
RET
;calculate boot sector (BPB) parameters
calc_bpb: LD DE,(BPB.root_handles)
LD B,5
.loop0: RL D
RL E
DJNZ .loop0 ;root_size (256) * 32 (element size)
LD HL,0
CALL div512 ;root_size/512 (sector size)
LD (rootSectors),DE ;root size in sectors
LD HL,(sectors)
LD DE,(sectors+2)
LD BC,(BPB.reserved_secs)
SBC HL,BC
EX DE,HL
LD BC,0
SBC HL,BC
LD BC,(clusters)
PUSH HL
PUSH DE
CALL div32 ;(sectors-reserved_sectors) / max_clusters
AND A ;clear flags
LD BC,0x0780 ;max 64 sectors for cluster
LD A,E
.loop1: RLC C ;128 sectors (64kb) not supported
CP C
JR C,.next_calc0
DJNZ .loop1
.next_calc0: LD A,C
LD (BPB.cluster_size),A ;cluster size in sectors
POP DE
POP HL
LD B,0
CALL div32
PUSH DE
LD DE,(BPB.reserved_secs)
ADD HL,DE ;+reserverd sectors
LD (BPB.reserved_secs),HL
POP DE
LD A,(fat12_flg)
OR A
JR Z,.calc_fat16
LD H,D
LD L,E
ADD HL,HL
ADD HL,DE ;*3
SRL H
RR L ;/2
EX DE,HL
LD HL,0
JR .next_calc1
.calc_fat16: LD HL,0
RL E
RL D
RL L
RL H
.next_calc1: CALL div512
LD A,B
OR C
JR Z,.next_calc2
INC DE
.next_calc2: LD (BPB.fat_sectors),DE
EX DE,HL
ADD HL,HL
LD B,H
LD C,L
EX DE,HL
LD HL,(sectors)
LD DE,(sectors+2)
SBC HL,BC
EX DE,HL
LD BC,0
SBC HL,BC
EX DE,HL
LD BC,(BPB.reserved_secs)
SBC HL,BC
EX DE,HL
LD BC,0
SBC HL,BC
EX DE,HL
LD BC,(rootSectors)
SBC HL,BC
LD BC,0
EX DE,HL
SBC HL,BC
LD A,(BPB.cluster_size)
LD B,0
LD C,A
CALL div32
LD (DskInfo_Msg.units),DE
LD DE,(BPB.reserved_secs)
ADD HL,DE
LD (BPB.reserved_secs),HL
RET
testDskSize: ;EX AF,AF
LD A,H
OR L
LD (sectors),DE
LD (sectors+2),HL ;save temporary sectors
JR NZ,.bigdsk
;
PUSH HL
.tstsmall: LD BC,0xf800+1 ;else, check for fat16 <32M
LD H,D ;save in DE small sectors
LD L,E
SBC HL,BC
POP HL
JR NC,.bigdsk ;>32M (set Flag)
LD BC,0x7800+1 ;else check for limit for fat12
EX DE,HL ;15M
LD (BPB.small_sectors),HL
SBC HL,BC
RET NC ;>15M
XOR A
INC A
LD (fat12_flg),A
LD A,'2'
LD (BPB.fat_id+4),A
LD BC,0x0fef
LD (clusters),BC
RET
;
.bigdsk: ;EX AF,AF
;LD (BigDskFlg),A
LD (BPB.big_sectors),DE
LD (BPB.big_sectors+2),HL
; check max size for fat16 #3FFD00 sectors (512b) 4ÿ193ÿ152 + 512 + 1+16? ; PC - 7F600000 The FAT file system is limited to 65,525 clusters
/*
The FAT file system is limited to 65,525 clusters - 0x3FFD40 sectors
FAT TABLES SIZE: 131ÿ072 x 2 = 262 144 = #200
ROOT DIR SIZE: 8 192 #10
RESERVED SECTORS SIZE: 5 x 512 = 2 560 5
HIDDEN SECTORS SIZE
*/
LD BC,#FD00 + 1
EX DE,HL
SBC HL,BC
EX DE,HL
LD BC,#003F
SBC HL,BC
CCF
RET
; ‚ë室­ë¥ §­ ç¥­¨ï:
; D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; C - ¤¥­ì ­¥¤¥«¨
gen_serial: ld c,#21 ;!HARDCODE Dss.SysTime
rst #10 ;!HARDCODE ToDSS
;
ex de,hl
add ix,de
ld (BPB.serial_id + 2),ix
;
ld a,d
ld d,b
xor c
.loop: rra
djnz .loop
;
ld e,h
ld h,l
ld l,e
;
ld e,a
add hl,de
; ld e,l
; ld l,h
; ld h,e
ld (BPB.serial_id),hl
ret
; gen_serial: CALL Randomize
; CALL GetRnd
; LD (BPB.serial_id),A ;first 8bit (2 bits sec. 6 bits min.)
; LD L,A
; CALL GetRnd
; LD H,A
; PUSH HL
; .year: LD L,0
; LD A,R
; RRA
; XOR L
; LD (BPB.serial_id+1),A
; CALL Rand16
; POP BC
; ADD HL,BC
; LD (BPB.serial_id+2),HL
; RET
; ;<Vadim> from PQ-DOS formatter
; Randomize: SYS ESTEX_systime_get
; LD A,B ;seconds
; LD (rand1),A
; LD A,L ;minutes
; LD (rand2),A
; LD A,IXL
; LD (gen_serial.year+1),A
; LD A,R
; RRA
; LD (rand3),A
; CALL GetRnd
; LD L,A
; CALL GetRnd
; LD H,A
; LD (seed),HL
; RET
; GetRnd: LD A,(rand1)
; LD D,A
; LD A,(rand2)
; LD (rand1),A
; ADD A,D
; LD D,A
; LD A,(rand3)
; LD (rand2),A
; ADD A,D
; RRCA
; LD (rand3),A
; RET
; Rand16: LD DE,(seed) ;Seed is usually 0
; LD A,D
; LD H,E
; LD L,253
; OR A
; SBC HL,DE
; SBC A,0
; SBC HL,DE
; LD D,0
; SBC A,D
; LD E,A
; SBC HL,DE
; JR NC,Rand
; INC HL
; Rand: LD (Rand16+1),HL
; RET
; ;</Vadim>
ParseCL: LD A,(HL) ;cmd line size
OR A ;0 = no params
JP Z,Usage ;goto help message
INC HL
INC HL ;first param
LD A,(HL)
LD C,A
INC HL
LD A,(HL)
CP ':' ;must be dsk: (like C:)
JP NZ,Usage ;if not, goto help message
LD A,C
CALL CapsLetter
JP C,Usage ;drive letter is not a letter
LD (warn_Msg.dsk),A ;store it in messages
LD (Process_Msg.dsk),A ;*
LD (ProcessErr_Msg.dsk),A ;*
SUB 'A'
;
.set_A: LD (FMTDISK),A
.loop_x: INC HL
LD A,(HL)
OR A
RET Z
CP space
JR NZ,.loop_x
.loop1: CP "/"
JR Z,.next0
CP "-"
JR Z,.next0
JP Usage
.next0: INC HL
LD A,(HL)
CP "?"
JP Z,Usage
POP HL
JP Usage
confirmation: CALL GetXY
LD DE,warn_Msg.ptr
CALL cPrint
EI
HALT
SYS ESTEX_waitkey
DI
RES 5,A
CP "Y"
LD B,0 ;.NO_ERROR
JP NZ,quit0 ;exit to DOS
CALL PrintLF
RET
PrintLF: PrintChar cr
PrintChar lf
RET
;---------------
;from FN
;Convert 8bit num to text
;IN:
; A - 8 bit num
; DE - buffer
;---------------
ConvNumTxt8: PUSH IX
PUSH BC
LD IX,ConvertFlg
RES 7,(IX+#00)
LD C,100
CALL ConNumb8
LD C,10
CALL ConNumb8
ADD A,"0"
LD (DE),A
INC DE
POP BC
POP IX
RET
ConNumb8: LD B,#2F
INC B
SUB C
JR NC,$-2
ADD A,C
EX AF,AF'
LD A,B
CP #30
JR Z,$+6
SET 7,(IX+#00)
BIT 7,(IX+#00)
JR Z,$+4
LD (DE),A
INC DE
EX AF,AF'
RET
ConvertFlg: DB #0
;-------------------------------------------------------------------------------
badClustErr: PrintChars badClust_Msg
;LD B,-2
LD B,#0D ; .UNKNOWN_FORMAT
JR quit0
Usage: LD DE,usage_Msg.ptr
CALL cPrint
; PrintChars usage_Msg
LD B,0
quit0: PUSH BC
CALL Return_Vmode
POP BC
SYS ESTEX_exit
JP $
;===================================================
FMTDISK: DB 0 ;formatting disk
BigDskFlg: DB 0 ;big disk (>32Mb) flag
cfg: DB 0
rootSectors: DW 0
sectors: DS 4 ;tmp value of sectors on the disk
clusters: DW 0xffef
fat_sectors: DW 0
system_sectors: DW 0
fat12_flg: DB 0
serial: DW 0,0 ;Volume Serial Number
; rand1: DB 0
; rand2: DB 0
; rand3: DB 0
; seed: DB 0
ALIGN 256
BPB:
.JMP: DB 0xeb,0xfe,0x00 ; § é¨â  ®â ¡ ª« ­¨§¬  (§ £à㧪  á í⮣® ¤¨áª  ­  PC ¯à¨¢¥¤¥â ª § ¢¨á ­¨î. JMP $)
.OEM: DB "DSS . "
.sector_size: DW 512 ;+11 ; sector size in bytes
.cluster_size: DB 0 ;+13 ; cluster size in sectors
.reserved_secs: DW 5 ;+14 ; reserved sector
.fat_ncopy: DB 2 ;+16 ; # copy`s of FAT
.root_handles: DW 256 ;+17 ; root size (records on root)
.small_sectors: DW 0 ;+19 ; # of sectors (<32Mb)
.media_id: DB 0xf8 ;+21 ; Media ID
.fat_sectors: DW 0 ;+22 ; # sectors for one copy of FAT
.sec_per_trk: DW 0 ;+24 ; sectors per track
.heads: DW 0 ;+26 ; # of heads
; extended boot-record
.hide_sectors: DWORD 0 ;+28 ; # of hidden sectors
.big_sectors: DWORD 0 ;+32 ; # of sectors (>32Mb)
.drv_code: DW 0x80 ;+36 ; drive code (0x80 for HDD)
.eboot_sig: DB 0x29 ;+38 ; extended boot signature (?)
.serial_id: DS 4 ;+39 ; Volume serial
.vol_name: DB "NO NAME " ;+43 ; Volume label
.fat_id: DB "FAT16 " ;+54 ; FAT id (FAT12 or FAT16)
BPBsize = $-BPB
INCBIN "x86_boot.bin" ; !FIXIT ã¡à âì
/*
about_Msg: db cr,lf,"Format utility version 0.3.",BUILD_COUNT_T," (",BUILD_DAY_T,".",BUILD_MONTH_T,".",BUILD_YEAR_T,")"
db cr,lf,"by Miroshnichenko Alexander aka Sayman@SprinterTeam",cr,lf,0
.ptr: dw about_Msg
*/
;===================================================
about_Msg: DB cr,lf,"Format utility version 0.3.",BUILD_COUNT_T," (",BUILD_DAY_T,".",BUILD_MONTH_T,".",BUILD_YEAR_T,")"
DB cr,lf,"by Miroshnichenko Alexander aka Sayman, (c) 2021.\r\nBug fixes by Anatoliy Belyanskiy, Sprinter Team, 2026.",cr,lf,0
.ptr: DW about_Msg
usage_Msg: DB cr,lf,"This utility performs logical formatting and initializes the file system on the disks."
DB cr,lf,col_cmd,col_red,"WARNING!!!",col_cmd,col_white," This version is limited for ",col_cmd,col_green,"2Gb",col_cmd,col_white," for FAT16 FS!"
DB cr,lf,cr,"usage:"
DB cr,lf,"FORMAT volume [key1] [key2] [keyN]"
DB cr,lf," keys are:"
DB cr,lf,tab,"in this version supported only /? key for help."
DB cr,lf,cr,lf,0
.ptr: DW usage_Msg
warn_Msg: DB cr,lf,cr,lf,col_cmd,col_red,"WARNING: ALL DATA ON YOR HARD DISK DRIVE ",col_cmd,col_violet,"%c:",col_cmd,col_red," WILL BE LOST!",col_cmd,col_white,cr,lf
DB cr,lf,"Proceed with Format [Y/N]?",0
.ptr: DW warn_Msg
.dsk: DB 0
Process_Msg: DB cr,lf
DB cr,lf,"Quick formatting disk %c:...",0
.ptr: DW Process_Msg
.dsk: DB 0
ProcessErr_Msg: DB cr,lf,cr,lf,col_cmd,col_red,"ABORTED: CAN'T FORMAT DRIVE ",col_cmd,col_violet,"%c:",cr,lf,col_cmd,col_yellow,"FAT16 does not support drives larger than 2GB.",cr,lf,cr,lf,0
.ptr: DW ProcessErr_Msg
.dsk: DB 0
ProcessOK_Msg: DB "Done.",cr,lf,cr,lf,0
.ptr: DW ProcessOK_Msg
DskInfo_Msg: DB "Formatted disk parameters:",cr,lf
DB "Total sectors: ",tab,col_cmd,col_magenta,"%lu",col_cmd,col_white,cr,lf
DB "Total size: ",tab,col_cmd,col_magenta,"%uMb",col_cmd,col_white,cr,lf
DB "Units: ",tab,tab,col_cmd,col_magenta,"%u",col_cmd,col_white,cr,lf
DB "Unit size: ",tab,col_cmd,col_magenta,"%u%c",col_cmd,col_white,cr,lf
.FS: DB "File system: ",tab,col_cmd,col_magenta,"FAT16",col_cmd,col_white,cr,lf
DB "Serial: ",tab,col_cmd,col_magenta,"%02x-%02x",col_cmd,col_white,cr,lf
DB "Label: ",tab,tab,col_cmd,col_magenta,"NO LABEL",col_cmd,col_white,cr,lf,cr,lf,0
.ptr: DW DskInfo_Msg
.sectors: DS 4
.mb: DW 0
.units: DW 0
.u_size: DW 0
.u_sym: DB "K",0
.serial: DS 4
badClust_Msg: DB cr,lf,"Bad cluster size.",cr,lf,cr,lf,0
;WARNING: ALL DATA ON YOR HARD DISK DRIVE Z: WILL BE LOST!
buff EQU ( high $ + ((low $)<?1) ) * 256
; ALIGN 256
; buff:
; equ ($/80h)*80h+80h
DISPLAY "programm size: ",$-EXEHeader
Loader_End:
DISPLAY "last address: ",$
; SAVEBIN "format.exe",EXEHeader,$-EXEHeader
IFUSED FAT32_FORMAT
/*
BOOT_SECTOR EQU #00
.JMP EQU #00 ; BLOCK 3,0 BS_jmpBoot Jump to bootstrap (E.g. eb 3c 90; on i86: JMP 003E NOP. One finds either eb xx 90, or e9 xx xx.
.ID_NAME EQU #03 ; TEXT 8 BS_OEMName DOS NAME - DB "DSS_1.70"
; Block Parameters BIOS
.BytesPerSector DRV_GET_PAR (IX) EQU #0B ; WORD #200 BPB_BytsPerSec <09> §¬¥à ᥪâ®à  ¢ ¡ ©â å
.SectorsPerCluster ;!TODO EQU #0D ; BYTE 2 BPB_SecPerClus <09> §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
.RESERVED_SECTORS ;!TODO EQU #0E ; WORD 1 BPB_ResvdSecCnt <09> §¬¥à á¨á⥬­®© ®¡« á⨠(¢ª«îç ï íâ®â ᥪâ®à) RESERVE SECTORS
.Number_of_FATs ;!TODO EQU #10 ; BYTE 2 BPB_NumFATs Š®«¨ç¥á⢮ â ¡«¨æ FAT
.FilesInRootDIR 0 EQU #11 ; WORD 112 BPB_RootEntCnt —¨á«® ®¯¨á â¥«¥© ä ©«®¢ ¢ ª®à­¥¢®¬ ª â «®£¥ (¢ FAT32 - 0)
.SectorsPerDrive ;!TODO EQU #13 ; WORD 1440 BPB_TotSec16 ޡ饥 ç¨á«® ᥪâ®à®¢ ­  ¤¨áª¥ (¥á«¨ 0, â® à §¬¥à - ¢ .BPB_BIG_TOTAL_SECTORS)
.DRIVE_TYPE !DRV_TYPE EQU #15 ; BYTE #F0 BPB_Media ’¨¯ ãáâனá⢠
.SectorsPerFAT16 0 EQU #16 ; WORD 2 BPB_FATSz16 <09> §¬¥à ®¤­®© FAT ¢ ᥪâ®à å (0 ¢ FAT32)
.SectorsPerTrack GenIOCTL.GetParams EQU #18 ; WORD 9 BPB_SecPerTrk <09> §¬¥à ¤®à®¦ª¨ ¢ ᥪâ®à å
.HEADS GenIOCTL.GetParams EQU #1A ; WORD 2 BPB_NumHeads ª®«¨ç¥á⢮ £®«®¢®ª
.HIDDEN EQU #1C ; DWORD 0 BPB_HiddSec ª®«¨ç¥á⢮ áªàëâëå ᥪâ®à®¢
.BPB_BIG_TOTAL_SECTORS_L EQU #20 ; WORD 0 BPB_TotSec32 BIG TOTAL SECTOR Low word
.BPB_BIG_TOTAL_SECTORS_H EQU #22 ; WORD 0 BPB_TotSec32 BIG TOTAL SECTOR High word
; FAT 32
.SectorsPerFAT32 EQU #24 ; DWORD 4 BPB_FATSz32 <09> §¬¥à ®¤­®© FAT ¢ ᥪâ®à å
.MainFATnumber EQU #28 ; WORD 0 BPB_ExtFlags <09>®¬¥à £« ¢­®© â ¡«¨æë FAT
.Version EQU #2A ; WORD 0 BPB_FSVer ‚¥àá¨ï FAT32 (®¡ëç­® 0)
.RootDirStartCluster EQU #2C ; DWORD 2 BPB_RootClus <09>¥à¢ë© ª« áâ¥à ª®à­¥¢®£® ª â «®£  (®¡ëç­® 2)
.FSINFO_Sector EQU #30 ; WORD 1 BPB_FSInfo <09>®¬¥à ᥪâ®à  áâàãªâãàë FSINFO (®¡ëç­® 1)
.CopyBootSector EQU #32 ; WORD 6 BPB_BkBootSec <09>®¬¥à ᥪâ®à  - ª®¯¨¨ § £à㧮筮£® (®¡ëç­® 6)
.reserved_block: EQU #34 ; BLOCK 12 BPB_Reserved ‡ à¥§¥à¢¨à®¢ ­®
.FDD_Number EQU #40 ; BYTE 0 BS_DrvNum <09>®¬¥à ¤¨áª®¢®¤  ¤«ï ä㭪権 BIOS
.reserved_2: EQU #41 ; BYTE 0 BS_Reserved1 ‡ à¥§¥à¢¨à®¢ ­®
.FAT32.EXT_BOOT_REC_SIGNATURE EQU #42 ; BYTE #29 BS_BootSig ‘¨£­ âãà  - #29
.FAT32.SERIAL_NUMBER EQU #43 ; DWORD 0 BS_VolID VOLUME SERIAL NUMBER
.FAT32.LABEL EQU #47 ; TEXT 11 BS_VolLab Œ¥âª  ¤¨áª 
.ID_FAT32 EQU #52 ; TEXT 8 BS_FilSysType €¡¡à¥¢¨ âãà  ä ©«®¢®© á¨á⥬ë
.BOOT_CODE_FAT32 EQU #5A
------------------------------------------------------------------------
!DRV_TYPE: GenIOCTL.GetParams - 䨧¨ç¥áª¨© ­®¬¥à
0,1 - BIOS.DRV_GET_PAR - ⨯ ä«®¯ àï
#8x - Hard Drive
®áâ «ì­®¥ ¯®¤ã¬ âì
;;;;;;;;
*/
ENDIF

236
format/include/estex_h.asm Executable file
View File

@ -0,0 +1,236 @@
;------------------------------
;Estex DOS system api codes
;!!!‚ᥠ­®¬¥à  äã­ªæ¨ï ¯¥à¥¤ îâáï ç¥à¥§ ॣ¨áâà C!!!
;!!!…᫨ ­®¬¥à ä㭪樨 ¯¥à¥¤ ñâáï ¨­ ç¥, ®¡ í⮬ ¡ã¤¥â á®®¡é¥­® ¢ ®¯¨á ­¨¨!!!
;------------------------------
ESTEX_getver = 0x00 ;¯®«ãç¨âì ¢¥àá¨î ¤®á 
ESTEX_chdisk = 0x01 ;ᬥ­  ⥪ã饣® ¤¨áª 
ESTEX_curdisk = 0x02 ;¯®«ãç¨âì ⥪ã騩 ¤¨áª
ESTEX_diskinfo = 0x03 ;¨­ä  ® ¤¨áª¥
ESTEX_DEVRESCAN = 0x08 ;¯¥à¥áª ­¨à®¢ âì ¢á¥ ¤¥¢ ©áë (¤¨áª¨).
ESTEX_bootdisk = 0x09 ;¯®«ãç¨âì ¨«¨ ãáâ ­®¢¨âì á¨á⥬­ë© ¤¨áª
ESTEX_fcreate = 0x0a ;á®§¤ âì ä ©« (á ®¡­ã«¥­¨¥¬ áâ à®£®)
ESTEX_fcreate_new = 0x0b ;á®§¤ âì ä ©« (á ®è¨¡ª®© ¥á«¨ áâ àë© ä ©« ¥áâì)
ESTEX_fdelete = 0x0e ;㤠«¨âì ä ©«
ESTEX_frename = 0x10 ;¯¥à¥¨¬¥­®¢ âì ä ©«
ESTEX_fopen = 0x11 ;®âªàëâì ä ©«
ESTEX_fclose = 0x12 ;§ ªàëâì ä ©«
ESTEX_fread = 0x13 ;¯à®ç¨â âì ¤ ­­ë¥ ¨§ ä ©« 
ESTEX_fwrite = 0x14 ;§ ¯¨á âì ¢ ä ©«
EXTEX_fmovefp = 0x15 ;¯¥à¥¬¥áâ¨âì 㪠§ â¥«ì ¢ ä ©«¥
ESTEX_fattribute = 0x16 ;¯®«ãç¨âì ¨/¨«¨ ¨§¬¥­¨âì  âਡãâë
ESTEX_fget_dt = 0x17 ;¯®«ãç¨âì ¤ âã ä ©« 
ESTEX_fset_dt = 0x18 ;ãáâ ­®¢¨âì ¤ âã ä ©« 
ESTEX_find_first = 0x19 ;¯®¨áª ¯¥à¢®£®...
ESTEX_find_next = 0x1a ;¯®¨áª á«¥¤ãî饣®
ESTEX_mkdir = 0x1b ;á®§¤ âì ª â «®£
ESTEX_rmdir = 0x1c ;㤠«¨âì ª â «®£
ESTEX_chdir = 0x1d ;ᬥ­¨âì ª â «®£
ESTEX_curdir = 0x1e ;¯®«ãç¨âì ⥪ã騩 ª â «®£
ESTEX_systime_get = 0x21 ;¯®«ãç¨âì á¨á⥬­®¥ ¢à¥¬ï
ESTEX_systime_set = 0x22 ;ãáâ ­®¢¨âì á¨á⥬­®¥ ¢à¥¬ï
ESTEX_setmemwin = 0x38 ;<3B>®¤ª«î祭¨¥ áâà ­¨æë ¯ ¬ïâ¨
ESTEX_setmemwin1 = 0x39 ;<3B>®¤ª«î祭¨¥ áâà ­¨æë ¯ ¬ï⨠¢ 1 ®ª­®
ESTEX_setmemwin2 = 0x3a ;<3B>®¤ª«î祭¨¥ áâà ­¨æë ¯ ¬ï⨠¢ 2 ®ª­®
ESTEX_setmemwin3 = 0x3b ;<3B>®¤ª«î祭¨¥ áâà ­¨æë ¯ ¬ï⨠¢ 3 ®ª­®
ESTEX_getmeminfo = 0x3c ;<3B>®«ãç¨âì ¨­ä®à¬ æ¨î ® ¯ ¬ïâ¨
ESTEX_getmem = 0x3d ;‡ ¯à®á¨âì (¯®«ãç¨âì) ¡«®ª ¯ ¬ïâ¨
ESTEX_freemem = 0x3e ;Žá¢®¡®¤¨âì ¡«®ª ¯ ¬ïâ¨
ESTEX_setmem = 0x3a ;ˆ§¬¥­¨âì ¡«®ª ¯ ¬ïâ¨
ESTEX_waitkey = 0x30 ;ަ¨¤ ­¨¥ ᨬ¢®«  á ª« ¢¨ âãàë
ESTEX_scankey = 0x31 ;ޝà®á ª« ¢¨ âãàë ¡¥§ ®¦¨¤ ­¨ï
ESTEX_echokey = 0x32 ;ަ¨¤ ­¨¥ ᨬ¢®«  á ª« ¢¨ âãàë á ¯¥ç âìî
ESTEX_keystat = 0x33 ;<3B>®«ãç¨âì á®áâ®ï­¨¥ ª« ¢¨ âãàë
ESTEX_clearkey = 0x35 ;Žç¨áâ¨âì ¡ãä¥à ª« ¢¨ âãàë ¨ ¢ë¯®«­¨âì äã­ªæ¨î
ESTEX_keyset = 0x36 ;“¯à ¢«¥­¨¥ ­ áâனª ¬¨ ª« ¢¨ âãàë
ESTEX_testkey = 0x37 ;ޝà®á ¡ãä¥à  ª« ¢¨ âãàë
ESTEX_exec = 0x40 ;‚믮«­¨âì ä ©«
ESTEX_exit = 0x41 ;‡ ¢¥à襭¨¥ ¯à®£à ¬¬ë
ESTEX_wait = 0x42 ;<3B>®«ãç¨âì ª®¤ § ¢¥à襭¨ï ¯à®£à ¬¬ë
ESTEX_cmd_getswitch = 0x43 ;‚뤥«¨âì ¯ à ¬¥âà ª®¬ ­¤­®© áâப¨
ESTEX_cmd_dosname = 0x44 ;<3B>८¡à §®¢ âì ¨¬ï ä ©« 
ESTEX_cmd_parse = 0x45 ;<3B> §¡®à ª®¬ ­¤­®© áâப¨
ESTEX_env = 0x46 ;‘¨á⥬­®¥ ®ªà㦥­¨¥
ESTEX_appinfo = 0x47 ;<3B>®«ã祭¨¥ ¨­ä®à¬ æ¨¨ ¯à¨«®¦¥­¨ï
ESTEX_setvmode = 0x50 ;‚ë¡®à ०¨¬  íªà ­ 
ESTEX_getvmode = 0x51 ;<3B>®«ãç¨âì ⥪ã騩 ०¨¬ íªà ­ 
ESTEX_setcursor = 0x52 ;“áâ ­®¢¨âì ¯®§¨æ¨î ªãàá®à 
ESTEX_getcursor = 0x53 ;<3B>®«ãç¨âì ⥪ãéãî ¯®§¨æ¨î ªãàá®à 
ESTEX_setscr = 0x54 ;‚ë¡à âì  ªâ¨¢­ãî áâà ­¨æã íªà ­ 
ESTEX_scrollscr = 0x55 ;<3B>பàã⪠ ®ª­ 
ESTEX_clearscr = 0x56 ;Žç¨á⪠ ®ª­ 
ESTEX_rdchar = 0x57 ;‘ç¨â âì ᨬ¢®« á íªà ­ 
ESTEX_wrchar = 0x58 ;<3B> ¯¥ç â âì ᨬ¢®« ­  íªà ­¥
ESTEX_scrwincopy = 0x59 ;‡ ¯®¬­¨âì ®ª­® íªà ­ 
ESTEX_scrwinrest = 0x5a ;‚®ááâ ­®¢¨âì ®ª­® íªà ­ 
ESTEX_pchar = 0x5b ;<3B> ¯¥ç â âì ᨬ¢®« ¢ ⥪ã饩 ¯®§¨æ¨¨ ªãàá®à 
ESTEX_pchars = 0x5c ;<3B> ¯¥ç â âì áâபã ᨬ¢®«®¢ ¢ ⥪ã饩 ¯®§¨æ¨¨ ªãàá®à 
;-------------------------------------------
_ENVIRONMENT:
._GET_SYS = 0 ;¯®«ãç¨âì á¨á⥬­®¥ ®ªà㦥­¨¥
._GET_VAL = 1 ;¯®«ãç¨âì ¯ à ¬¥âàë 㪠§ ­­®© ¯¥à¥¬¥­­®©
._SET_ENV = 2 ;ãáâ ­®¢¨âì ¯¥à¥¬¥­­ãî
;-------------------------------------------
_CMD_PARSE:
._PARSE_CMD = 0 ;<3B> §®¡à âì áâபã
._GET_DSK = 1 ;‚뤥«¨âì ¨¬ï ¤¨áª 
._GET_DIR = 2 ;‚뤥«¨âì ¤¨à¥ªâ®à¨î
._GET_FILENAME = 3 ;‚뤥«¨âì ¨¬ï ä ©« 
._GET_FILE_EXT = 4 ;‚뤥«¨âì à áè¨à¥­¨¥ ä ©« 
._GET_FULL_FILEPATH = 5 ;‚뤥«¨âì ¨¬ï ¤¨áª , ¯ãâì ª ä ©«ã, ¨¬ï ä ©«  ¨ à áè¨à¥­¨¥ ä ©« 
._NOFUNC = 6 ;‡ à¥§¥à¢¨à®¢ ­ 
._SELECT_ARG = 7 ;‚뤥«¨âì ¯ à ¬¥âà ª®¬ ­¤­®© áâப¨
._CONV_TO_DOS = 8 ;<3B>८¡à §®¢ âì ¨§ 11 ᨬ¢®«ì­®£® ä®à¬ â  ¢ ä®à¬ â „Ž‘
._CONF_FROM_DOS = 9 ;<3B>८¡à §®¢ âì ¨§ ä®à¬ â  „Ž‘ ¢ 11 ᨬ¢®«ì­ë© ä®à¬ â
;--------------------------------------------
_FOPEN:
._IORW = 0 ;®âªàëâì ¤«ï ç⥭¨ï ¨ § ¯¨á¨
._IOREAD = 1 ;®âªàëâì ⮫쪮 ¤«ï ç⥭¨ï
._IOWRITE = 2 ;®âªàëâì ¤«ï § ¯¨á¨
;--------------------------------------------
_MOVEFP:
._SEEK_SET = 0 ;®â ­ ç «  ä ©« 
._SEEK_CUR = 1 ;®â ⥪ã饣® §­ ç¥­¨ï 㪠§ â¥«ï
._SEEK_END = 2 ;®â ª®­æ  ä ©« 
_VMODE:
._T40 = 0x02 ;⥪áâ®¢ë© à¥¦¨¬ 40 ᨬ¢®«®¢
._T80 = 0x03 ;⥪â®á¢ë© ०¨¬ 80 ᨬ¢®«®
._320p = 0x81 ;£à ä¨ç¥áª¨© ०¨¬ 320*256*8¡¨â
._640p = 0x81 ;£à ä¨ç¥áª¨© ०¨¬ 640*256*4¡¨â
._SCREEN0 = 0x0 ;áâà ­¨æ  ०¨¬  0
._SCREEN1 = 0x01 ;áâà ­¨æ  ०¨¬  1
._normal = 0x50 ;०¨¬ ¢ë¢®¤  - ®¡ëç­ë© (¢á¥ ¤ ­­ë¥ ¢ RAM ¨ VRAM)
._transparent = 00001000b ;०¨¬ ¢ë¢®¤  á ¯à®§à ç­ë¬ 梥⮬ (0xff ¨£­®à¨àã¥âáï)
._spr = 00000100b ;०¨¬ á¯à ©â  (¤ ­­ë¥ ¯®¯ ¤ îâ ⮫쪮 ¢ VRAM)
;--------------------------------------------
mmu0 = 0x82 ;cpu window 0 = addr 0x0000
mmu1 = 0xa2 ;... 1 = 0x4000
mmu2 = 0xc2 ;... 2 = 0x8000
mmu3 = 0xe2 ;... 3 = 0xc000
port_y = 0x89 ;port for Y coord
rgmod = 0xc9 ;¯¥à¥ª«îç ¥â áâà ­¨æë ०¨¬ 
border = 0xfe ;¡®à¤îà
rgscr = 0xe9
rgacc = 0xa9
;sys_port3c equ 3ch
;sys_port7c equ 7ch
sys_port_on = 0x7c
sys_port_off = 0x3c
d_tbon = 3 ; ¤ ­­ë¥ ¤«ï ¢ª«î祭¨ï turbo
d_tboff = 2 ; ¤ ­­ë¥ ¤«ï ¢ëª«î祭¨ï turbo
d_rom16on = 1
d_rom16off = 0
cnf_page = 0x40 ;§ ¯à¥â ­  § ¯¨áì á!!!
;com port
CTC_CHAN0 = 0x10
CTC:
._CHAN0 = 0x10
._CHAN1 = 0x11
._CHAN2 = 0x12
._CHAN3 = 0x13
SIO:
.DATA_REG_A = 0x18
.CONTROL_A = 0x19
.DATA_REG_B = 0x1a
.CONTROL_B = 0x1b
;lpt port
PIO:
.DATA_REG_A = 0x1c
.COMMAND_REG_A = 0x1d
.DATA_REG_B = 0x1e
.COMMAND_REG_B = 0x1f
;ISA-8
;-------------------------------------------------------------------------------
;If you want to interaction with ISA devices, you have to make following steps:
;1) send 10h value to port 1FFDh(system port);
;2) send control byte to port 0E2h(third memory window port);
;control byte:
;D7...should be 1
;D6...should be 1
;D5...should be 0
;D4...should be 1
;D3...should be 0
;D2...specify access mode (0 - ISA memory, 1 - ISA ports)
;D1...specify number of ISA slot
;D0...should be 0
;fixed bug with D2 and D1 bits (functional exchange, but not documented).
;The read/write signals are forming from read/write signals memory range 0C000h-0FFFFh.
;And the address lines A13...A0 has taken from processor data-BUS.
;The other ISA-signals such as RESET, AEN, A19...A14 can be set in port 9FBDh. And default value is 00h.
;port 9FBDh:
;D7...RESET, 1=reset, 0=normal
;D6...AEN, 1=
;D5...A19
;D4...A18
;D3...A17
;D2...A16
;D1...A15
;D0...A14
sc_port = 0x1ffd
ISA:
.DIR = 0x9fbd
.BASE_ADDR = 0xc000
.SLOT0_RAM = 0xd0
.SLOT1_RAM = 0xd2
.SLOT0_PORT = 0xd4
.SLOT1_PORT = 0xd6
;VMODE:
;._normal = 0x50 ;०¨¬ ¢ë¢®¤  - ®¡ëç­ë© (¢á¥ ¤ ­­ë¥ ¢ RAM ¨ VRAM)
;._transparent = 00001000b ;०¨¬ ¢ë¢®¤  á ¯à®§à ç­ë¬ 梥⮬ (0xff ¨£­®à¨àã¥âáï)
;._spr = 00000100b ;०¨¬ á¯à ©â  (¤ ­­ë¥ ¯®¯ ¤ îâ ⮫쪮 ¢ VRAM)
cr = 0x0d ;¢®§¢à â ª®à¥âª¨
lf = 0x0a ;­®¢ ï áâப 
space = 0x20 ;ᨬ¢®« ¯à®¡¥« 
tab = 0x09 ;ᨬ¢®« â ¡ã«ï樨
;--------------------------------------------
;BIOS
BIOS_reset_drive = 0x51 ; ‘¡à®á ª®­â஫«¥à  ¨ ­ áâனª  ­  ¤¨áª
BIOS_rd_sector = 0x55 ; —⥭¨¥ (ᥪâ®à®¢) á ãáâனá⢠.
BIOS_wr_sector = 0x56 ; ‡ ¯¨áì (ᥪâ®à®¢) ­  ãáâனá⢮.
BIOS_get_drv_list = 0x5f ; ¯®«ãç¨âì ᯨ᮪ ¤¨áª®¢ëå ãáâனáâ¢
BIOS_get_cursor_coords = 0x8e ; <20>®«ãç¨âì ⥪ã饥 ¯®«®¦¥­¨¥ (ªãàá®à ) ¢ë¢®¤  ­  íªà ­.
BIOS_get_mem_pg = 0xc4 ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà. ¡«®ª 
BIOS_get_pg_tbl = 0xc5 ; get pages table from handle (id_blk)
BIOS_clear_scr = 0x8d ; ®ç¨á⪠ íªà ­ , 㪠§ ­¨¥¬ ᨬ¢®«  § ¯®«­¥­¨ï
BIOS_get_cursor = 0x8e ; ã§­ âì ¯®«®¦. ªãàá®à 
BIOS_set_cursor = 0x84 ; ãáâ. ¯®«®¦. ªãàá®à 
BIOS_print_chars = 0x82 ; ¢ë¢®¤ ᨬ¢®«®¢ ­  íªà ­ á ⥪ã饣® §­ ª®¬¥áâ  ¡¥§  âਡã⮢
BIOS_screen_save = 0xb2 ; á®åà ­¨âì íªà ­...
BIOS_screen_restore = 0xb3 ; ¢®ááâ ­®¢¨âì íªà ­...
BIOS_screen_get_char = 0xb4 ; ¯à®ç¨â âì (¢§ïâì) ᨬ¢®« á íªà ­ 
BIOS_screen_set_char = 0xb5 ; ãáâ ­®¢¨âì ᨬ¢®« ­  íªà ­¥
BIOS_screen_move = 0xb7 ; ¯¥à¥¬¥é¥­¨¥ ®ª­  (íªà ­ )

14
format/include/head_short.inc Executable file
View File

@ -0,0 +1,14 @@
org Start_addr - (EXEHeader_end-EXEHeader)
EXEHeader:
db "EXE"
db 1
dw LoaderStart-EXEHeader
dw 0
dw Loader_End-LoaderStart
dw 0,0,0
dw LoaderStart
dw LoaderStart
dw 0xbfff
EXEHeader_end:

59
format/include/macro.s Executable file
View File

@ -0,0 +1,59 @@
;-------------------------------------------------------------------------------
MACRO SYS func
ld c,func
rst 0x10
ENDM
MACRO PrintChars str_data_ptr ;㪠§ â¥«ì ­  áâபã á ᨬ¢®« ¬¨
ld hl,str_data_ptr
SYS ESTEX_pchars
ENDM
MACRO PrintChar char ;ᨬ¢®«
ld a,char
SYS ESTEX_pchar
ENDM
macro BIOS function_code
ld c,function_code
rst 8
endm
;ACCELERATOR
macro ACC_ON
ld d,d
endm
macro ACC_OFF
ld b,b
endm
macro ACC_FILL
ld c,c
endm
macro ACC_FILL_GFX
ld e,e
endm
macro ACC_COPY
ld l,l
endm
macro ACC_COPY_GFX
ld a,a
endm
; macro DSS_OpenFile mode, filename
; ld hl,filename
; ld b,mode
; Estex fopen
; endm
; macro DSS_ReadFile dst, size
; ld hl,dst
; ld de,size
; Estex fread
; endm

22
format/make.bat Executable file
View File

@ -0,0 +1,22 @@
@echo off
if EXIST format.exe (
del format.exe
)
if EXIST format.lst (
del format.lst
)
REM ..\..\asm\build.exe
..\..\asm\sjasmplus.exe format.asm --lst=format.lst
if errorlevel 1 goto ERR
echo Ok!
goto END
:ERR
del format.exe
del format.lst
pause
echo ERROR...
goto END
:END

51
format/muldiv.asm Executable file
View File

@ -0,0 +1,51 @@
;-------------------------------------------------------------------------------
; DE = HLDE/BC, HL = HLDE%BC
;1456t
div32:
ld a,10h
.div321: sla e
rl d
adc hl,hl
jr c, .div322
sbc hl,bc
jr nc, .div323
add hl,bc
dec a
jr nz, .div321
ret
.div322: ccf
sbc hl,bc
.div323: inc de
dec a
jr nz, .div321
ret
;-------------------------------------------------------------------------------
;hlde=hlde/512 ;bc=Žáâ âŽŞ
div512: ld c,e ;ŹŤ ¤č¨Ľ 8 Ą¨â Žáâ âŞ 
ld b,0
ld e,d
ld d,l
ld l,h
ld h,b ;ᤢ¨­ăŤ¨ ¤ĽŤ¨âĽŤě ­  8 Ą¨â ˘Żŕ ˘Ž
srl l ;¨ Ľéń ­  1
rr d
rr e
rl b
ret
;-------------------------------------------------------------------------------
;====================================
; 16 bit multiply
;====================================
;mul16: ld hl,0
;mul_hlbc_de: ld a,b
; ld b,0x11
; jr .mul16_3
;.mul16_1: jr nc,.mul16_2
; add hl,de
;.mul16_2: rr h
; rr l
;.mul16_3: rra
; rr c
; djnz .mul16_1
; ld b,a
; ret

398
format/printf.asm Executable file
View File

@ -0,0 +1,398 @@
;universal color print to console procedure like printf()
;in: DE
cPrint: LD YH,D
LD YL,E
LD L,(IY) ; at iy we have pointer to format string
LD H,(IY+1)
loop: LD A,(HL)
INC HL
OR A
RET Z
CP '%'
JR Z,loc3
loc4: CALL outch
JP loop
loc3: LD A,(HL)
INC HL
CP '%'
JR Z,loc4
DEC HL
CALL scan_length ; scan [-][0][0-9*][lL]
loop1: LD A,(HL)
INC HL
CP 'x'
JP Z,prt_x1
CP 'X'
JP Z,prt_x2 ; hexadecimal
;
AND %1101'1111
;
CP 'D'
JP Z,prt_d ; signed decimal
CP 'U'
JP Z,prt_u ; unsigned decimal
CP 'L'
JP Z,prt_l
CP 'C'
JP Z,prt_c ; print single character
CP 'O'
JP Z,prt_o ; octal
CP 'S'
JP Z,prt_s ; string
JP loop
; %l - long
prt_l: LD (flong),A
INC HL
JP loop1
; %c symbol
prt_c: LD A,(iy+2)
CALL outch
; ld de,(nprtd+1)
; inc de
; ld (nprtd+1),de
prt_q: INC IY
INC IY
LD A,(flong)
OR A
JP Z,loop ; false
INC IY
INC IY
JP loop
; %s string
prt_s: LD A,' '
LD (padch),A
PUSH HL
PUSH IY
LD L,(iy+2)
LD H,(iy+3)
fmt0: PUSH HL
CALL _strlen
EX DE,HL
LD HL,(flen)
LD A,H
OR L
JR Z,fmt01
; call _pad
; or a
SBC HL,DE
LD (flen),HL
LD A,(fladj)
OR A
CALL Z,_pad
fmt01:
POP HL
fmt1: LD A,(HL)
INC HL
OR A
JR Z,fmt21
CALL outch
; ld de,(nprtd+1)
; inc de
; ld (nprtd+1),de
JP fmt1
fmt2:
LD HL,(flen)
LD A,(fladj)
OR A
CALL NZ,_pad
fmt21: POP IY
POP HL
JP prt_q
; %u unsigned decimal
prt_u: PUSH HL
PUSH IY
CALL getnum
JR fmt4
; %d signed decimal
prt_d: PUSH HL
PUSH IY
CALL getnum
LD A,(flong)
OR A
JR NZ,fmt3 ; true
BIT 7,H
JR Z,fmt3
LD DE,-1
fmt3: BIT 7,D
JR Z,fmt4
LD A,'-'
LD (sign),A
XOR A
SUB L
LD L,A
LD A,0
SBC A,H
LD H,A
LD A,0
SBC A,E
LD E,A
LD A,0
SBC A,D
LD D,A
fmt4: LD A,10 ; base
LD BC,char1
CALL mk_num
JP fmt0
; %o octal
prt_o: PUSH HL
PUSH IY
CALL getnum
LD A,8 ; base
LD BC,char1
CALL mk_num
JP fmt0
; %X hex
prt_x2: LD BC,char1
prt_x: PUSH HL
PUSH IY
CALL getnum
LD A,16 ; base
CALL mk_num
JP fmt0
; %x hex
prt_x1: LD BC,char2
JR prt_x
;---------------------------------------
getnum: XOR A
LD (sign),A
LD L,(iy+2)
LD H,(iy+3)
LD A,(flong)
OR A
JR Z,gnu1 ; false
LD E,(iy+4)
LD D,(iy+5)
RET
gnu1: LD DE,0
RET
mk_num: LD (mn0+1),A ; base
LD (chars),BC
EXX
LD HL,number
EXX
CALL mn0
EXX
LD (HL),0
EXX
LD HL,number
LD A,(sign)
OR A
RET Z
DEC HL
RET
mn0: LD BC,0x200a
XOR A
mn1: ADD HL,HL
RL E
RL D
RLA
CP C
JR C,mn2
SUB C
INC L
mn2: DJNZ mn1
; DEHL-quot; A-rem
PUSH AF
LD A,D
OR E
OR H
OR L
CALL NZ,mn0
POP AF
PUSH HL
chars+1: LD HL,char1 ; save char1 or char2
LD C,A
LD B,0
ADD HL,BC
LD A,(HL)
POP HL
EXX
LD (HL),A
INC HL
EXX
RET
scan_length:
XOR A
LD (flong),A ; false
LD (fladj),A
LD (flen+0),A ; make length = 0
LD (flen+1),A
LD A,' '
LD (padch),A ; space padding by default
LD A,(HL)
CP '-'
JR NZ,sl1
LD (fladj),A ; all will be LEFT adjusted, not right
INC HL
sl1: LD A,(HL)
CP '0'
JR NZ,sl2
LD A,(fladj)
OR A
JR NZ,sl1a
LD A,'0'
LD (padch),A ; pad numbers with '0's, not spaces
sl1a: INC HL
sl2: LD DE,0
sl2a: LD A,(HL)
SUB '0'
JR C,sl3
CP 9+1
JR NC,sl3
EX DE,HL
LD C,L
LD B,H
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL
LD B,0
LD C,A
ADD HL,BC
EX DE,HL
INC HL
JR sl2a
sl3: LD (flen),DE ; set explicit length
LD A,(HL)
CP 'l'
JR Z,sl4
CP 'L'
RET NZ
sl4: LD (flong),A ; true
INC HL
RET
_pad: DEC HL
BIT 7,H
RET NZ
PUSH HL
LD A,(padch)
CALL outch
POP HL
; ld de,(nprtd+1)
; inc de
; ld (nprtd+1),de
JP _pad
_strlen: EX DE,HL
LD HL,0
.loop0: LD A,(DE)
OR A
RET Z
INC HL
INC DE
JR .loop0
;---------------------------------------
outch: PUSH IY
PUSH HL
CP cr
JP Z,.new_line
CP lf
JP Z,.prtNullX
CP tab
JP Z,.tabpr
CP col_cmd
JP Z,.set_attr
.next0: EX AF,AF
LD DE,(coords)
LD A,(print_attr)
LD B,A
EX AF,AF'
LD C,ESTEX_wrchar
RST 0x10
LD A,(coords)
INC A
CP 80 ;ª®®à¤¨­ â  ¯® X 0..79 (¨â®£® 80)
JR NC,.new_line ;­  ­®¢ãî áâபã.
LD (coords),A
.end_pr: POP HL
POP IY
RET
.new_line: LD A,(coords+1) ;Y
CP 31
JR C,.noscroll
CALL .ScrollUP
JR .prtNullX
.noscroll: INC A
LD (coords+1),A ;y
.prtNullX: XOR A
LD (coords),A ;x
JR .end_pr
.ScrollUP: LD DE,0
LD HL,0x2050
LD BC,0x0155
XOR A
RST 0x10
RET
.tabpr: LD C,0x53
RST 0x10
INC E ;x++
LD A,E
ADD A,8
AND 0x78
LD E,A
LD (coords),DE
LD C,0x52 ; fix
RST 0x10
JP .end_pr
;Set attribute
.set_attr: LD A,(HL)
LD (print_attr),A
POP HL
POP IY
INC HL
RET
; jp .end_pr
char1: DB '0123456789ABCDEF'
char2: DB '0123456789abcdef'
flen: DW 0
fladj: DB 0
flong: DB 0 ; false/true
padch: DB ' '
sign: DB 0 ; §­ ª ç¨á« 
number: DS 16 ; ¡ãä¥à ç¨á« 
coords: DW 0
print_attr: DB 7

BIN
format/x86_boot.bin Executable file

Binary file not shown.