mirror of
https://github.com/Tolik-Trek/FORMAT.git
synced 2026-06-15 09:21:40 +03:00
уже лучше
This commit is contained in:
parent
8e61332b03
commit
d997a4374f
18
Messages.z80
18
Messages.z80
@ -40,6 +40,12 @@ Version_Msg: DB "DSS Drive Formatter v"
|
|||||||
ASSERT Version_Msg.Size < 80+4, "ERROR: Version_Msg to long!"
|
ASSERT Version_Msg.Size < 80+4, "ERROR: Version_Msg to long!"
|
||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
Error_Msg: DZ "\r\n\r\nError!!!\r\n\r\n"
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
;!FIXIT Color settings
|
;!FIXIT Color settings
|
||||||
col_magenta EQU 5
|
col_magenta EQU 5
|
||||||
@ -49,6 +55,9 @@ col_cmd EQU 16
|
|||||||
PARAMS_MSG: BYTE "\r\nDrive "
|
PARAMS_MSG: BYTE "\r\nDrive "
|
||||||
.disk BYTE "A: "
|
.disk BYTE "A: "
|
||||||
BYTE "will be formatted using the current settings:\r\n\r\n"
|
BYTE "will be formatted using the current settings:\r\n\r\n"
|
||||||
|
BYTE "Partition size:\t", col_cmd,col_magenta, "%S bytes", col_cmd,col_white, "\r\n"
|
||||||
|
BYTE "Available size:\t", col_cmd,col_magenta, "%S bytes", col_cmd,col_white, "\r\n"
|
||||||
|
BYTE "Unused space:\t", col_cmd,col_magenta, "%lu bytes", col_cmd,col_white, "\r\n"
|
||||||
BYTE "Clusters:\t", col_cmd,col_magenta, "%lu", col_cmd,col_white, "\r\n"
|
BYTE "Clusters:\t", col_cmd,col_magenta, "%lu", col_cmd,col_white, "\r\n"
|
||||||
BYTE "Cluster size:\t", col_cmd,col_magenta, "%u bytes", col_cmd,col_white, "\r\n"
|
BYTE "Cluster size:\t", col_cmd,col_magenta, "%u bytes", col_cmd,col_white, "\r\n"
|
||||||
BYTE "File system:\t", col_cmd,col_magenta, "%S", col_cmd,col_white, "\r\n"
|
BYTE "File system:\t", col_cmd,col_magenta, "%S", col_cmd,col_white, "\r\n"
|
||||||
@ -57,12 +66,17 @@ PARAMS_MSG: BYTE "\r\nDrive "
|
|||||||
BYTE 'Press "Y" for format or any other key to exit', "\r\n"
|
BYTE 'Press "Y" for format or any other key to exit', "\r\n"
|
||||||
BYTE 0
|
BYTE 0
|
||||||
.ptr: WORD PARAMS_MSG
|
.ptr: WORD PARAMS_MSG
|
||||||
|
WORD .fullSize
|
||||||
|
WORD .dataSize
|
||||||
|
.unused: DWORD 0
|
||||||
.Clusters: DWORD 0
|
.Clusters: DWORD 0
|
||||||
.Clu_size: WORD 0
|
.Clu_size: WORD 0
|
||||||
.FAT: WORD .FATtxt
|
WORD .FATtxt
|
||||||
.Serial: DWORD 0
|
.Serial: DWORD 0
|
||||||
.Label: WORD .LabelTxt
|
WORD .LabelTxt
|
||||||
;
|
;
|
||||||
.FATtxt: DZ 'FAT '
|
.FATtxt: DZ 'FAT '
|
||||||
.LabelTxt: DZ 'NO LABEL '
|
.LabelTxt: DZ 'NO LABEL '
|
||||||
|
.fullSize: BYTE ' ',0
|
||||||
|
.dataSize: BYTE ' ',0
|
||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
|
|||||||
23
data.z80
23
data.z80
@ -8,6 +8,17 @@ FAT16 EQU 2 ;
|
|||||||
FAT12 EQU 3 ; § ®¤® ¨ ¬®¦¨â¥«ì
|
FAT12 EQU 3 ; § ®¤® ¨ ¬®¦¨â¥«ì
|
||||||
FAT32 EQU 4 ; § ®¤® ¨ ¬®¦¨â¥«ì
|
FAT32 EQU 4 ; § ®¤® ¨ ¬®¦¨â¥«ì
|
||||||
;
|
;
|
||||||
|
;
|
||||||
|
MaxClustersNumber:
|
||||||
|
.FAT12 EQU 4084
|
||||||
|
.FAT16 EQU 65524
|
||||||
|
;
|
||||||
|
MaxDataSectorsNumber:
|
||||||
|
.FAT12_L EQU #0000
|
||||||
|
.FAT12_H EQU #07FA
|
||||||
|
.FAT16_L EQU #0000
|
||||||
|
.FAT16_H EQU #7FFA
|
||||||
|
;
|
||||||
FilesInRootDIR:
|
FilesInRootDIR:
|
||||||
.FDD_DD EQU 112
|
.FDD_DD EQU 112
|
||||||
.FDD_HD EQU 224
|
.FDD_HD EQU 224
|
||||||
@ -31,9 +42,9 @@ FAT_ReservedSectors:
|
|||||||
FAT_TYPES: FAT_TYPES_LINE #0800, 32768, CONSTANTS.FAT32 ; > 32768
|
FAT_TYPES: FAT_TYPES_LINE #0800, 32768, CONSTANTS.FAT32 ; > 32768
|
||||||
FAT_TYPES_LINE #0400, 16384, CONSTANTS.FAT32 ; 16384..32768 Mb
|
FAT_TYPES_LINE #0400, 16384, CONSTANTS.FAT32 ; 16384..32768 Mb
|
||||||
FAT_TYPES_LINE #0200, 8192, CONSTANTS.FAT32 ; 8192..16384 Mb
|
FAT_TYPES_LINE #0200, 8192, CONSTANTS.FAT32 ; 8192..16384 Mb
|
||||||
FAT_TYPES_LINE #0100, 4096, CONSTANTS.FAT32 ; 4096..8192 Mb
|
FAT_TYPES_LINE #0080, 4096, CONSTANTS.FAT32 ; 2048..8192 Mb
|
||||||
FAT_TYPES_LINE #0080, 32768, CONSTANTS.FAT16 ; 2048..4096 Mb
|
FAT_TYPES_LINE #0060, 32768, CONSTANTS.FAT16 ; 1536..2047 Mb
|
||||||
FAT_TYPES_LINE #0040, 16384, CONSTANTS.FAT16 ; 1023..2048 Mb
|
FAT_TYPES_LINE #0040, 16384, CONSTANTS.FAT16 ; 1023..1535 Mb
|
||||||
FAT_TYPES_LINE #0020, 8192, CONSTANTS.FAT16 ; 511..1023 Mb
|
FAT_TYPES_LINE #0020, 8192, CONSTANTS.FAT16 ; 511..1023 Mb
|
||||||
FAT_TYPES_LINE #0010, 4096, CONSTANTS.FAT16 ; 256..511 Mb
|
FAT_TYPES_LINE #0010, 4096, CONSTANTS.FAT16 ; 256..511 Mb
|
||||||
FAT_TYPES_LINE #0008, 2048, CONSTANTS.FAT16 ; 128..256 Mb
|
FAT_TYPES_LINE #0008, 2048, CONSTANTS.FAT16 ; 128..256 Mb
|
||||||
@ -110,14 +121,14 @@ VARIABLES EQU $
|
|||||||
;.Fat32_ReservedSectors WORD 32
|
;.Fat32_ReservedSectors WORD 32
|
||||||
.ReservedSectors WORD 0 ; [ ]
|
.ReservedSectors WORD 0 ; [ ]
|
||||||
.RootDirSectors D24 0 ; [ ]
|
.RootDirSectors D24 0 ; [ ]
|
||||||
.NotUsedSpace BYTE 0 ; in sectors
|
.NotUsedSpace WORD 0 ; in sectors ; [ ] ¥¯à ¢¨«ì® áç¨â îâáï?
|
||||||
.total_clusters_L: WORD 0 ; [x]
|
.total_clusters_L: WORD 0 ; [x]
|
||||||
.total_clusters_H: WORD 0 ; [x]
|
.total_clusters_H: WORD 0 ; [x]
|
||||||
.FAT32_RootDirClusters WORD 1 ; [ ]
|
.FAT32_RootDirClusters WORD 1 ; [ ]
|
||||||
.FAT.LABEL BYTE 'NO_LABEL ' ; [ ]
|
.FAT.LABEL BYTE 'NO_LABEL ' ; [ ]
|
||||||
.DriveExtendedParameters BYTE 0 ; [ ]
|
.DriveExtendedParameters BYTE 0 ; [ ]
|
||||||
.DataSectors_L WORD 0 ; [ ]
|
.DataSectors_L WORD 0 ; [ ] ¥¯à ¢¨«ì® áç¨â îâáï?
|
||||||
.DataSectors_H WORD 0 ; [ ]
|
.DataSectors_H WORD 0 ; [ ] ¥¯à ¢¨«ì® áç¨â îâáï?
|
||||||
.RootDirFirstSector_L WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE
|
.RootDirFirstSector_L WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE
|
||||||
.RootDirFirstSector_H WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE
|
.RootDirFirstSector_H WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE
|
||||||
.SectorsPerFAT_L WORD 0 ; [x]
|
.SectorsPerFAT_L WORD 0 ; [x]
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
57
|
64
|
||||||
341
format.asm
341
format.asm
@ -322,12 +322,23 @@ STOP_ERROR:
|
|||||||
LD B,DSS_Error.sys.INVALID_FUNCTION
|
LD B,DSS_Error.sys.INVALID_FUNCTION
|
||||||
;!TODO
|
;!TODO
|
||||||
|
|
||||||
EXIT: PUSH BC
|
EXIT: LD C,Dss.Exit
|
||||||
|
PUSH BC
|
||||||
LD HL,Exit_Path
|
LD HL,Exit_Path
|
||||||
LD C,Dss.ChDir
|
LD C,Dss.ChDir
|
||||||
RST ToDSS
|
RST ToDSS
|
||||||
;
|
;
|
||||||
LD C,Dss.Exit
|
POP BC
|
||||||
|
LD A,B
|
||||||
|
AND A
|
||||||
|
JP Z,ToDSS
|
||||||
|
;
|
||||||
|
PUSH BC
|
||||||
|
LD HL,Error_Msg
|
||||||
|
LD C,Dss.PChars
|
||||||
|
RST ToDSS
|
||||||
|
;
|
||||||
|
POP BC
|
||||||
RST ToDSS
|
RST ToDSS
|
||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
@ -393,7 +404,7 @@ CALC_TOTAL_CLUSTERS:
|
|||||||
.skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors
|
.skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors
|
||||||
.push_regs: PUSH DE
|
.push_regs: PUSH DE
|
||||||
PUSH HL
|
PUSH HL
|
||||||
;num_fats * fat_sz32; fat_sz32 ¢ ª« áâ¥à å
|
;num_fats * fat_size; fat_size ¢ ª« áâ¥à å
|
||||||
.fat_size_l+1: LD BC,0
|
.fat_size_l+1: LD BC,0
|
||||||
.fat_size_h+1: LD DE,0
|
.fat_size_h+1: LD DE,0
|
||||||
LD A,(FAT_PARAMETERS.Number_of_FATs)
|
LD A,(FAT_PARAMETERS.Number_of_FATs)
|
||||||
@ -403,7 +414,7 @@ CALC_TOTAL_CLUSTERS:
|
|||||||
LD C,L
|
LD C,L
|
||||||
PUSH IX
|
PUSH IX
|
||||||
POP DE
|
POP DE
|
||||||
;num_fats * fat_sz32 = BCDE
|
;num_fats * fat_size = BCDE
|
||||||
;
|
;
|
||||||
LD HL,(VARIABLES.RootDirSectors)
|
LD HL,(VARIABLES.RootDirSectors)
|
||||||
ADD HL,DE
|
ADD HL,DE
|
||||||
@ -413,7 +424,7 @@ CALC_TOTAL_CLUSTERS:
|
|||||||
ADC HL,BC
|
ADC HL,BC
|
||||||
LD B,H
|
LD B,H
|
||||||
LD C,L
|
LD C,L
|
||||||
;num_fats * fat_sz32 + root_dir_sectors = BC:DE
|
;num_fats * fat_size + root_dir_sectors = BC:DE
|
||||||
;
|
;
|
||||||
POP HL
|
POP HL
|
||||||
SBC HL,DE
|
SBC HL,DE
|
||||||
@ -421,15 +432,26 @@ CALC_TOTAL_CLUSTERS:
|
|||||||
POP HL
|
POP HL
|
||||||
SBC HL,BC
|
SBC HL,BC
|
||||||
JP C,STOP_ERROR
|
JP C,STOP_ERROR
|
||||||
; data_sectors = HL:DE
|
; data_sectors = HL:DE 0x7FFA0000
|
||||||
|
;
|
||||||
|
;CALL CHECK_MAX_DATA_SECTORS
|
||||||
|
JP C,STOP_ERROR ; ᬥ¨âì FAT type?
|
||||||
|
;
|
||||||
LD (VARIABLES.DataSectors_L),DE
|
LD (VARIABLES.DataSectors_L),DE
|
||||||
LD (VARIABLES.DataSectors_H),HL
|
LD (VARIABLES.DataSectors_H),HL
|
||||||
|
;
|
||||||
; total_clusters
|
; total_clusters
|
||||||
LD A,(FAT_PARAMETERS.SectorsPerCluster)
|
LD A,(FAT_PARAMETERS.SectorsPerCluster)
|
||||||
CALL HLDE_Div_A
|
CALL HLDE_Div_A
|
||||||
LD (VARIABLES.NotUsedSpace),A
|
; total_clusters = HL:DE, A - unused space in sectors
|
||||||
; total_clusters = HL:DE
|
|
||||||
;
|
;
|
||||||
|
LD B,0
|
||||||
|
LD C,A
|
||||||
|
LD IX,(VARIABLES.NotUsedSpace)
|
||||||
|
ADD IX,BC
|
||||||
|
JP C,STOP_ERROR ; ᬥ¨âì FAT type?
|
||||||
|
;
|
||||||
|
LD (VARIABLES.NotUsedSpace),IX
|
||||||
LD (VARIABLES.total_clusters_L),DE
|
LD (VARIABLES.total_clusters_L),DE
|
||||||
LD (VARIABLES.total_clusters_H),HL
|
LD (VARIABLES.total_clusters_H),HL
|
||||||
; fat_size
|
; fat_size
|
||||||
@ -487,6 +509,79 @@ CALC_TOTAL_CLUSTERS:
|
|||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
IFUSED CHECK_MAX_DATA_SECTORS
|
||||||
|
; IN: data_sectors = HL:DE
|
||||||
|
; OUT: CF=0 corrected data_sectors = HL:DE
|
||||||
|
; CF=1 ᫨誮¬ ¡®«ìè ï à §¨æ
|
||||||
|
CHECK_MAX_DATA_SECTORS:
|
||||||
|
LD BC,0
|
||||||
|
LD (VARIABLES.NotUsedSpace),BC
|
||||||
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
|
SUB CONSTANTS.FAT12
|
||||||
|
RET NC ; good sectors
|
||||||
|
;
|
||||||
|
PUSH HL
|
||||||
|
PUSH DE
|
||||||
|
;
|
||||||
|
LD BC,CONSTANTS.MaxDataSectorsNumber.FAT12_H
|
||||||
|
JR Z,.sectors_fat12
|
||||||
|
; sectors_fat16
|
||||||
|
LD BC,CONSTANTS.MaxDataSectorsNumber.FAT16_H
|
||||||
|
.sectors_fat12: PUSH BC
|
||||||
|
LD BC,(FAT_PARAMETERS.BytesPerSector)
|
||||||
|
CALL MUL32_POWER2
|
||||||
|
; A:HL:DE
|
||||||
|
;
|
||||||
|
POP BC
|
||||||
|
AND A
|
||||||
|
JR NZ,.too_mutch
|
||||||
|
;
|
||||||
|
AND A
|
||||||
|
SBC HL,BC
|
||||||
|
JR C,.good_sectors
|
||||||
|
;
|
||||||
|
JR NZ,.get_clu
|
||||||
|
LD A,D
|
||||||
|
OR E
|
||||||
|
JR Z,.good_sectors
|
||||||
|
;
|
||||||
|
.get_clu: PUSH DE
|
||||||
|
POP IX
|
||||||
|
PUSH BC
|
||||||
|
LD BC,(FAT_PARAMETERS.BytesPerSector)
|
||||||
|
CALL HLIX_div_BC
|
||||||
|
POP BC
|
||||||
|
; HLIX remainder DE
|
||||||
|
; ¯® ¨¤¥¥, DE = 0 âãâ
|
||||||
|
;
|
||||||
|
LD A,H
|
||||||
|
OR L
|
||||||
|
JR NZ,.too_mutch
|
||||||
|
;
|
||||||
|
LD (VARIABLES.NotUsedSpace),IX
|
||||||
|
LD IX,0
|
||||||
|
LD H,B
|
||||||
|
LD L,C
|
||||||
|
LD BC,(FAT_PARAMETERS.BytesPerSector)
|
||||||
|
CALL HLIX_div_BC
|
||||||
|
PUSH IX
|
||||||
|
POP DE
|
||||||
|
POP BC
|
||||||
|
POP BC
|
||||||
|
AND A
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.good_sectors: SCF
|
||||||
|
.too_mutch: POP DE
|
||||||
|
POP HL
|
||||||
|
CCF
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
ENDIF
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
SET_RESERVED_AND_ROOTDIR:
|
SET_RESERVED_AND_ROOTDIR:
|
||||||
LD A,(VARIABLES.FAT_TYPE)
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
@ -1043,31 +1138,56 @@ JP_HL: EX DE,HL
|
|||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
;!FIXIT
|
;!FIXIT
|
||||||
SHOW_FORMAT_PARAMETERS:
|
SHOW_FORMAT_PARAMETERS:
|
||||||
|
;.disk
|
||||||
LD A,(VARIABLES.CurrentDrive)
|
LD A,(VARIABLES.CurrentDrive)
|
||||||
ADD 'A'
|
ADD 'A'
|
||||||
LD (PARAMS_MSG.disk),A
|
LD (PARAMS_MSG.disk),A
|
||||||
;
|
;.unused
|
||||||
|
LD BC,(FAT_PARAMETERS.BytesPerSector)
|
||||||
|
LD DE,(VARIABLES.NotUsedSpace)
|
||||||
|
LD HL,0
|
||||||
|
CALL MUL32_POWER2
|
||||||
|
LD (PARAMS_MSG.unused),DE
|
||||||
|
LD (PARAMS_MSG.unused + 2),HL
|
||||||
|
;.fullSize
|
||||||
|
LD HL,(VARIABLES.VOLUME_SIZE_BYTES + 2)
|
||||||
|
EXX
|
||||||
|
LD HL,(VARIABLES.VOLUME_SIZE_BYTES)
|
||||||
|
LD A,(VARIABLES.VOLUME_SIZE_BYTES + 4)
|
||||||
|
LD DE,PARAMS_MSG.fullSize
|
||||||
|
CALL PRINT_5BYTES
|
||||||
|
;.dataSize
|
||||||
|
LD HL,(VARIABLES.DataSectors_H)
|
||||||
|
LD DE,(VARIABLES.DataSectors_L)
|
||||||
|
LD BC,(FAT_PARAMETERS.BytesPerSector)
|
||||||
|
CALL MUL32_POWER2
|
||||||
|
PUSH DE
|
||||||
|
EXX
|
||||||
|
POP HL
|
||||||
|
LD DE,PARAMS_MSG.dataSize
|
||||||
|
CALL PRINT_5BYTES
|
||||||
|
;.Clusters
|
||||||
LD HL,(VARIABLES.total_clusters_L)
|
LD HL,(VARIABLES.total_clusters_L)
|
||||||
LD (PARAMS_MSG.Clusters),HL
|
LD (PARAMS_MSG.Clusters),HL
|
||||||
LD HL,(VARIABLES.total_clusters_H)
|
LD HL,(VARIABLES.total_clusters_H)
|
||||||
LD (PARAMS_MSG.Clusters + 2),HL
|
LD (PARAMS_MSG.Clusters + 2),HL
|
||||||
;
|
;.Clu_size
|
||||||
LD HL,(VARIABLES.ClusterSize)
|
LD HL,(VARIABLES.ClusterSize)
|
||||||
LD (PARAMS_MSG.Clu_size),HL
|
LD (PARAMS_MSG.Clu_size),HL
|
||||||
;
|
;.FATtxt
|
||||||
LD HL,(FAT_PARAMETERS.ID_FAT+3)
|
LD HL,(FAT_PARAMETERS.ID_FAT+3)
|
||||||
LD (PARAMS_MSG.FATtxt + 3),HL
|
LD (PARAMS_MSG.FATtxt + 3),HL
|
||||||
;
|
;.Serial
|
||||||
LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_1)
|
LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_1)
|
||||||
LD (PARAMS_MSG.Serial),HL
|
|
||||||
LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_2)
|
|
||||||
LD (PARAMS_MSG.Serial + 2),HL
|
LD (PARAMS_MSG.Serial + 2),HL
|
||||||
;
|
LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_2)
|
||||||
|
LD (PARAMS_MSG.Serial),HL
|
||||||
|
;.LabelTxt
|
||||||
LD HL,FAT_PARAMETERS.LABEL
|
LD HL,FAT_PARAMETERS.LABEL
|
||||||
LD DE,PARAMS_MSG.LabelTxt
|
LD DE,PARAMS_MSG.LabelTxt
|
||||||
LD BC,FAT_PARAMETERS.LABEL.Size
|
LD BC,FAT_PARAMETERS.LABEL.Size
|
||||||
LDIR
|
LDIR
|
||||||
;
|
;
|
||||||
LD IY,PARAMS_MSG.ptr
|
LD IY,PARAMS_MSG.ptr
|
||||||
CALL printf#.str
|
CALL printf#.str
|
||||||
|
|
||||||
@ -1297,6 +1417,195 @@ PutHexNumb: PUSH AF
|
|||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; A:HL':HL - ç¨á«® ¤«ï ¯¥à¥¢®¤
|
||||||
|
; DE - ¡ãä¥à ¤«ï ⥪á⮢®© áâப¨
|
||||||
|
PRINT_5BYTES: PUSH DE
|
||||||
|
LD IX,L40BIT.Str ; "00"
|
||||||
|
LD C,#17
|
||||||
|
EXX
|
||||||
|
LD DE,#4876
|
||||||
|
EXX
|
||||||
|
LD DE,#E800
|
||||||
|
; C:DE':DE = 100,000,000,000
|
||||||
|
CALL GET_BIG_DIG
|
||||||
|
LD C,#02
|
||||||
|
EXX
|
||||||
|
LD DE,#540B
|
||||||
|
EXX
|
||||||
|
LD DE,#E400
|
||||||
|
; C:DE':DE = 10,000,000,000
|
||||||
|
CALL GET_BIG_DIG
|
||||||
|
LD C,#00
|
||||||
|
EXX
|
||||||
|
LD DE,#3B9A
|
||||||
|
EXX
|
||||||
|
LD DE,#CA00
|
||||||
|
; C:DE':DE = 1,000,000,000
|
||||||
|
CALL GET_BIG_DIG
|
||||||
|
; DE':DE = 100,000,000
|
||||||
|
CALL .skip_1
|
||||||
|
POP DE
|
||||||
|
;LD DE,SIZE_BUFFER.high ; "0 000 000 000"
|
||||||
|
LD HL,L40BIT.Str ; "0000000000"
|
||||||
|
LDI
|
||||||
|
LDI
|
||||||
|
LD A,(HL)
|
||||||
|
LDI
|
||||||
|
CP " "
|
||||||
|
JR Z,1F
|
||||||
|
;
|
||||||
|
LD A,"," ; à §¤. à §à冷¢
|
||||||
|
1: LD (DE),A
|
||||||
|
INC DE
|
||||||
|
LDI
|
||||||
|
LDI
|
||||||
|
LD A,(HL)
|
||||||
|
LDI
|
||||||
|
CP " "
|
||||||
|
JR Z,1F
|
||||||
|
;
|
||||||
|
LD A,"," ; à §¤. à §à冷¢
|
||||||
|
1: LD (DE),A
|
||||||
|
INC DE
|
||||||
|
LDI
|
||||||
|
LDI
|
||||||
|
LD A,(HL)
|
||||||
|
LDI
|
||||||
|
CP " "
|
||||||
|
JR Z,1F
|
||||||
|
;
|
||||||
|
LD A,"," ; à §¤. à §à冷¢
|
||||||
|
1: LD (DE),A
|
||||||
|
INC DE
|
||||||
|
LDI
|
||||||
|
LDI
|
||||||
|
LDI
|
||||||
|
;SCF
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.skip_1: EXX
|
||||||
|
LD DE,#05F5
|
||||||
|
EXX
|
||||||
|
LD DE,#E100
|
||||||
|
; DE':DE = 100,000,000
|
||||||
|
CALL GET_DIG ; 100,000,000...999,999,999
|
||||||
|
EXX
|
||||||
|
LD DE,#98
|
||||||
|
EXX
|
||||||
|
LD DE,#9680
|
||||||
|
; DE':DE = 10,000,000
|
||||||
|
CALL GET_DIG ; 10,000,000...99,999,999
|
||||||
|
EXX
|
||||||
|
LD DE,#0F
|
||||||
|
EXX
|
||||||
|
LD DE,#4240
|
||||||
|
; DE':DE = 1,000,000
|
||||||
|
CALL GET_DIG ; 1,000,000...9,999,999
|
||||||
|
EXX
|
||||||
|
LD DE,#01
|
||||||
|
EXX
|
||||||
|
LD DE,#86A0
|
||||||
|
; DE':DE = 100,000
|
||||||
|
CALL GET_DIG ; 100,000...999,999
|
||||||
|
EXX
|
||||||
|
LD DE,#00
|
||||||
|
EXX
|
||||||
|
LD DE,#2710
|
||||||
|
; DE':DE = 10,000
|
||||||
|
CALL GET_DIG ; 10,000...99,999
|
||||||
|
EXX
|
||||||
|
LD DE,#00
|
||||||
|
EXX
|
||||||
|
LD DE,#03E8
|
||||||
|
; DE':DE = 1,000
|
||||||
|
CALL GET_DIG ; 1,000...9,999
|
||||||
|
EXX
|
||||||
|
LD DE,#00
|
||||||
|
EXX
|
||||||
|
LD DE,#64
|
||||||
|
; DE':DE = 100
|
||||||
|
CALL GET_DIG ; 100..999
|
||||||
|
EXX
|
||||||
|
LD DE,#00
|
||||||
|
EXX
|
||||||
|
LD DE,#0A
|
||||||
|
; DE':DE = 10
|
||||||
|
CALL GET_DIG ; 10..99
|
||||||
|
LD A,L
|
||||||
|
ADD A,"0"
|
||||||
|
LD (ix+0),A
|
||||||
|
INC IX
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
GET_DIG: LD A,"0"-1
|
||||||
|
AND A
|
||||||
|
.loop: INC A
|
||||||
|
SBC HL,DE
|
||||||
|
EXX
|
||||||
|
SBC HL,DE
|
||||||
|
EXX
|
||||||
|
JR NC,.loop
|
||||||
|
;
|
||||||
|
ADD HL,DE
|
||||||
|
EXX
|
||||||
|
ADC HL,DE
|
||||||
|
EXX
|
||||||
|
CP "0"
|
||||||
|
JR NZ,.putChar
|
||||||
|
;
|
||||||
|
LD B,A
|
||||||
|
LD A,(ix-1)
|
||||||
|
CP " "
|
||||||
|
JR Z,.putChar
|
||||||
|
;
|
||||||
|
LD A,B
|
||||||
|
.putChar: LD (ix+0),A
|
||||||
|
INC IX
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
GET_BIG_DIG: LD B,"0"-1
|
||||||
|
AND A
|
||||||
|
.loop: INC B
|
||||||
|
SBC HL,DE
|
||||||
|
EXX
|
||||||
|
SBC HL,DE
|
||||||
|
EXX
|
||||||
|
SBC A,C
|
||||||
|
JR NC,.loop
|
||||||
|
;
|
||||||
|
ADD HL,DE
|
||||||
|
EXX
|
||||||
|
ADC HL,DE
|
||||||
|
EXX
|
||||||
|
ADC A,C
|
||||||
|
EX AF,AF'
|
||||||
|
LD A,B
|
||||||
|
CP "0"
|
||||||
|
JR NZ,.putChar
|
||||||
|
;
|
||||||
|
LD A,(ix-1)
|
||||||
|
CP " "
|
||||||
|
JR Z,.putChar
|
||||||
|
;
|
||||||
|
LD A,B
|
||||||
|
.putChar: LD (ix+0),A
|
||||||
|
EX AF,AF'
|
||||||
|
INC IX
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
L40BIT: DB " " ; ¬ àª¥à ¤«ï ix-1
|
||||||
|
.Str: DB " " ; 00
|
||||||
|
L32BIT_: DB " " ; 000000000
|
||||||
|
.end: DB "0"
|
||||||
|
;
|
||||||
|
; SIZE_BUFFER: db " " ; ¬ àª¥à ¤«ï ix-1
|
||||||
|
; .high db " " ; "00"
|
||||||
|
; .low: db " ",0,0 ; "0 000 000 000",0,0
|
||||||
|
; .bytes equ SIZE_BUFFER - $
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
include 'math.asm'
|
include 'math.asm'
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
3
math.asm
3
math.asm
@ -127,7 +127,6 @@ HLIX_div_BC: EX DE,HL
|
|||||||
;-----------------------------------------------------------------------
|
;-----------------------------------------------------------------------
|
||||||
; -> HLDE * BC. BC = á⥯¥ì ¤¢®©ª¨
|
; -> HLDE * BC. BC = á⥯¥ì ¤¢®©ª¨
|
||||||
; <- AHLDE
|
; <- AHLDE
|
||||||
; CF=1 - error
|
|
||||||
MUL32_POWER2: SRL B
|
MUL32_POWER2: SRL B
|
||||||
RR C
|
RR C
|
||||||
LD A,B
|
LD A,B
|
||||||
@ -140,7 +139,7 @@ MUL32_POWER2: SRL B
|
|||||||
EX DE,HL
|
EX DE,HL
|
||||||
ADC HL,HL
|
ADC HL,HL
|
||||||
ADC A,0
|
ADC A,0
|
||||||
JP C,STOP_ERROR
|
JP C,STOP_ERROR ; CF=1 - error
|
||||||
;
|
;
|
||||||
SRL B
|
SRL B
|
||||||
RR C
|
RR C
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user