;***************************************************************************** ;* .-= The ROMOS Project =-. * ;* ROM Operating System v. 0.01 by Martin žeh k (C) 2001; rayer@seznam.cz * ;* Started: 27.3.2001 * ;* Last updated: 5.3.2002 * ;* Tested on: Award BIOS 4.51PG, Octek Rhino II ZX * ;* Compile with NASM, recomended segmet to load: DC00h * ;***************************************************************************** ;%define MAKE_DEBUG_COM ;zkompiluje spustitelny *.COM soubor %ifdef MAKE_DEBUG_COM ORG 100h ;use if compiling .COM file %elifndef MAKE_DEBUG_COM ORG 0h ;use if compiling ROM image DW 0AA55h ;ROM header signature DB 08h ;ROM size in 512B blocks, minimum 8 blocks %endif JMP BEGIN ;skok na zacatek kodu DB 'CHKSUM=' DB 00h ;rezerva na korekci checksumu ;****************************** need to be manualy relocated ***************** M1 DB 'Press [ScrollLock] to boot ROMOS !',0 M2 DB 'Welcome to ROMOS ver. 0.01 by Martin Rehak (C) 2001-2002; rayer@seznam.cz',0 M3 DB 'SS=',0 M4 DB 'SP=',0 M5 DB 'DS=',0 M6 DB 'CS=',0 ;***************************************************************************** DELAY: ;pauza, do AH vloz pocet 55ms idle tiku STI ;povol preruseni, jinak se neaktualizuje casovac PUSH BX ;schovej BX PUSH ES ;schovej ES PUSHF XOR BX,BX ;segment casovace 0000 MOV ES,BX MOV AL,[ES:046Ch] ;offset casovace 046C ADD AH,AL ;pauza AH*55ms @DELAY: MOV AL,[ES:046Ch] ;precti tiky CMP AH,AL ;rovnaji se pozadovane a aktualni ? JNE @DELAY ;kdyz ne, opakuj POPF POP ES ;obnov ES POP BX ;obnov BX CLI ;opet zakaz preruseni RET ;navrat ;***************************************************************************** GOTOXY: PUSH AX ;nastavi kurzor na pozici [x,y] danou [DL,DH] PUSH BX MOV AH,02 ;funkce cislo 3 MOV BH,0 ;stranka INT 10h ;proved POP BX POP AX RET ;***************************************************************************** WHEREXY: PUSH AX ;precte pozici kurzoru [x,y] do [DL,DH] PUSH BX PUSH CX MOV AH,03 ;funkce cislo 3 MOV BH,0 ;stranka INT 10h ;proved POP CX POP BX POP AX RET ;***************************************************************************** WRITE: PUSH AX ;vypis vety z CS:SI atributem v BL PUSH CX ;a opakovanim jednotlivych znaku BH-krat PUSH DX PUSHF CALL WHEREXY ;precti pozici kurzoru [DL,DH] MOV AH,09h ;funkce na vypis znaku 9h XOR CX,CX ;snuluj CX, CH=0, CL=0 XCHG CL,BH ;opakovani znaku BH-krat, CH=0, CL=BH, BH=0 @WRI1: MOV AL,[CS:SI] ;nacti znak z retezce ukonceneho 0 CMP AL,0 ;je-li konec - 0 JE @WRI2 ;tak konec INT 10h ;proved INC SI ;inkrementuj index znaku ve vete INC DL ;inkrementuj X-ovou pozizi kurzoru CALL GOTOXY ;nastav kurzor na [DL,DH] (musim to delat rucne) JMP @WRI1 ;opakuj @WRI2: POPF POP DX POP CX POP AX ;obnov AX RET ;navrat ;***************************************************************************** WCRLF: PUSH AX ;vypis CRLF = novy radek PUSH BX MOV AX,0E0Dh ;funkce 0E - pis TTY znak, znak CR XOR BL,BL ;barva papiru 0 INT 10h ;proved MOV AL,0Ah ;znak LF INT 10h ;proved POP BX POP AX RET ;***************************************************************************** WHEXW: XCHG BH,BL ;vypis word z BX na obrazovku v hexa CALL WHEXB ;zavolej WHEXB na vypis horniho byte XCHG BH,BL CALL WHEXB ;zavolej WHEXB na vypis dolniho byte RET ;***************************************************************************** WHEXB: PUSH AX ;vypis byte z BL na obrazovku v hexa PUSH BX PUSHF MOV BH,BL AND BL,00Fh ;vymaskuj dolni cislici AND BH,0F0h ;vymaskuj horni cislici ROR BH,4 ;posun horni cislici o 4 bity vpravo ADD BL,48 ;pricti offset '0' ADD BH,48 CMP BL,58 ;je cislice vetsi nebo rovna A ? JC @WHB1 ;kdyz ne preskoc ADD BL,7 ;kdyz jo, pricti jeste offset 'A' @WHB1: CMP BH,58 JC @WHB2 ADD BH,7 @WHB2: MOV AH,0Eh ;vypis znak MOV AL,BH ;z AL INT 10h ;prez BIOS MOV AL,BL INT 10h POPF POP BX POP AX RET ;***************************************************************************** BEGIN: PUSH DS ;store all regs PUSH ES PUSHA PUSHF ;ASK FOR BOOT MOV SI,M1 MOV BX,010Fh ;bila barva, opakovani 1x CALL WCRLF ;odradkuj CALL WRITE ;vypis CALL WCRLF ;odradkuj MOV AH,30 ;30*55ms CALL DELAY ;TEST FOR SCROLLOCK XOR AX,AX ;otestuj, jestli je stisknuty ScrollLock MOV ES,AX ;segment flagu klavesnice 0000 MOV AL,[ES:0417h] ;offset flagu klavesnice 0417 AND AL,00010000b ;vymaskuj ScrollLock CMP AL,16 ;je-li zaply, JE @DOBOOT ;pokracuj v bootu ROMOSu JMP EXIT ;jinak skonci @DOBOOT:MOV AL,[ES:0417h] ;znova nacti flag klavesnice AND AL,11101111b ;zhasni ScrollLock MOV [ES:0417h],AL ;zapis flag ;***************************************************************************** BOOT: MOV SI,M2 MOV BX,010Eh ;zluta barva, opakovani 1x CALL WRITE ;vypis welcome CALL WCRLF ;odradkuj MOV AH,60 CALL DELAY MOV SI,M3 MOV BX,0107h ;seda barva, opakovani 1x CALL WRITE MOV BX,SS CALL WHEXW CALL WCRLF MOV SI,M4 MOV BX,0107h ;seda barva, opakovani 1x CALL WRITE MOV BX,SP CALL WHEXW CALL WCRLF MOV SI,M5 MOV BX,0107h ;seda barva, opakovani 1x CALL WRITE MOV BX,DS CALL WHEXW CALL WCRLF MOV SI,M6 MOV BX,0107h ;seda barva, opakovani 1x CALL WRITE MOV BX,CS CALL WHEXW CALL WCRLF MOV AH,60 CALL DELAY ; ****** DRAW SWISS FLAG BEGIN MOV AX,0013h INT 10h ; NAHOZENI MODU 13h MOV AX,0A000h ; A ULOZENI SEGMENTU VIDEOPAMETI MOV ES,AX MOV DX,320 ; OFFSET PRO POSUN NA DLASI RADKU MOV AL,4 ; BARVA CARY MOV BX,40 ; OFSET OD KRAJE MOV DI,240 ; DELKA CARY MOV CX,200 ; POCET CAR CALL BAR ; CERVENY CTVEREC MOV AL,15 ; BILA, BILA, BILA, KOMU BY SE NELIBILA MOV BX,7492 ; 23*320+132 MOV DI,56 MOV CX,154 ; 53+48+53 CALL BAR ; BILY SVISLY PRUH MOV BX,24388 ; 76*320+68 MOV DI,184 ; 64+56+64 MOV CX,48 CALL BAR ; BILY VODOROVNY PRUH MOV AH,60 CALL DELAY MOV AX,02 ; INT 10h ; NAHOZENI TXT MODU 02h %ifdef MAKE_DEBUG_COM INT 20h ; KONEC %endif JMP EXIT BAR: XOR SI,SI ; VYNULUJEM SI ADD SI,BX ; PRIPOCTEM POCATECNI OFFSET L2: PUSH CX ; ULOZIME POCITADLO VNEJSIHO CYKLU MOV CX,DI ; NAHRAJEM POCITADLO VNITRNIHO CYKLU ADD SI,CX ; PRIPOCITAME HO K OFFSETU L1: MOV [ES:SI],AL ; NAMALUJEM BARVU AL NA A000:SI DEC SI ; SNIZIME SI (MALUJU Z PRAVA DO LEVA) LOOP L1 ADD SI,DX ; SKOK NA DALSI RADKU POP CX ; VYTAHNEM POCITADLO VNEJSIHO SYKLU LOOP L2 RET ; ****** DRAW SWISS FLAG END ;***************************************************************************** EXIT: ; MOV AX,0 ;hook INT18h ; MOV ES,AX ; MOV SI,060h ;vektor INT18h zacina na adrese 0:0060 ; MOV BL,03h ;nastav ho na DC00:0003 ; MOV [ES:SI+0],BL ; MOV BL,0 ; MOV [ES:SI+1],BL ; MOV [ES:SI+2],BL ; MOV BL,0DCh ; MOV [ES:SI+3],BL MOV SI,0 ;na zaver smaz hlavicku MOV BL,0 ;BIOS pak uvolni tuto oblast MOV [CS:SI+0],BL ;jako UMB pro programy MOV [CS:SI+1],BL MOV [CS:SI+2],BL POPF POPA ;restore regs POP ES POP DS %ifdef MAKE_DEBUG_COM INT 20h ;use if compiling *.COM file %elifndef MAKE_DEBUG_COM RETF ;CBh - FAR RET %endif END