📄 hdp.asm
字号:
;-----------------------------
DAP_STRUC STRUC
PacketSize DB 16
Reserved DB 0
BlockCount DW ?
BufferAddroff DW ?
BufferAddrseg DW ?
Blocknum DQ ?
DAP_STRUC ENDS
DPP_STRUC STRUC
InfoSize DW 26
Flags DW ?
Cylinders DD ?
Heads DD ?
SectorsPTrack DD ?
Sectors DQ ?
SectorSize DW ?
DPP_STRUC ENDS
;----------------------------------------
DADD MACRO NUM1,NUM2,NUM3,COUNT
LOCAL _B0
PUSHF
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH BP
CLC
MOV CX,COUNT
MOV SI,0
MOV BP,0
_B0: MOV DX,0
MOV AX,WORD PTR NUM1[SI]
ADD AX,WORD PTR NUM2[SI]
ADC DX,0
ADD AX,BP
MOV WORD PTR NUM3[SI],AX
INC SI
INC SI
MOV WORD PTR NUM3[SI],DX
MOV BP,DX
LOOP _B0
INC SI
INC SI
MOV WORD PTR NUM3[SI],BP
POP BP
POP SI
POP DX
POP CX
POP AX
POPF
ENDM
;----------------------------------
DSUB MACRO NUM1,NUM2,NUM3,COUNT
LOCAL _B1
PUSHF
PUSH AX
PUSH CX
PUSH SI
CLC
MOV CX,COUNT
MOV SI,0
_B1: MOV AX,WORD PTR NUM1[SI]
SBB AX,WORD PTR NUM2[SI]
MOV WORD PTR NUM3[SI],AX
INC SI
INC SI
LOOP _B1
POP SI
POP CX
POP AX
POPF
ENDM
;-----------------------------
READDISK MACRO BufferAddress,LPA,BlockCount
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA BX,BufferAddress
MOV DAP.BufferaddrOFF,BX
MVAR DAP.BlockNum,LPA,4
MVAR DAP.blockCount,BlockCount,1
MSG MSG64
MOV AH,42H
MOV DL,80H
LEA SI,DAP
INT 13H
MSGSF MSG40,MSG41
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
ENDM
WRITEDISK MACRO BufferAddress,LPA,BlockCount
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA BX,BufferAddress
MOV DAP.BufferaddrOFF,BX
MVAR DAP.BlockNum,LPA,4
MVAR DAP.blockCount,BlockCount,1
MSG MSG65
MOV AL,0
MOV AH,43H
MOV DL,80H
LEA SI,DAP
INT 13H
MSGSF MSG42,MSG43
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
ENDM
;----------------------
CLS MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,6
MOV AL,0
MOV BH,7
MOV CX,0
MOV DH,24
MOV DL,79
INT 10H
POP DX
POP CX
POP BX
POP AX
ENDM
MVAR MACRO VARD,VARS,COUNT
LOCAL NEXT,EXIT
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
LEA SI,VARS
LEA DI,VARD
MOV CX,COUNT
NEXT:
MOV AX,[SI]
MOV [DI],AX
ADD SI,2
ADD DI,2
DEC CX
CMP CX,0
JZ EXIT
JMP NEXT
EXIT:
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
ENDM
B2A_32 MACRO BIN,ASC
LOCAL NEXT,EXIT,NOT0
PUSH DI
MVAR DIVEE_64,BIN,2
MOV CX,32
NEXT: LEA SI,DIVEE_64
MOV AX,[SI]
CMP AX,0
JNZ NOT0
INC SI
INC SI
DEC CX
CMP CX,0
JA NEXT
MVAR ASC,ASC0,2
JMP EXIT
NOT0: LEA DI,ASC
MVAR DIVER_32,D10,2
CALL DIV_32
MVAR DIVER_32,D9,2
CALL DIV_32
MVAR DIVER_32,D8,2
CALL DIV_32
MVAR DIVER_32,D7,2
CALL DIV_32
MVAR DIVER_32,D6,2
CALL DIV_32
MVAR DIVER_32,D5,2
CALL DIV_32
MVAR DIVER_32,D4,2
CALL DIV_32
MVAR DIVER_32,D3,2
CALL DIV_32
MVAR DIVER_32,D2,2
CALL DIV_32
MVAR DIVER_32,D1,2
CALL DIV_32
EXIT: POP DI
ENDM
;----------------------
B2A_64 MACRO BIN,ASC
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MVAR DIVEE_128,BIN,4
LEA DI,ASC
MVAR DIVER_64,D20,4
CALL DIV_64
MVAR DIVER_64,D19,4
CALL DIV_64
MVAR DIVER_64,D18,4
CALL DIV_64
MVAR DIVER_64,D17,4
CALL DIV_64
MVAR DIVER_64,D16,4
CALL DIV_64
MVAR DIVER_64,D15,4
CALL DIV_64
MVAR DIVER_64,D14,4
CALL DIV_64
MVAR DIVER_64,D13,4
CALL DIV_64
MVAR DIVER_64,D12,4
CALL DIV_64
MVAR DIVER_64,D11,4
CALL DIV_64
MVAR DIVER_64,D10,4
CALL DIV_64
MVAR DIVER_64,D9,4
CALL DIV_64
MVAR DIVER_64,D8,4
CALL DIV_64
MVAR DIVER_64,D7,4
CALL DIV_64
MVAR DIVER_64,D6,4
CALL DIV_64
MVAR DIVER_64,D5,4
CALL DIV_64
MVAR DIVER_64,D4,4
CALL DIV_64
MVAR DIVER_64,D3,4
CALL DIV_64
MVAR DIVER_64,D2,4
CALL DIV_64
MVAR DIVER_64,D1,4
CALL DIV_64
MOV BX,0
MOV FLAG0,BX
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
ENDM
GETSC MACRO SC,S,C
PUSH AX
PUSH BX
MOV AX,SC
MOV BX,AX
MOV BH,0
SHL BX,1
SHL BX,1
MOV BL,AH
MOV C,BX
AND AX,003FH
MOV S,AL
POP BX
POP AX
ENDM
;-----------------------------
B2A_8 MACRO BIN,ASC
LOCAL SHOW0,EXIT
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV BX,0
MOV BL,BIN
CMP BX,0
JZ SHOW0
MOV DI,OFFSET ASC
;二进制与ASCII的转换
MOV CX,100
CALL Div8
MOV CX,10
CALL Div8
MOV CX,1
CALL Div8
JMP EXIT
SHOW0:
MVAR ASC,ASC0,1
EXIT:
POP DI
POP DX
POP CX
POP BX
POP AX
ENDM
;-----------------------------
B2A_16 MACRO BIN,ASC
LOCAL SHOW0,EXIT
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV BX,BIN ;二进制数存入SI
LEA DI,ASC ;ASCII码地址存入DI
CMP BX,0
JZ SHOW0
;二进制与ASCII的转换
MOV CX,10000
CALL Div16
MOV CX,1000
CALL Div16
MOV CX,100
CALL Div16
MOV CX,10
CALL Div16
MOV CX,1
CALL Div16
JMP EXIT
SHOW0:
MVAR ASC,ASC0,2
EXIT:
POP DI
POP DX
POP CX
POP BX
POP AX
ENDM
;-------------------------------
MSG MACRO MSG
PUSH AX
PUSH DX
LEA DX,MSG
MOV AH,9
INT 21H
POP DX
POP AX
ENDM
;----------------------------
MSGSF MACRO MSGS,MSGF
LOCAL FAIL,EXIT
PUSH AX
PUSH BX
PUSH DX
JC FAIL
MSG MSGS
JMP EXIT
FAIL: MSG MSGF
EXIT: POP DX
POP BX
POP AX
ENDM
;------------------------
CONTINUE MACRO
MSG MSG63
RDKB
ENDM
;------------------------
RDKB MACRO
; PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,0CH
MOV AL,7
INT 21H
POP DX
POP CX
POP BX
; POP AX
ENDM
;--------------------------
YN MACRO
; PUSH AX
PUSH BX
PUSH CX
PUSH DX
MSG MSG52
RDYN
POP DX
POP CX
POP BX
; POP AX
ENDM
;---------------------------
RDYN MACRO
LOCAL NEXT,OTHER,EXIT
PUSH AX
NEXT: RDKB
CMP AL,'Y'
JNZ OTHER
CLC
JMP EXIT
OTHER: CMP AL,'N'
JNZ NEXT
STC
JMP EXIT
EXIT: POP AX
ENDM
;----------------------------
CINIT MACRO ;程序段初始化宏
ASSUME CS:CSEG,DS:DSEG
START:
PUSH DS
SUB AX,AX
PUSH AX
;
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
ENDM
;--------------------------------
DMUL MACRO MCD1, MCD2, MCD3, COUNT
LOCAL _B01, _B02, _B03
PUSHF
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV SI,SEG MCD1
MOV DS,SI
LEA SI,MCD1
MOV CX,2*COUNT
MOV DI,SEG MCD2
MOV ES,DI
LEA DI,MCD2
LEA BX,MCD3
PUSH BX
MOV AX,0
CLD
_B01:
MOV [BX],AX
INC BX
INC BX
LOOP _B01
POP BX
MOV CX,COUNT
_B02:
PUSH CX
MOV DX,[SI]
INC SI
INC SI
PUSH BX
PUSH DI
MOV CX,COUNT
_B03:
PUSH CX
PUSH DX
MOV AX,[DI]
INC DI
INC DI
MUL DX
ADD [BX],AX
INC BX
INC BX
ADC [BX],DX
POP DX
POP CX
LOOP _B03
POP DI
POP BX
INC BX
INC BX
POP CX
LOOP _B02
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
POPF
ENDM
;----------------------------------------------
DDIV MACRO MCD1,MCD2,MCD3,COUNT
LOCAL _B06,_B07,_B08,_B09,_B10,_B11,_B12,_B13,_B14
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
PUSH DS
PUSH ES
MOV SI,SEG MCD2
MOV DS,SI
LEA SI,MCD2
MOV CX,COUNT
LEA BX,MCD3
MOV DI,SEG MCD1
MOV ES,DI
LEA DI,MCD1
PUSH BX
MOV AX,0
_B14: MOV [BX],AX
LOOP _B14
POP BX
MOV CX,1
_B06: MOV BP,[SI+2*COUNT-2]
TEST BP,8000H
JNZ _B07
PUSH SI
PUSH CX
MOV CX,COUNT
CLC
_B13: RCL WORD PTR [SI],1
INC SI
INC SI
LOOP _B13
POP CX
POP SI
INC CX
JMP _B06
_B07: PUSH SI
PUSH DI
PUSH CX
STD
ADD SI,2*COUNT-2
ADD DI,2*COUNT-2
MOV CX,COUNT
REPZ CMPSW
POP CX
POP DI
POP SI
JA _B09
PUSH SI
PUSH DI
PUSH CX
CLC
MOV CX,COUNT
_B11: MOV AX,[SI]
INC SI
INC SI
SBB [DI],AX
INC DI
INC DI
LOOP _B11
POP CX
POP DI
POP SI
STC
JMP _B10
_B09: CLC
_B10: PUSH BX
PUSH CX
MOV CX,COUNT
_B12: RCL WORD PTR [BX],1
INC BX
INC BX
LOOP _B12
POP CX
POP BX
PUSH SI
PUSH CX
ADD SI,2*COUNT-2
MOV CX,COUNT
CLC
_B08: RCR WORD PTR [SI],1
DEC SI
DEC SI
LOOP _B08
POP CX
POP SI
LOOP _B07
POP ES
POP DS
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
ENDM
;-----------------------------------------------------
;*******************************************
DSEG SEGMENT
;------------------------------------
DIVEE_128 DQ ?,?
DIVER_64 DQ ?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -