⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cosboot.asm

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 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 + -