📄 romos.asm
字号:
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 + -