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

📄 bootload.lst

📁 嵌入式系统基础课件
💻 LST
📖 第 1 页 / 共 2 页
字号:
   157                                  
   158                                  	; Relocate image to 0000:0000
   159                                  	; Can't use the stack anymore!
   160                                  
   161 000000CF 5D                      		POP	BP		; retrieve ending src paragraph #
   162 000000D0 B88000                  		MOV	AX,0080H	; source segment
   163 000000D3 31DB                    		XOR	BX,BX		; destination segment
   164 000000D5 8B16[4800]              		MOV	DX,[paras_per_clust]
   165 000000D9 8B26[4000]              		MOV	SP,[bytes_per_clust]
   166 000000DD 89E1                    BL2:		MOV	CX,SP		; reload byte count
   167 000000DF 8ED8                    		MOV	DS,AX
   168 000000E1 8EC3                    		MOV	ES,BX
   169 000000E3 31F6                    		XOR	SI,SI
   170 000000E5 31FF                    		XOR	DI,DI
   171 000000E7 F3A4                    		REP	MOVSB
   172 000000E9 01D0                    		ADD	AX,DX
   173 000000EB 01D3                    		ADD	BX,DX
   174 000000ED 39E8                    		CMP	AX,BP
   175 000000EF 72EC                    		JB	BL2
   176                                  
   177                                  	; transfer control to the application
   178                                  
   179 000000F1 EA                      		DB	0EAh		; An direct intersegment
   180 000000F2 00000000                		DW	0,0		; jump to 0000:0000
   181                                  
   182                                  Find_File:
   183                                  ; ----------------------------------------------------------------
   184                                  ; Parameters:	None
   185                                  ; Returns:	DI = Starting Cluster
   186                                  ; Modifies:	BX, CX, BP, SI
   187                                  ; ----------------------------------------------------------------
   188 000000F6 8B2E[1100]              		MOV	BP,[dir_entries]; #entries to search
   189 000000FA 31DB                    		XOR	BX,BX		; start w/entry #0
   190 000000FC 80BF000200              FF1:		CMP	BYTE [buffer+BX],0
   191 00000101 741D                    		JE	FF3		; done if rest is unused
   192 00000103 F6870B0218              		TEST	BYTE [buffer+BX+11],00011000B
   193 00000108 750F                    		JNZ	FF4		; skip if dir or vol label
   194 0000010A 8D36[4E00]              		LEA	SI,[file2load]	; compare filename
   195 0000010E 8DBF0002                		LEA	DI,[buffer+BX]
   196 00000112 B90B00                  		MOV	CX,11
   197 00000115 F3A6                    		REP	CMPSB
   198 00000117 7408                    		JE	FF2
   199 00000119 81C32000                FF4:		ADD	BX,32		; BX -> next entry
   200 0000011D 4D                      		DEC	BP		; any more entries?
   201 0000011E 75DC                    		JNZ	FF1
   202 00000120 F4                      FF3:		HLT			; file not found
   203 00000121 8BBF1A02                FF2:		MOV	DI,[buffer+BX+1Ah]
   204 00000125 C3                      		RET
   205                                  
   206                                  Read_Cluster:
   207                                  ; ----------------------------------------------------------------
   208                                  ; Parameters:	DI = current cluster # (Preserved)
   209                                  ;		ES = buffer segment
   210                                  ; Returns:	Nothing
   211                                  ; Modifies:	AX, CX, DX, BP, ES, SI
   212                                  ; ----------------------------------------------------------------
   213 00000126 57                      		PUSH	DI
   214 00000127 0FB62E[0D00]            		MOVZX	BP,BYTE [sctrs_per_clust]
   215 0000012C 8D45FE                  		LEA	AX,[DI-2]	; 1st cluster in file space is #2
   216 0000012F F7E5                    		MUL	BP
   217 00000131 0306[4400]              		ADD	AX,[data_sector0]
   218 00000135 89C7                    		MOV	DI,AX		; DI = 1st logical sector
   219 00000137 31DB                    		XOR	BX,BX		; load at offset 0 of segment
   220 00000139 E82E00                  		CALL	Read_Sectors	; (Modifies AX,BX,CX,DX,SI,DI,BP)
   221 0000013C 8CC0                    		MOV	AX,ES
   222 0000013E 0306[4800]              		ADD	AX,[paras_per_clust]
   223 00000142 8EC0                    		MOV	ES,AX
   224 00000144 5F                      		POP	DI
   225 00000145 C3                      		RET
   226                                  
   227                                  Next_Cluster:
   228                                  ; ----------------------------------------------------------------
   229                                  ; Parameters:	DI = current cluster #
   230                                  ; Returns:	DI = next cluster #
   231                                  ; Modifies:	AX, CX, DX
   232                                  ; ----------------------------------------------------------------
   233 00000146 89F8                    		MOV	AX,DI
   234 00000148 F726[3E00]              		MUL	WORD [fat_nibbles]	; (DX will be zero)
   235 0000014C D1E8                    		SHR	AX,1		; AX = rel offset into FAT entries
   236 0000014E 9C                      		PUSHF			; CF = 1: Left-Aligned FAT12 entry
   237 0000014F 89C7                    		MOV	DI,AX
   238 00000151 58                      		POP	AX
   239 00000152 8BBD0002                		MOV	DI,[buffer+DI]
   240 00000156 813E[3E00]0400          		CMP	WORD [fat_nibbles],4	; FAT12 or FAT16?
   241 0000015C 740B                    		JE	NC2		; If FAT16, we're done.
   242 0000015E D1E8                    		SHR	AX,1		; Get CF
   243 00000160 7303                    		JNC	NC1
   244 00000162 C1EF04                  		SHR	DI,4		; Left-aligned FAT12
   245 00000165 81E7FF0F                NC1:		AND	DI,0FFFH
   246 00000169 C3                      NC2:		RET
   247                                  
   248                                  Read_Sectors:
   249                                  ; ----------------------------------------------------------------
   250                                  ; Parameters:	DI = 1st logical sector #
   251                                  ;		BP = sector count
   252                                  ;		ES:BX = load address
   253                                  ; Returns:	Nothing
   254                                  ; Modifies:	AX, BX, CX, DX, SI, DI, BP
   255                                  ; ----------------------------------------------------------------
   256 0000016A BE0300                  		MOV	SI,3		; retry count
   257 0000016D 89F8                    RS1:		MOV	AX,DI
   258 0000016F F636[1800]              		DIV	BYTE [sctrs_per_track]
   259 00000173 31D2                    		XOR	DX,DX		; DL = drive 0
   260 00000175 D0E8                    		SHR	AL,1
   261 00000177 D0D6                    		RCL	DH,1		; DH = head
   262 00000179 FEC4                    		INC	AH		; disk sectors start at 1
   263 0000017B 86C4                    		XCHG	AL,AH
   264 0000017D 89C1                    		MOV	CX,AX		; CH = track, CL = sector
   265 0000017F B80102                  		MOV	AX,0201H	; Read 1 sector
   266 00000182 CD13                    		INT	13H
   267 00000184 730B                    		JNC	RS3
   268 00000186 4E                      		DEC	SI		; decrement retry count
   269 00000187 7501                    		JNZ	RS2
   270 00000189 F4                      		HLT			; halt after 3 attempts
   271 0000018A 31C0                    RS2:		XOR	AX,AX		; reset disk...
   272 0000018C CD13                    		INT	13H
   273 0000018E E9DCFF                  		JMP	RS1		; ...and try again
   274 00000191 BE0300                  RS3:		MOV	SI,3		; reset retry count
   275 00000194 031E[0B00]              		ADD	BX,[bytes_per_sctr]
   276 00000198 47                      		INC	DI		; next logical sector
   277 00000199 4D                      		DEC	BP		; any more?
   278 0000019A 75D1                    		JNZ	RS1
   279 0000019C C3                      		RET
   280                                  
   281                                  Wait8042:
   282                                  ; ----------------------------------------------------------------
   283                                  ; Wait for 8042 to complete previous command.
   284                                  ; ----------------------------------------------------------------
   285 0000019D 31C9                    		XOR	CX,CX			; CX=65536 for timeout value
   286 0000019F E464                    Wait8042Loop:	IN	AL,64h			; Read the status port, find
   287 000001A1 A802                    		TEST	AL,00000010b		;   out if the buffer is full
   288 000001A3 E0FA                    		LOOPNZ	Wait8042Loop		; Loop until buffer empty
   289 000001A5 C3                      		RET
   290                                  
   291                                  Enable_A20:
   292                                  ; ----------------------------------------------------------------
   293                                  ; Enable the A20 line to make memory above 1MB accessible
   294                                  ; ----------------------------------------------------------------
   295 000001A6 E8F4FF                  		CALL	Wait8042		; Be sure 8042 is ready
   296 000001A9 7517                    		JNZ	EnableA20Failed
   297 000001AB B0D1                    		MOV	AL,~00101110b	; Prepare to Write output port
   298 000001AD E664                    		OUT	64h,AL
   299 000001AF E8EBFF                  		CALL	Wait8042
   300 000001B2 750E                    		JNZ	EnableA20Failed
   301 000001B4 B0DF                    		MOV	AL,~00100000b	; Enable the A20 line
   302 000001B6 E660                    		OUT	60h,AL
   303 000001B8 E8E2FF                  		CALL	Wait8042
   304 000001BB 7505                    		JNZ	EnableA20Failed
   305 000001BD 31C9                    		XOR	CX,CX			; Command started; give
   306 000001BF E2FE                    EnableA20Wait:	LOOP	EnableA20Wait		;   it time to complete.
   307 000001C1 C3                      		RET
   308 000001C2 F4                      EnableA20Failed:HLT
   309                                  
   310 000001C3 00<rept>                		TIMES	510 - ($-$$) DB	0
   311 000001FE 55AA                    		DW	0AA55h

⌨️ 快捷键说明

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