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

📄 win95.asm

📁 部分常用系统的引导程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
ShowErrMsg2:
                MOV     SI,OFFSET ErrMsg2 + 7C00H
                JMP     PrintMessage
LastChar:
                CBW                     ; Ah, clever... save one byte, take
                                        ; advantage of the fact that LODSB
                INT     16H             ; returns the null-terminator.

                POP     SI              ; restore the stack... why???
                POP     DS              ; the stack is killed at startup...
                POP     DWORD PTR [SI]  

                INT     19H             ; BIOS bootstrap loader...

Win95b          ENDP

;==========================================================================
;                              READ SECTOR
;==========================================================================

ReadSector      PROC    NEAR

                INC     CX                      ; increase SECTOR COUNT
ReadSectorX:

rsReadMore:
		PUSH	SI
		PUSH	DWORD PTR 0
                PUSH    DX
                PUSH    AX
		PUSH	ES
                PUSH    BX
		PUSH	1
		PUSH	10H

                MOV     SI,SP                   ; save stack pointer
                                                ; for later use by LEA

                PUSHA                           ; Save "all" registers

                CMP     BYTE PTR SS:[BP+2],0EH     ; Use INT13 extensions?
                JNE     rsOldINT13

                MOV     AH,42H                  ; Do ext INT13 READ
                JMP     RSDiskIO
rsOldINT13:
                XCHG    CX,AX                   ; swap CX and AX
                XCHG    DX,AX                   ; swap DX and AX
                XOR     DX,DX                   ; clear DX

                DIV     WORD PTR SS:[BP+18H]    ; div LBA_HI by sectors/track

                XCHG    CX,AX                   ; save result in CX and put
                                                ; the LBA_LO in AX

                DIV     WORD PTR SS:[BP+18H]    ; divide reminder and LBA_LO
                                                ; by sectors/track too

                INC     DX                      ; make sector 1-based

                XCHG    CX,DX                   ; save it in CX and get the
                                                ; result of the 1st division
                                                ; in DX

                DIV     WORD PTR SS:[BP+1AH]    ; divide this new result by
                                                ; heads per cylinder

                MOV     DH,DL                   ; save Head of CHS in DH
                                                ; head was in the reminder
                                                ; after the division above

                MOV     CH,AL                   ; save LO cylinder in CH
                                                ; cylinder was in the result
                                                ; after the division above

                ROR     AH,2                    ; rotate AH to make bits 8-9
                                                ; of cylinder appear as bits
                                                ; 6-7 in AH and...
                OR      CL,AH                   ; or it with the sector num

                MOV     AX,201H                 ; setup for READ - 1 sector
rsDiskIO:
                MOV     DL,SS:[BP+40H]          ; load drive number
                INT     13H                     ; call INT13

                POPA                            ; Restore "all" registers

        ; the entry code pushed 12h bytes on the stack...
        ; the last word pushed was 0001h, restore SP to point to it...

		LEA	SP,[SI+10H]		; Load effective addr

        ; Now, SI should contain 0001h

		POP	SI

        ; was there an error from INT13?

                JC      RSDone

                INC     AX                      ; increment LBA sector num
                JNZ     rsSkip                  ; wrap-around?

                INC     DX                      ; yes raise high word too
rsSkip:
                ADD     BX,SS:[BP+0BH]          ; increment by sector size

                DEC     CX                      ; decrement SECTOR COUNT
                JNZ     rsReadMore              ; Jump if more to read
rsDone:
                RET

ReadSector      ENDP

;============================================================================
;              DATA AREA FOR MESSAGES - IN "NORSK" NORWEGIAN
;============================================================================

ErrMsg1         DB      03H     ; Skip counter for message1
ErrMsg2         DB      18H     ; Skip counter for message2
ErrMsg3         DB      01H     ; Skip counter for message3
ErrMsg4         DB      27H     ; Skip counter for message4

                DB      13,10,'Ugyldig systemdisk ',-1
                DB      13,10,'Disk I/U-feil ',-1
                DB      13,10,'Sett inn en annen disk, og trykk en tast',13,10,0

;============================================================================

                DB      0,0                     ; Padding?

        ; ROOT file names to search for...?

IO_SYS          DB      'IO      SYS'
MSDOS_SYS       DB      'MSDOS   SYS'

                DB      7EH,1,0                 ; What is this?

WINBOOT_SYS     DB      'WINBOOT SYS'           ; When is this used?

                DB      0,0                     ; Padding?
                DW      0AA55H                  ; 1st Boot Signature

;
; BOOT RECORD - PART II - FSINFO sector
;
                DB      'RRaA'                  ; FAT32 Extension Signature

		DB	480 DUP (0)

; FSINFO information...

                DB      'rrAa'                  ; FAT32 FSINFO Signature

brFreeClusters  DD      56990           ; I have 233431040 bytes free!
brNextFree      DD      466175          ; My next free cluster!
                DD      3 DUP (0)       ; Reserved, acroding to FAT32API.HLP

                DW      ?               ; word padding

                DW      0AA55H                  ; 2nd Boot Signature
;
; BOOT RECORD - PART III - FAT32 specific code, I think? only Bill knows?
;
GOFAT32:
                CLI

        ; calculate total size of FAT area

                MOVZX   EAX,BYTE PTR SS:[BP+10H]        ; number of FATs
                MOV     ECX,SS:[BP+24H]                 ; sectors per FAT
                MUL     ECX                             ; mul'em

        ; add hidden sectors

                ADD     EAX,SS:[BP+1CH]

        ; add reserved sectors

                MOVZX   EDX,WORD PTR SS:[BP+0EH]
                ADD     EAX,EDX

                XOR     CX,CX           ; clear CX for some reason...
                                        ; By looking down the code, I can't
                                        ; seem to find out why CX is cleared
                                        ; It's set to 1 down there...
                                        ; before it's ever used...

        ; EAX will now point to the start of the data area (cluster 2)
        ; save start of data area below us at 0000:7BFC, or there around...

                MOV     SS:[BP-4],EAX

        ; Save another value to... This one is checked by GetFAT32Sector

                MOV     DWORD PTR SS:[BP-8],0FFFFFFFFH

        ; Oh... at Microsoft they take no chances... disable INTs again!
        ; This is what I call proper software writing! Hail M$

                CLI

        ; load Root Start Cluster in EAX

                MOV     EAX,SS:[BP+2CH]

        ; Is it cluster 2?

                CMP     EAX,2
                JB      ShowErrMsg1             ; error if less than 2

        ; Is it an EOF marker or something above?

                CMP     EAX,0FFFFFF8H
                JAE     ShowErrMsg1             ; error if it is

        ; Put upper 16-bits of cluster number into DX??

                SHLD    EDX,EAX,16

                STI                             ; Puh. Safe again.
GetRootCluster:
                PUSH    DX
                PUSH    AX

                CLI                             ; Eh?

        ; clear upper 16-bits of cluster number, and of course move up the
        ; lower bits...

                SHL     EAX,16

        ; shift lower 16-bits of cluster number back down, and at the same
        ; time shift in the high 16-bits in top of EAX?

                SHRD    EAX,EDX,16

        ; make cluster number 0-based... "the way it's supposed to be"

                SUB     EAX,2

        ; put Sectors Per Cluster in EBX

                MOVZX   EBX,BYTE PTR SS:[BP+0DH]

        ; save it in SI too! Yippi

                MOV     SI,BX

        ; calculate relative sector of first part of root... right?

                MUL     EBX

        ; add the "start of data area" value we saved below us!

                ADD     EAX,SS:[BP-4]

        ; Maybe now, some shitter is trying to make DX:AX what EAX is??
        ; Shift upper 16-bits of EAX into DX... and AX is lower bits...

                SHLD    EDX,EAX,10H

                STI				; Enable interrupts
GetRootSector:

        ; Use 0070:0000 as a directory buffer...
        
                MOV     BX,0700H
                MOV     DI,BX

        ; read 1 sector

                MOV     CX,1

                CALL    ReadSectorX             ; this shit should be pretty
                JC      ShowErrMsg2             ; obvious...
CheckEntry:
                CMP     [DI],CH                 ; is the first entry of the
                JE      EndOfRoot               ; root empty???

                MOV     CL,11                   ; the stupid CP/M filenames
                                                ; are 11 bytes...
                PUSH	SI

                MOV     SI,OFFSET IO_SYS + 7C00H

                REPE    CMPSB                   ; Is it IO.SYS?

                POP	SI

                JZ      FoundOS         ; Yeah...

                ADD     DI,CX           ; add what's left after CMPSB
                ADD     DI,15H          ; and then 21 more...

        ; Yeah, yeah, anyway... point to the next dir entry...
        ; and check if it is above the last entry... INT13 increments
        ; BX with 512 on the sector read, so it points past the sector.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -