www.pudn.com > czxtsycx1.zip > 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