📄 cosboot.asm
字号:
CODE SEGMENT PARA USE16
ASSUME CS:CODE
ORG 7C00H ;COS boot program until NEWBOOT_END
NEWBOOT: JMP BEGIN
ORG 7C3EH
BEGIN:
XOR AX,AX
MOV SS,AX
MOV SP,7C00H
PUSH SS
POP ES
PUSH ES
POP DS
STI
CLD
test1: ;load the file "load.3g" to 800h (now COSBOOT be at 7C00h)
MOV SI,7C00h
XOR AX,AX
CMP [SI+13H],AX
JZ L1
MOV CX,[SI+13H]
MOV [SI+20H],CX
L1: MOV AL,[SI+10H]
MUL WORD PTR [SI+16H]
ADD AX,[SI+0EH]
ADC DX,+0
MOV WORD PTR DIR_FS+7,AX ;7C50 save root dir 1st sector_no
MOV WORD PTR DIR_FS+9,DX ;7C52
MOV WORD PTR DIR_FS,AX ;7C49
MOV WORD PTR DIR_FS+2,DX ;7C4B
MOV AX,20H
MUL WORD PTR [SI+11H] ;dx:ax bytes of root_dir
MOV BX,[SI+0BH] ;bx=bytes per sector
ADD AX,BX
DEC AX
DIV BX
ADD WORD PTR DIR_FS,AX ;save file area 1st sector_no
ADC WORD PTR DIR_FS+2,+0
MOV DX,WORD PTR DIR_FS+9 ;7c52h
MOV AX,WORD PTR DIR_FS+7 ;7c50h dx:ax root dir 1st sector_no
CALL SECTOR_ADDR
JB ERROR_IN
MOV AL,1
MOV BX,0500H ;input buf
CALL READ_SECTOR ;load.3g should be in 1st sector
JB ERROR_IN
MOV BL,16
MOV WORD PTR DIR_FS+13,SI
MOV DI,0500H
L2: MOV CX,000BH
MOV WORD PTR DIR_FS+15,DI
MOV SI,OFFSET FNAME0
REPZ CMPSB
JZ READ_OK
DEC BL
JZ ERROR_IN
MOV DI,WORD PTR DIR_FS+15
ADD DI,32
JMP L2
READ_OK: ;found load.3g di point just after file_name
MOV SI,WORD PTR DIR_FS+13
MOV AX,DI
ADD AX,15
MOV DI,AX
MOV AX,[DI] ;cluster
; read load.3g--->800H
;from cluster -->logical sector_no
XOR DX,DX
SUB AX,2
MUL WORD PTR [SI+0DH]
ADD AX,WORD PTR DIR_FS
ADC DX,+0 ;dx:ax logical sector_no
; Read load.3g
READ_FILE:
MOV WORD PTR DIR_FS,AX
MOV WORD PTR DIR_FS+2,DX
CALL SECTOR_ADDR
JB ERROR_IN
MOV AL,4
MOV BX,800H
CALL READ_SECTOR ;load.3g should be in 1st sector
JB ERROR_IN
;
READ_FILE_END:
DB 0EAH
DW 800H,0 ;for ok
;DW 800H,code ;???for test 1/2
ERROR_IN: MOV BP,OFFSET ERROR1
CALL DO_ERROR
TTT:
jmp G_RETURN
READ_SECTOR PROC NEAR
MOV AH,2
MOV DX,WORD PTR DIR_FS+4 ;cylinder=7C4D
MOV CL,6
SHL DH,CL
OR DH,DIR_FS+6 ;sector=7C4F
MOV CX,DX
XCHG CH,CL
MOV DL,[SI+24H]
MOV DH,[SI+25H] ;head
INT 13H
RET
READ_SECTOR ENDP
SECTOR_ADDR PROC NEAR
ADD AX,1
ADC DX,+0
ADD AX,[SI+1CH]
ADC DX,[SI+1EH] ;DX:AX =A
PUSH AX
PUSH DX
MOV AX,[SI+1AH]
MUL WORD PTR [SI+18H]
MOV WORD PTR DIR_FS+11,AX
POP DX
POP AX
DIV WORD PTR DIR_FS+11
MOV WORD PTR DIR_FS+4,AX ;Cylinder_no
XCHG AX,DX
XOR DX,DX
DIV WORD PTR [SI+18H]
MOV [SI+25H],AL ;head_no
MOV DIR_FS+6,DL ;Sector_no 7C4f
CLC
RET
EEE: STC
RET
SECTOR_ADDR ENDP
DO_ERROR PROC NEAR
MOV AX,1301H ;display M1
MOV DX,0A00H
MOV BX,7H
;MOV BP,OFFSET ERROR1
MOV SI,BP
MOV CL,[SI]
XOR CH,CH
INC BP
INT 10H
;DO_ERROR0: JMP DO_ERROR0 ;OK after test
RET
DO_ERROR ENDP
FNAME0 DB 'LOAD 3G '
ERROR1 DB 15H,'Non-System disk error'
ERROR2 DB 10H,'Error loading OS'
DIR_FS DB 16 DUP(0)
NEWBOOT_END:
ORG 7E00H
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 ;clear screen
MOV BH,07H
MOV CX,0
MOV DX,184FH
INT 10H
MOV AX,1301H ;display head
MOV DX,0217H
MOV BX,12H
MOV BP,OFFSET HEAD
MOV SI,BP
MOV CL,[SI]
XOR CH,CH
INC BP
INT 10H
MOV AX,1301H ;display SELECT
MOV DX,0400H
MOV BX,07H
MOV BP,OFFSET SEL_PART
MOV SI,BP
MOV CL,[SI]
XOR CH,CH
INC BP
INT 10H
KEY: MOV AH,10H
INT 16H
CMP AL,33H
JE READ_PRI
CMP AL,34H ;up
JE READ_PRI
JNE KEY
READ_PRI:
PUSH AX
;;;;;;;;;;;;;;;;;;;;; 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
POP AX
CMP AL,33H
JE P3
; 4 partition
ADD SI,1EEH
p3: ADD SI,1DEH ; 3 partition
MOV [SI],90H
MOV DX,[SI]
MOV CX,[SI+2]
MOV DL,80H
PUSH DX
PUSH CX
;;;;;;;;;;;;;;;;;;;;; read COSBoot use INT13H 02
MOV BX,OFFSET COSBOOT
MOV AH,2
MOV AL,1
INT 13H ;=bios 13h
MOV SI,OFFSET COSBOOT ;0-3DH to NEWBOOT
MOV DI,OFFSET NEWBOOT
MOV CX,3EH
REPZ MOVSB
;jmp test1 ;CUT OFF AFTER TEST ???2/2
MOV SI,OFFSET COSBOOT ;0-3DH to OKBOOT
MOV DI,OFFSET OKBOOT
MOV CX,3EH
REPZ MOVSB
MOV SI,OFFSET BEGIN
MOV DI,OFFSET OKBOOT
ADD DI,3EH
MOV CX,OFFSET NEWBOOT_END
SUB CX,SI
REPZ MOVSB
MOV DI,OFFSET OKBOOT
MOV [DI+1FEH],055H
MOV [DI+1FFH],0AAH
;;;;;;;;;;;;;;;;;;;;; SAVE OKboot use INT13H 03
MOV BX,OFFSET OKBOOT
MOV AH,3
MOV AL,1
POP CX
POP DX
INT 13H ;=bios 13h
JNZ D_ERROR
;;;;;;;;;;;;;;;;;;;;; SAVE priboot use INT13H 02
MOV AX,SEG CODE
MOV DS,AX
MOV ES,AX
MOV BX,OFFSET PRIBOOT
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
JMP G_RETURN
D_ERROR:
MOV AX,1301H ;display
MOV DX,0800H
MOV BX,12H
MOV CX,21
MOV BP,OFFSET G_ERROR
INT 10H
G_RETURN:
MOV AX,4C00H
INT 21H
HEAD DB 34,'COS Operating System Setup Program'
SEL_PART DB 37,'Please select the partition(3 OR 4) :'
G_OK DB 24,'Modified priboot success'
G_ERROR DB 'Modified priboot fail'
FNAME DB 'LOAD 3G '
STACK0 DB 512 DUP(?)
PRIBOOT DB 512 DUP(0)
COSBOOT DB 512 DUP(0)
OKBOOT 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
TEST_DISP PROC FAR
;IN: BP:offset cx:count for display
PUSH AX
PUSH BX
PUSH DX
PUSH SI
MOV AX,1301H
MOV DX,0A00H
MOV BX,7H
;MOV BP,OFFSET ERROR1
MOV SI,BP
INC BP
INT 10H
POP SI
POP DX
POP BX
POP AX
RET
TEST_DISP ENDP
org 9000h
db 1024 dup(0)
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -