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