📄 priboot.asm
字号:
CODE SEGMENT PARA USE16
ASSUME CS:CODE
ORG 0600H
NEWBOOT:
XOR AX,AX
MOV SS,AX
MOV SP,7C00H
MOV SI,SP
PUSH AX
POP ES
PUSH AX
POP DS
STI
CLD
;MOV SI,7C00H ;BOOT sector moved to 600h
MOV DI,0600H
MOV CX,0200H
REPZ MOVSB
DB 0EAH
DW OFFSET BEGIN,0
;TEST1: 1/3
BEGIN:
MOV AX,0600H
MOV BH,07H
MOV CX,0
MOV DX,184FH
INT 10H
MOV AX,1301H ;display menu
MOV DX,0200H
MOV BX,12H
MOV CX,29
MOV BP,OFFSET M1
INT 10H
MOV BX,070H
CALL DISPM2
MOV BX,7
CALL DISPM3
MOV AX,1301H
MOV DX,0700H
;MOV BX,7
MOV CX,35
MOV BP,OFFSET M4
INT 10H
MOV SI,0 ;0:DOS 1:COS
KEY: MOV AH,10H
INT 16H
CMP AL,0DH
JE SELECTED
CMP AH,48H ;up
JE G48H
CMP AH,50H
JNE KEY
CMP SI,0 ;50h down
JNE KEY
INC SI
MOV BX,07H
CALL DISPM2
MOV BX,70H
CALL DISPM3
JMP KEY
G48H:
CMP SI,1 ;48h up
JNE KEY
DEC SI
MOV BX,070H
CALL DISPM2
MOV BX,7H
CALL DISPM3
JMP KEY
SELECTED: ;SI=0: DOS =1:COS look for 80H(DOS) or 90H(COS)
MOV AH,2
MOV BH,0
MOV DX,0900H
INT 10H
ADD SI,8
MOV CL,12
SHL SI,CL
MOV AX,SI ;Ah=80H or 90H
MOV SI,07BEH
MOV CX,4
FIND:
CMP [SI],AH
JZ IS_ONE
ADD SI,+10H
LOOP FIND
MOV BP,OFFSET ERROR1 ; no 80h or 90h
ERROR0:
MOV SI,BP
XOR CH,CH
MOV CL,[SI]
INC BP
MOV SI,1FFFH
ERROR11:
MOV AX,1301H
MOV DX,0800H
MOV BX,12H
INT 10H
DEC SI
JNZ ERROR11
INT 18H ;jmp end_ok ;INT 18H
IS_ONE:
MOV DX,[SI]
MOV DL,80H ;only driver no=1
MOV BX,[SI+2]
MOV BP,SI ;
NEXT: ADD SI,+10
DEC CL
JZ READ_DOSBOOT
CMP BYTE PTR [SI],AH
JNE NEXT
MOV BP,OFFSET ERROR1
JMP ERROR0
READ_DOSBOOT: ; only one 80h or 90h
MOV DI,5
READ_DOSBOOT1:
MOV CX,BX ; cylinder ???
MOV BX,7C00H ;OFFSET PRIBOOT ;7C00H
MOV AX,0201H
PUSH DI
INT 13H
JNB READ_DOSBOOT_OK
XOR AX,AX
INT 13H
POP DI
DEC DI
JNZ READ_DOSBOOT1
MOV BP,OFFSET ERROR2
JMP ERROR0
READ_DOSBOOT_OK:
MOV BP,OFFSET ERROR1
MOV SI,7DFEH ;OFFSET PRIBOOT ;7DFEH ???
CMP WORD PTR [SI],0AA55H
JZ G_RUN
MOV BP,OFFSET ERROR1
JMP ERROR0
G_RUN: MOV SI,BP
;jmp end_ok 2/3
DB 0EAH
DW 7C00H,0
DISPM2 PROC NEAR
MOV AX,1301H
MOV DX,0403H
MOV CX,12
MOV BP,OFFSET M2
INT 10H
RET
DISPM2 ENDP
DISPM3 PROC NEAR
MOV AX,1301H
MOV DX,0503H
MOV CX,12
MOV BP,OFFSET M3
INT 10H
RET
DISPM3 ENDP
M1 DB 'Select the Operating System: '
M2 DB 'MS-DOS '
M3 DB '3G-COS NUAA '
M4 DB 18H,19H,':move high light bar Enter:select'
ERROR1 DB 17H,'Invalid partition table'
ERROR2 DB 10H,'Error loading OS'
NEWBOOT_END:
ORG 0800H
START:
CLI
MOV AX,SEG CODE
MOV SS,AX
MOV DS,AX
MOV ES,AX
STI
MOV AX,OFFSET STACK0
ADD AX,511
MOV SP,AX
MOV AX,0600H
MOV BH,07H
MOV CX,0
MOV DX,184FH
INT 10H
MOV DX,0200H
MOV CX,1
MOV BP,OFFSET M2
ADD BP,4
INT 10H
;;;;;;;;;;;;;;;;;;;;; read priboot use INT13H 02
MOV AX,SEG CODE
MOV DS,AX
MOV ES,AX
MOV BX,OFFSET PRIBOOT
MOV AH,2
MOV AL,1
MOV CH,0 ;cylinder
MOV CL,1 ;sector
MOV DH,0 ;head
MOV DL,80H ;driver: hard disk 1
INT 13H ;=bios 13h
MOV SI,OFFSET PRIBOOT ;4 tables to 07BE
ADD SI,01BEH
MOV DI,07BEH
MOV CX,66
REPZ MOVSB
;JMP TEST1 3/3
JMP END_OK
;;;;;;;;;;;;;;;;;;;;; save priboot to C:\TC\G\BOOTTT.MBR
MOV DX,OFFSET FNAME
MOV CX,0
MOV AH,3CH ;CREAT FILE
INT 21H
MOV AL,01H ;FOR WRITE
MOV AH,3DH ;OPEN FILE
INT 21H
MOV BX,AX ;BX=FILE HANDLE
MOV DX,600H
MOV CX,512
MOV AH,40H ;WRITE FILE
INT 21H
MOV AH,3EH ;CLOSE FILE
INT 21H
jmp G_RETURN
END_OK:
;MOV AX,OFFSET NEWBOOT_END
;MOV BX,OFFSET NEWBOOT
;SUB AX,BX
;MOV CX,0a00H
;CALL DISP_EXT_AX_dos
;;;;;;;;;;;;;;;;;;;;; SAVE priboot use INT13H 03
MOV BX,0600H
MOV AH,3
MOV AL,1
MOV CH,0 ;cylinder
MOV CL,1 ;sector
MOV DH,0 ;head
MOV DL,80H ;driver: hard disk 1
INT 13H ;=bios 13h
JNZ D_ERROR
MOV AX,1301H ;display menu
MOV DX,0800H
MOV BX,12H
MOV CX,24
MOV BP,OFFSET G_OK
INT 10H
JMP G_RETURN
D_ERROR:
MOV AX,1301H ;display menu
MOV DX,0800H
MOV BX,12H
MOV CX,21
MOV BP,OFFSET G_ERROR
INT 10H
G_RETURN:
MOV AX,4C00H
INT 21H
FNAME DB "C:\TC\G\BOOTTT.MBR",0
G_OK DB 'Modified priboot success'
G_ERROR DB 'Modified priboot fail'
STACK0 DB 512 DUP(?)
ORG 7C00H ;1st boot table
PRIBOOT DB 512 DUP(0)
t_string DB 100 DUP(0)
DISP2_16_dos PROC FAR
;in al code 2 using ah
;out ah:al:code 16
mov ah,al
MOV CL,4
shr ah,CL
cmp ah,9
jle disp2_16_1_dos
add ah,7
disp2_16_1_dos: add ah,30h
and al,0fh
cmp al,9
jle disp2_16_2_dos
add al,7
disp2_16_2_dos: add al,30h
RET
DISP2_16_dos ENDP
DISP_EXT_AX_dos PROC FAR
;in cx:position
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,AX
mov al,BH
CALL DISP2_16_dos
mov DS:t_string,ah
mov DS:t_string[1],al
MOV AL,BL
CALL DISP2_16_dos
mov DS:t_string[2],ah
mov DS:t_string[3],al
mov DS:t_string[4],' '
mov DS:t_string[5],'$'
MOV AH,9
MOV DX,OFFSET t_string
;add dx,16
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
DISP_EXT_AX_dos ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -