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

📄 romos.asm

📁 bios嵌入DOS操作系统,可以先编译romos.asm制作成BIN文件,加载至BIOS的ISA模块.另外还有制作工具
💻 ASM
📖 第 1 页 / 共 3 页
字号:
RUN1ST: CALL	WCRLF		;newline / odradkuj
	MOV	SI,MSG1 	;prompt to press HotKey / vyzva ke stisku HotKey
	MOV	BX,810Fh	;white color, 1-times + CRLF / bila barva, opakovani 1x a odradkuj
	CALL	WRITE		;write message / vypis hlasku
	MOV	AH,ROMOS_MSG_DELAY ;wait / pockej
	CALL	DELAY
;TEST FOR SCROLLOCK		;test if HotKey was pressed / otestuj, jestli je stisknuty HotKey
	PUSH	BYTE 0		;push 00
	POP	ES		;pop 0000 (ES=0, segment of keyboard flags / segment flagu klavesnice)
	MOV	AL,[ES:0417h]	;offset of keyboard flags / offset flagu klavesnice 0417h
	MOV	AH,AL		;store loaded value to AH / schovej si nactenou hodnotu do AH
	AND	AL,ROMOS_HOTKEY ;mask the HotKey / vymaskuj HotKey
	CMP	AL,ROMOS_HOTKEY ;if it is turned on then / je-li zaply,
%ifdef HOOK_INT19H		;if we want to hook INT 19h
	JE	EXIT_AND_HOOK_INT19H ;exit and hook INT 19h / skonci a hookni INT 19h
%else				;or if we boot directly without hooking INT 19h / pokud nechcem hooknout INT 19h
	JE BOOT 		;then go to boot ROMOS / pak jdi primo na sekci BOOT
%endif				;if we don't want to run ROMOS then
	MOV	[CS:0],ES	;erase 55AAxx (ES=0) ROM header, then BIOS will free this area for UMB / smaz hlavicku ROM 55AAxx (ES=0)...
	JMP	EXIT		;end without hook of INT 19h / skonci bez hooknuti INT 19h

;************** Terminating and restoring, returning controll back to BIOS ***
;************** Ukonceni, obnoveni stavu a predani rizeni zpet BIOSu *********
EXIT_AND_HOOK_INT19H:
%ifdef HOOK_INT19H		;only if we want to hook INT 19h otherwise skip this / jen pokud chceme hooknout INT 19h
;here you can place a code which should be executed on 1st run-during ROMSCAN
;zde je jeste mozno pridat kod, ktery se ma provest pri prvnim spusteni-ROMSCAN
	MOV	AL,ROMOS_HOTKEY ;load HotKey bit mask / nacti bitovou masku HotKey
	NOT	AL		;negate HotKey bit mask / zneguj bitovou masku HotKey
	AND	AH,AL		;turn off the HotKey / zhasni HotKey
	MOV	[ES:0417h],AH	;write keyboard flag (ES=0, see above) / zapis flag klavesnice
;HOOK INT 19h
	MOV	[ES:INT19H],WORD BEGIN ;put ROM module address here ,/ vlozime tam adresu ROM modulu,
	MOV	[ES:INT19H+2],CS;offset first, then segment / napred offset a pak segment
%endif
EXIT:
	POP	DS		;restore DS (2B) / obnov DS (2B)
	POP	ES		;restore ES (2B) / obnov ES (2B)
	POP	BX		;get BX=original SP / nacti BX=puvodni SP
	POP	SS		;restore SS=original SS / obnov SS=puvodni SS
	MOV	SP,BX		;restore SP=original SP / obnov SP=puvodni SP
	POPA			;restore regs DI,SI,BP,SP,BX,DX,CX,AX (16B) / obnov registry...
	POPF			;restore flags (2B) / obnov flagy (2B)

%ifdef MAKE_DEBUG_COM
	INT	20h		;use if compiling *.COM file / pouzij pri kompilaci .COM souboru
%else
	RETF			;CBh - FAR RET
%endif

;************** Here you can place your code without risks - it can be skipped when booting
;************** Zde uz je mozno psat kod bez obav, lze ho pri bootu preskocit
BOOT:				;this code is executed after POST is finished / tento kod se uz provadi po ukonceni POST
				;when INT 19h is invoked ROM area is write protected / pri volani INT19h, ROM pamet je zamcena pro zapis
	CALL	WCRLF		;newline / odradkuj
	MOV	SI,MSG2
	MOV	BX,810Eh	;yellow color, 1-times + CRLF / zluta barva, opakovani 1x a odradkuj
	CALL	WRITE		;write welcome message / vypis welcome
	MOV	AH,20		;20*55ms delay / pauza
	CALL	DELAY

	CALL	INSTALL_NEW_INT13H ;install new INT 13h handler / nainstaluj novou obsluhu INT 13h
	CALL	DELAY		;for accessing virtual ROM disk / pro pristup k virtual ROM disku

	MOV	SI,MSG3
	MOV	BX,8107h	;grey color, 1-times + CRLF / seda barva, opakovani 1x a odradkuj
	CALL	WRITE		;write isntall ROMDISK message / vypis isntall ROMDISK
	CALL	DELAY

	CALL	WCRLF		;newline / odradkuj
	CALL	WREGS		;write registers dump / vypis registry
	CALL	DELAY

	MOV	SI,MSG4
	MOV	BX,0107h	;grey color, 1-times / seda barva, opakovani 1x
	CALL	WRITE		;write Bootsector loaded at message / vypis Bootsector loaded at
	MOV	DX,BS_SEGMENT	;prepare segment to DX / priprav segment do DX
	MOV	CX,BS_OFFSET	;prepare offset to CX / priprav offset do CX
	CALL	WHEXPTR 	;write pointer / vypis pointer
	CALL	WCRLF		;newline / odradkuj

	MOV	SI,MSG5
	MOV	BX,810Fh	;white color, 1-times + CRLF / bila barva, opakovani 1x a odradkuj
	CALL	WRITE		;write Booting! message / vypis Booting!
	MOV	AH,10		;10*55ms delay / pauza
	CALL	DELAY

;************** Copy bootsector from virtual ROM disk at starting address ****
;************** Prekopiruje bootsector z virtual ROM disku na spousteci adresu
	PUSH	BYTE 0		;push 00
	POP	ES		;pop 0000 (ES=0, segment BIOS data)
	MOV	SI,0410h	;prepare address of equipment Byte (INT11h) / priprav adresu Bytu vybaveni (INT11h)
	MOV	AL,[ES:SI]	;two top bits means number of drives-1 / horni dva bity udavaji pocet mechanik-1
	MOV	AH,BYTE ROMDISK_DRIVE ;so: any=00, A:=00, A:+B:=01 / tedy: zadna=00, A:=00, A:+B:=01
	CMP	AH,1		;if we have to emulate B: drive / pokud mame emulovat jednotku B:
	JNE	SKIP_DRVNUPD	;else leave / jinak nech bejt
	OR	AL,01000000b	;number of drives is needed to be increased / je potreba zvysit pocet mechanik
	MOV	[ES:SI],AL	;write updated equipment Byte / zapis aktualizovany Byte vybaveni
SKIP_DRVNUPD:
	PUSH	WORD BS_SEGMENT ;prepare destination segment for bootsector / priprav cilovy segment pro nahrani bootsectoru
	POP	ES		;set ES=BS_SEGMENT / nastav ES=BS_SEGMENT
	MOV	DI,BS_OFFSET	;prepare destination offset for bootsector / priprav cilovy offset pro nahrani bootsectoru
	PUSH	CS		;prepare source segment / priprav zdrojovy segment
	POP	DS		;set DS=CS / nastav DS=CS
	MOV	SI,IMG_BEGIN	;prepare source offset - beginning of the ROMDISK image / priprav zdrojovy offset-zacatek ROMDISK image
	MOV	CX,512		;1 sector=512B
	REP	MOVSB		;copy until CX is nonzero / kopiruj dokud CX neni nulove
	MOV	[ES:BS_OFFSET+BS_DRIVE_OFFSET], BYTE ROMDISK_DRIVE ;patch bootsector by drive number / patch bootsectoru podle c. drive
	MOV	DL,BYTE ROMDISK_DRIVE ;set bootdrive for bootsector / nastav bootdrive pro bootsector
	JMP	BS_SEGMENT:BS_OFFSET  ;jump to beginning of bootsector copy / skoc na zacatek kopie bootsectoru


;************** Include VIRTUAL ROMDISK image / Vloz VIRTUAL ROMDISK image
IMG_BEGIN			;append binary file of romdisk image at the end / nakonec pripoj binarni soubor image disku
;	 incbin "romd15kb.img"	 ;FAT12 (1x), C:2, H:1, S:18, S/CL:1, ROOTE:16
;	 incbin "romd54kb.img"	 ;FAT12 (1x), C:6, H:1, S:18, S/CL:1, ROOTE:16
	incbin "romd64kb.img"	;FAT12 (1x), C:7, H:1, S:18, S/CL:1, ROOTE:16
;	 incbin "romdusb.img"	 ;FAT12 (1x), C:7, H:1, S:18, S/CL:1, ROOTE:16
IMG_END
TIMES ROM_IMAGE_SIZE*1024-($-$$) db 0 ;zero padding to required length / zarovnani nulami na danou velikost
END

;************** Block diagram for HOOK_INT19H option enabled *****************
;				(BEGIN)
;			___________|____________
;		       |store regs, old stack...|
;			~~~~~~~~~~~|~~~~~~~~~~~~
;			  _________|_________
;    ___________________/'    running 1st?   `\
;   |  go to BOOT    Y `\ (called by ROMSCAN) /'
;   |			 ~~~~~~~~N~|~~~~~~~~~~
;   |				   | RUN1ST:
;   |			 __________|___________
;   |			|display HotKey message|
;   |			 ~~~~~~~~~~|~~~~~~~~~~~
;   |			      _____|_____
;   |			    /' was HotKey`\_________________________________
;   |			    \	pressed?  /  Y	go to EXIT_AND_HOOK_INT19H  |
;   |			     ~~~~~~|~N~~~~				    |
;   |			 __________|___________ 			    |
;   |			|delete 55AA ROM header|			    |
;   |			 ~~~~~~~~~~|~~~~~~~~~~~ 			    |
;   |				   |		     ,----------------------'
;   |				   |		     | EXIT_AND_HOOK_INT19H:
;   |				   |	  ___________|____________
;   |				   |	 |     disable hotkey	  |
;   |				   |	 |(exec some 1st-run code)|
;   |				   |	 |  hook INT 19h to ROM   |
;   |				   |	  ~~~~~~~~~~~|~~~~~~~~~~~~
;   |				   `-----------------| EXIT:
;   |					 ____________|_____________
;   |					|restore regs, old stack...|
;   |					|     and RETF to BIOS	   |
;   |					 ~~~~~~~~~~~~~~~~~~~~~~~~~~
;   `------------->----------------,
;				   | BOOT: (note: this is right place for user code)
;		   ________________|_________________
;		  |	 display some messages	     |
;		  |    install new INT13h handler    |
;		  |	 look for number of FDDs     |
;		  |copy bootsector from image to RAM |
;		  |patch bootdrive Byte in bootsector|
;		  |jump to bootsector (never return) |
;		   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
;************** Block diagram for HOOK_INT19H option disabled ****************
;				(BEGIN)
;			___________|____________
;		       |store regs, old stack...|
;			~~~~~~~~~~~|~~~~~~~~~~~~
;			 __________|___________
;			|display HotKey message|
;			 ~~~~~~~~~~|~~~~~~~~~~~
;			      _____|_____
;		    ________/' was HotKey`\
;		   |	  Y \	pressed?  /
;		   |	     ~~~~~~|~N~~~~
;		   |	 __________|___________
;		   |	|delete 55AA ROM header|
;		   |	 ~~~~~~~~~~|~~~~~~~~~~~
;		   |		   | EXIT:
;		   |   ____________|_____________
;		   |  |restore regs, old stack...|
;		   |  |     and RETF to BIOS	 |
;		   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~
;		   |
;		   `------->-------,
;				   | BOOT: (note: this is right place for user code)
;		   ________________|_________________
;		  |	 display some messages	     |
;		  |    install new INT13h handler    |
;		  |	 look for number of FDDs     |
;		  |copy bootsector from image to RAM |
;		  |patch bootdrive Byte in bootsector|
;		  |jump to bootsector (never return) |
;		   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

⌨️ 快捷键说明

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