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

📄 floppy_device.asm

📁 jserv写的orz小内核 有详细的注释
💻 ASM
字号:
%include "orzmicro.inc"%include "floppy_device.inc"%include "lowlevel.inc"		db "ORZEXE.0"		; Executable file revision 0 id		dd 0x1000		; Stack size		dd _DATA_LEN		; Data size[ORG -0x10][BITS 32]		xor eax,eax		mov [devCount],eaxStart:		mov edi,msgBuf		mov edx,msgBuf_len		int i_GetMessage		jnz Process		xor ebx,ebx		xor ecx,ecx		xor edx,edx		mov eax,msg_Sleep		int i_SendMessageW		jmp StartProcess:	cmp eax,dev_Open		jnz Process0		jmp OpenDeviceProcess0:	cmp eax,dev_Close		jnz Process1		jmp CloseDeviceProcess1:	cmp eax,dev_ReadSector		jnz Process2		jmp ReadSectorProcess2:		xor eax,eax		xor ecx,ecx		int i_ProcessMessage		jmp Start;------------------------------------------------------------------------------------OpenDevice:	mov eax,[devCount]		inc eax		mov [devCount],eax		xor ecx,ecx		int i_ProcessMessage		jmp Start;------------------------------------------------------------------------------------CloseDevice:	xor eax,eax		xor ecx,ecx		int i_ProcessMessage		jmp Start;------------------------------------------------------------------------------------ReadSector:	mov [rmRegs+krnl_RmodeInt.intNum],BYTE 0x13		mov [rmRegs+krnl_RmodeInt.r_es],WORD RMODE_SPACE_SEG		mov [rmRegs+krnl_RmodeInt.r_bx],WORD 0		mov al,[drive]		mov [rmRegs+krnl_RmodeInt.r_dl],al		mov [rmRegs+krnl_RmodeInt.r_ax],WORD 0x0201		xor edx,edx		mov eax,[msgBuf+sdev_ReadSector.sectorL]		div DWORD [sectPerTrack] 		inc dl					; sector = 1 + sector_LBA % sectPerTrack		mov [rmRegs+krnl_RmodeInt.r_cl],dl	; CL = sector 		xor edx,edx		div DWORD [heads]			; head = (sector_LBA/sectPerTrack) % heads		mov [rmRegs+krnl_RmodeInt.r_dh],dl	; DH = head 		mov [rmRegs+krnl_RmodeInt.r_ch],al	; cyl = (sector_LBA/sectPerTrack) / heads, CH = cyl		mov eax,msg_RmodeInt		xor ebx,ebx		mov esi,rmRegs		mov ecx,krnl_RmodeInt.msize		mov edi,esi		mov edx,ecx		int i_SendMessageW		movzx eax,WORD [rmRegs+krnl_RmodeInt.r_flags]		test eax,CF_OR		jz ReadSector1		; read error		mov ecx,511		mov esi,sec		mov edi,sec+1		mov [esi],BYTE 0		rep movsb		jmp ReadSector2ReadSector1:	mov ecx,512		mov esi,RMODE_SPACE		mov edi,secReadSector0:	mov eax,[gs:esi]		stosd		add esi,4		loop ReadSector0ReadSector2:	mov esi,sec		mov ecx,512		int i_ProcessMessage		jmp Start;------------------------------------------------------------------------------------drive		db 0sectPerTrack	dd 18		; only for 1'44heads		dd 2;------------------------------------------------------------------------------------;;;; DATA;------------------------------------------------------------------------------------_DATA_START	equ $rmRegs		equ _DATA_START_end_rmRegs	equ rmRegs+krnl_RmodeInt.msizedevCount	equ _end_rmRegs_end_devCount	equ devCount+4msgBuf		equ _end_devCountmsgBuf_len	equ 0x100_end_msgBuf	equ msgBuf+msgBuf_lensec		equ _end_msgBuf_end_sec	equ sec+512_DATA_LEN	equ _end_sec-_DATA_START

⌨️ 快捷键说明

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