;************************************************* ; ; BIOS pro CP/M ver.2.2 a IQ151 s FDC DISC 2M ; ; !!!!! Uprav VERZE !!!!! ; FALSE EQU 0 TRUE EQU NOT FALSE ; TSTVER EQU FALSE ;priznak testovaci verze do RAM IQ151F EQU TRUE ;IQ151 s upravenym refreshem ; IF TSTVER BTROM EQU 0B9C0H ;testovaci verze ENDIF ; IF NOT TSTVER BTROM EQU 0F9C0H ;verze do MONITORu ENDIF ; CCPL EQU 800H ;delka CCP BDOSL EQU 0E00H ;delka BDOS CPML EQU CCPL+BDOSL ;delka systemu CP/M CCPE EQU 0-CPML ;vstup CCP vuci BIOS BDOSE EQU CCPE+806H ;vstup BDOS vuci BIOS NSECTS EQU CPML/128 ;delka CCP+BDOS v sektorech BUFF EQU 0080H ;implicitni buffer ; NDISK EQU 2 ;pocet jednotek IF TSTVER AND IQ151F RETRY EQU 1 ;pocet opakovani diskove operace ENDIF IF NOT TSTVER AND IQ151F RETRY EQU 3 ENDIF IF NOT IQ151F RETRY EQU 5 ENDIF ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Skokovy vektor a tabulky DPH BIOSu ; Pri CBOOT kopirovany do RAM na (MEMTOP)-256 = BIOS ; IF TSTVER ORG BTROM JMP CBOOT ENDIF ; IF NOT TSTVER ORG BTROM+3 ENDIF ; WBOOTE EQU $-BTROM ;offset vuci pocatku vektoru JMP WBOOT JMP CONST JMP CONIN JMP CONOUT JMP QLO JMP QPO JMP QRI JMP HOME JMP SELDSK JMP SETTRK JMP SETSEC JMP SETDMA JMP READ JMP WRITE LISTST: MVI A,0 RET JMP SECTRAN ; JMP CRW2 ; DPBASE EQU $-BTROM ;offset tabulek DPH vuci skok. vektoru ; DW XLTSD,0,0,0,DIRBUF,DPBSD,CSVA,ALVA DW XLTSD,0,0,0,DIRBUF,DPBSD,CSVB,ALVB ; CAPLCK EQU $-BTROM DB 20H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Definice pracovni oblasti ; WRAM EQU $-BTROM ;offset pocatku pracovni RAM ; DSKCNF EQU WRAM ;konfigurace jednotek IODMA EQU DSKCNF+1;adresa DMA IODSK EQU IODMA+2 ;cislo mechaniky (A:=1, B:=2) IOTRK EQU IODSK+1 ;cislo stopy (0..76) IOSEC EQU IOTRK+1 ;cislo sektoru IOBLKE EQU IOSEC+2 ;konec bloku ; ALVA EQU IOBLKE ;alokacni a kontrolni vektory CSVA EQU ALVA+31 ALVB EQU CSVA+16 CSVB EQU ALVB+31 DIRBUF EQU CSVB+16 ;buffer na operace s adresarem BIOSSP EQU DIRBUF+128+36 ;zasobnik pri cinnosti BIOSu KBDTBL EQU BIOSSP ;prekladova tabulka klavesnice INTVEC EQU KBDTBL+80H ;tabulka prerusovacich vektoru ; WRAME EQU INTVEC+20H ;konec pracovni RAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Tabulka DPB pro jednoduchou hustotu 8' ; DPBSD: DW 26 ;SPT DB 3,7,0 ;BSM,BLM,EXM DW 242,63 ;DSM,DRM DB 0C0H,0H ;AL0,AL1 DW 16,2 ;CKS,OFF ; ; Tabulka pro preklad logickych cisel sektoru na fyzicka ; XLTSD: DB 1,7,13,19,25,5,11,17 DB 23,3,9,15,21,2,8,14 DB 20,26,6,12,18,24,4,10 DB 16,22 ; ; Vstupni body monitoru IQ151 vyuzivane v BIOSu ; QRI EQU 0F806H ;cteni znaku ze snimace derne pasky QCO EQU 0F809H ;vystup znaku na obrazovku QPO EQU 0F80CH ;vystup znaku na derovac derne pasky QLO EQU 0F80FH ;vystup znaku na tiskarnu QYKL EQU 0F8C9H ;test stavu klavesnice QCI26 EQU 0F8BDH ;CI2+6, pipnuti QPT7 EQU 0F74FH ;PTME+7 QECO EQU 0F190H ;vypocet adresy kurzoru ; ; Promenne monitoru v 0. strance ; ; kolize s CP/M ; QMEMTOP EQU 4 ;adresa vrcholu pameti QTIMKL EQU 6 ;casovac klavesnice QBLBLI EQU 7 ;blokovani blikani (=0 blika, <>0 ne) ; ; ostatni ; BLIKZ EQU 0BH ;znak pod kurzorem KURSO EQU 0CH ;adresa kurzoru POSIC EQU 0EH ;pozice kurzoru na radce RADEK EQU 0FH ;radek s kurzorem GRAF EQU 10H ;grafika INV1 EQU 11H ;inverze KIC EQU 12H KOST EQU 13H ;delka stranky RCR EQU 14H ;pocet odradkovani po CR ADRBR EQU 15H ;misto na ulozeni adresy pri BREAK ; ; Struktura 0. stranky v CP/M ; ;adresa delka obsah ; 0 3 JMP WBOOTE ; 3 1 IOBYTE ; 4 1 aktualni disk a uzivatel ; 6 3 JMP BIOS IOBYTE EQU 3 CDISK EQU 4 RST7A EQU 38H ;RST 7 = CALL 38H ; ; Promenne BIOSu v 0. strance ; ESCCNT EQU ADRBR INTSP EQU 2EH ;zasobnik pri preruseni casovacem, prepisuje ;zonu pro uschovu registru XMEMTO EQU 2EH XTIMKL EQU 30H XBLBLI EQU 31H KLSTT EQU 32H ;vysledek testu klavesnice KLCHR EQU 33H ;sejmuty znak, je-li <>0 USRSP EQU 34H ;SP pri vyvolani BIOSu INTHL EQU 36H ;HL pri preruseni casovacem ; ; Radic DISC 2M ; FDROMP EQU 0ACH ;pripnuti ROM zapisem 1 ; ; ; Radic preruseni 8259 ; P590 EQU 88H ;port 0 P591 EQU 89H ;port 1 ; ; CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED CRLF EQU LF CS EQU 1FH ;CLEAR SCREEN FF EQU 0CH ;FORM FEED ESC EQU 1BH ; DB '(C) ZAJIC TU 1/87 KOMENIUM' ; CBOOT: ;studeny start - vyvolan po RESETu z monitoru ; DI LXI SP,BUFF+80H LXI H,0 SHLD XTIMKL SHLD KLSTT SHLD ESCCNT LHLD QMEMTOP CB2: MVI A,0F6H ;ICW1 OUT P590 MOV A,H ;ICW2 OUT P591 MVI A,09FH ;enable INT5 a INT6 OUT P591 MVI A,20H ;EOI OUT P590 SHLD XMEMTO MVI L,KBDTBL-256 ;inicializace kvuli cteni konf. MVI M,'1' INX H MVI M,'2' INX H MVI M,'3' MVI L,KBDTBL-256+28H MVI M,'0' ;inicializace vektoru preruseni MVI L,0F4H ;IRQ5 - BREAK MVI M,(JMP) INX H LXI D,XBREAK MOV M,E INX H MOV M,D INX H INX H MVI M,(JMP) INX H LXI D,XPTIME ;IRQ6 - preruseni 50 Hz MOV M,E INX H MOV M,D MVI A,1 STA RCR ;jedno odradkovani po CR CALL BIOSHL ; inicializace skokoveho vektoru BIOSu MVI L,0 ;a tabulek DPH LXI D,BTROM MVI B,WRAM MOVEX: LDAX D MOV M,A INX D INX H DCR B JNZ MOVEX ;modifikace adres v tabulkach DPH MVI L,DPBASE+9 ;DIRBUF MOV M,H MVI L,DPBASE+13 ;CSVA MOV M,H MVI L,DPBASE+15 ;ALVA MOV M,H MVI L,DPBASE+16+9 ;DIRBUF MOV M,H MVI L,DPBASE+16+13 ;CSVB MOV M,H MVI L,DPBASE+16+15 ;ALVB MOV M,H LXI H,IOBYTE MVI M,95H ;CON:=CRT:, RDR:=PTR:, PUN:=PTP:, LST:=LPT INX H ;nastaveni pocatecniho stavu IOBYTE MVI M,0 ;aktualni disk A:, aktualni uzivatel 0 CALL FDCINI ;inicializace radice CALL MSG ;identifikacni hlaska DB CS DB 'IQ151 DISC2M BIOS',CRLF DB 'verze ' ; VERZE: DB '030188-',0 ; CALL BIOSHL PUSH H MOV A,H CALL COBYTE CALL MSG DB CRLF,'?',0 CALL KICO ;urceni konfigurace jednotek SUI '0' ;0,2=AB, 1,3=BA ANI 3 ;0,1=rucni reakce na diskove chyby, 2,3=implicitni 2 POP H MVI L,DSKCNF MOV M,A MVI C,0 ;rekalibrace jednotek CALL SELDSK CALL FDHOME LXI B,1 SHL 8 + 0 ;BOOT BLOCK CALL SETTRS ;1.sektor, 0.stopa LXI B,3000H CALL SETDMA CALL READ JNZ BOOTER CALL 3000H LXI B,26 SHL 8 + 1 ;cteni tabulky KBDTBL CALL SETTRS ;26.sektor, 1.stopa INR H MOV B,H MVI C,KBDTBL-256 CALL SETDMA CALL READ JNZ BOOTER MVI C,1 CALL SELDSK CALL FDHOME DB 3EH ;MVI A ; ;Dale se pokracuje stejne jako u WBOOT ; WBOOT: ;zavedeni CCP a BDOS z disku XRA A LXI SP,BUFF+80H PUSH PSW MVI A,JMP ;JMP WBOOTE STA 0 STA RST7A ;BREAK a RST 7 LXI H,YBREAK SHLD RST7A+1 STA 5 ;JMP BDOS MVI C,0 CALL SELDSK MVI B,RCMD CALL SYSRW ; LXI B,BUFF ;adresa DMA CALL SETDMA ; CALL BIOSHL MVI L,WBOOTE SHLD 1 ;IOBYTE a CDISK se nemeni CALL TBDOSE JZ GOC2 ;spravna verze systemu PUSH PSW ;rozdil mezi pozadovanou a skut. adresou PUSH H ;adresa CCP v pameti CALL MSG DB CRLF,'# Chybne umisteny system',CRLF,0 ; nacteni bitove mapy z 1. stopy sektoru 20 az 25 od 100H LXI B,100H CALL SETDMA MVI C,20 CALL SETSEC ; IF IQ151F MVI M,26 CALL READ JNZ BOOTER ENDIF ; IF NOT IQ151F RK2: CALL READ JNZ BOOTER CALL NXTSEC CPI 27 JC RK2 ENDIF ; ;rekonfigurace systemu podle bitove mapy POP D ;adresa modifikovaneho kodu(zacatek CCP) POP H ;H=pricitany offset, L=bajt mapy PUSH D ;vstupni bod CCP LXI B,100H PUSH B ;stack=adresa bitove mapy LXI B,CPML ;BC=delka modifikovaneho kodu RK4: MOV A,E ANI 7 JNZ RK6 XTHL ;dalsi bajt z bitove mapy MOV A,M INX H XTHL MOV L,A RK6: MOV A,L RAL MOV L,A JNC RK8 ;absolutni bajt LDAX D ADD H ;relativni bajt STAX D RK8: INX D DCX B MOV A,B ORA C JNZ RK4 POP H CALL TBDOSE JNZ SYSER ;chyba systemu po rekonfiguraci ;ulozeni na disk CALL MSG DB '-zapis(A/N)',0 CALL KICO CPI 'A' MVI B,WCMD CZ SYSRW POP H ;adresa CCP GOC2: LDA CDISK ;aktualni disk a uzivatel ANI 0F1H ;aktualni disk pouze A: nebo B: MOV C,A ;parametr pro CCP POP PSW ORA A JNZ IPCHL ;start po CBOOT INX H INX H INX H ;start po WBOOT IPCHL: PCHL ; SYSER: CALL MSG DB '# system poskozen',CRLF,0 RST 7 ; TBDOSE: ;urceni vstupni adresy BDOSu a test umisteni ; CALL BIOSHL MVI L,0 XCHG LXI H,BDOSE; DAD D SHLD 6 INX H INX H MOV A,H SUB M LXI H,CCPE DAD D RET ; SYSRW: ;CCP a BDOS jsou ulozeny na 25 sektotech stopy 0 (2..26) ; a NSRCTS-25 sektorech stopy 1 (1..) IF IQ151F ;vicesektorove cteni PUSH B LXI B,0200H CALL SETTRS MVI M,26 MVI L,0 LXI D,CCPE DAD D MOV C,L MOV B,H CALL SETDMA POP B PUSH B CALL IOOPER JNZ BOOTER LXI B,0101H CALL SETTRS MVI M,NSECTS-25 MVI L,0 LXI D,CCPE+25*128 DAD D MOV C,L MOV B,H CALL SETDMA POP B CALL IOOPER RZ JMP BOOTER ENDIF ; IF NOT IQ151F ;cteni po sektorech PUSH B LXI B,0200H CALL SETTRS MVI L,0 LXI D,CCPE DAD D MOV C,L MOV B,H CALL SETDMA SYSRW0: POP B PUSH B CALL IOOPER JNZ BOOTER CALL NXTSEC CPI 27 JC SYSRW0 LXI B,0101H CALL SETTRS SYSRW2: POP B PUSH B CALL IOOPER JNZ BOOTER CALL NXTSEC CPI NSECTS-25+1 JC SYSRW2 POP B RET ENDIF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Obsluha znakovych periferii - v teto verzi bez IOBYTE ;;;;;;;;;;;;;;;;;;;;;;;; ; P55A EQU 84H P55B EQU 85H P55C EQU 86H P55CW EQU 87H MX EQU 98H ;ridici slovo prp radky MY EQU 8AH ;a sloupce ; QYKL6 EQU 0F91EH QYKL7 EQU 0F8FBH QLOGA EQU 0F967H ; XYKL: DI MVI A,MX OUT P55CW IN P55A ;stav sloupcu CALL QLOGA MVI A,MY OUT P55CW EI RNC MOV H,L IN P55B ;stav radek CALL QLOGA RNC MOV A,L ADD A ADD A ADD A ORA H LHLD XMEMTO ADI KBDTBL-256 MOV L,A MOV C,M ;znak MOV A,C LXI H,QYKL6 PUSH H JMP QYKL7 ; ; CONST: ;test stavu konzole, REG-A=255 - znak pripraven, 0 - ne CALL SAVSP ; KBDS: ;test stavu klavesnice CALL BIOSHL MVI L,CAPLCK IN P55C CMA ANI 0C0H ;FA+FB JZ KBDS0 ANI 40H ;FA RAR MOV M,A KBDS0: MOV B,M ;CAPS LOCK EI XRA A LXI D,XBLBLI ;povoleni blikani kurzoru STAX D INX D ;KLSTT LDAX D ORA A RNZ ;znak pripraven z predchazejiciho testu LDA XTIMKL ANI 1FH LDAX D RNZ ;nedokonceny autorepeat klavesnice LHLD QTIMKL PUSH H ;treba ulozit, nebot QYKL to prepisuje CALL XYKL ;test stavu klavesnice POP H SHLD QTIMKL MOV L,A ;docasna uschova priznaku SHIFT SBB A RP ;CY bylo 0, neni stisknuta zadna klavesa STAX D ;A=255, znak pripraven MOV A,C CPI 'A'+20H JC KBDS1 CPI 'Z'+21H JNC KBDS1 XRA B MOV C,A ;mala pismena upravit podle CAPS LOCK MOV A,B ADD A ADD A MOV L,A KBDS1: MOV A,L LXI H,KBDS2 PUSH H PUSH B PUSH H JMP QCI26 ;pipnuti KBDS2: INX D STAX D ;KLCHR:=platny znak DCX D LDAX D ;KLSTT LXI H,XTIMKL DI INR M DCR M EI RNZ INR M ;inicializace citace autorepeat RET ; ; CONIN: ;cteni znaku z konzole do A CALL SAVSP ; KBDI: ;vstup znaku z klavesnice ; CALL KBDS ORA A JZ KBDI XRA A STA KLSTT LDA KLCHR RET ; ; CONOUT: ;vystup znaku z C na konzoli CALL SAVSP ; CRTO: ;zapis znaku na obrazovku ; LXI H,XBLBLI MOV M,L ;potlaceni blikani MOV A,C LXI H,ESCCNT INR M DCR M JZ CRTO01 ;neni ESC sekvence SUI 20H MOV C,A DCR M JNZ ESCSQ ;provedeni ESC sekvence adresace kurzoru INR M INR M ;ESCCNT:=2 INX H MOV M,C ;uschova 1. parametru RET ESCSQ: PUSH PSW PUSH B PUSH D PUSH H DCR M ;ESCCNT:=0 INX H MOV B,M ;cislo radku LXI H,BLIKZ MOV A,M ;znak pod kurzorem INX H MOV E,M INX H MOV D,M ;adresa kurzoru STAX D ;obnoveni znaku pod kurzorem INX H MOV M,C INX H MOV M,B JMP QECO ; CRTO01: INR M CPI ESC ;ESC=prefix adresace kurzoru,nasleduje radek+20h RZ ;sloupec+20h DCR M CPI FF RZ ;FF ignorovan CPI CR RZ ;CR rovnez CPI LF JNZ CRTO2 MVI C,CR ;LF nahrad CR CRTO2: LHLD QTIMKL ;uschova, nebot QCO to prepisuje CALL QCO SHLD QTIMKL RET ; KICO: ;vstup znaku z klavesnice + echo + CRLF ; CALL KBDI PUSH PSW MOV C,A CALL CRTO MVI C,CRLF CALL CRTO POP PSW RET ; XPTIME: ;preruseni 50HZ ; QPT1 EQU 0F76CH QBLIK EQU 0F784H ; PUSH PSW SHLD INTHL LXI H,0 ;prepnuti na vlastni zasobnik DAD SP LXI SP,INTSP PUSH H ;user SP LXI H,XTIMKL MOV A,M ANA A CNZ QPT1 ;osetreni klavesnice INX H MOV A,M ANA A LXI H,QTIMKL+2 CZ QBLIK ;blikani INR M POP H SPHL LHLD INTHL EOINT: MVI A,20H ;EOI OUT P590 POP PSW EI RET ; YBREAK: ;skok do MONITORu ; QBREAK EQU 0F792H QPTIME EQU 0F748H ; DI ;ladici varianta PUSH PSW PUSH H PUSH D LHLD XBLBLI SHLD QBLBLI LHLD XMEMTO SHLD QMEMTOP MVI L,0F9H ;IRQ6 LXI D,QPTIME MOV M,E INX H MOV M,D POP D POP H POP PSW JMP QBREAK ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Diskove operace ; SELDSK: ;vyber disku podle REG-C ; LXI H,0000H MOV A,C CPI NDISK RNC ;neplatny disk, HL=0 ; CALL BIOSHL MVI L,DSKCNF XRA M ANI 1 MVI L,IODSK MOV M,A INR M ;IODSK je 1 pro A: a 2 pro B: ADD A ADD A ADD A ADD A ADI DPBASE MOV L,A ;HL=adresa tabulky DPH RET ; HOME: ;vystaveni na stopu 0, zpracovano stejne jako SETTRK ; MVI C,0 ; SETTRK: ;nastaveni adresy stopy podle REG-C ; CALL BIOSHL MVI L,IOTRK MOV M,C RET ; SETSEC: ;nastavi cislo sektoru podle REG-C ; CALL BIOSHL MVI L,IOSEC MOV M,C INX H MOV M,C RET ; SECTRAN:;preklad logickych cisel sektoru na fyzicka ; MVI B,0 ;cislo sektoru v C XCHG ;adresa tabulky do HL DAD B MOV L,M ;cislo fyzickeho sektoru do HL MVI H,0 RET ; SETDMA: ;nastaveni adresy DMA podle BC ; CALL BIOSHL MVI L,IODMA MOV M,C INX H MOV M,B RET ; NXTSEC: ;prechod na dalsi sektor se zvetsenim adresy CALL BIOSHL MVI L,IODMA MOV A,M ADI 80H MOV M,A INX H MOV A,M ACI 0 MOV M,A MVI L,IOSEC INR M MOV A,M INX H INR M RET ; READ: ;cteni sektoru ; MVI B,RCMD DB 21H ;LXI H ; WRITE: ;zapis sektoru ; MVI B,WCMD ; IOOPER: ;spolecny kod cteni a zapisu ; CALL SAVSP IOOP0: PUSH B IOOP01: CALL FDSEEK ;seek POP B MVI C,RETRY ;pocet opakovani IOOP1: PUSH B CALL FDRDWR POP B RZ DCR C JNZ IOOP1 PUSH B PUSH H PUSH D CALL MSG DB CRLF,'# ',0 CALL BIOSHL MVI L,IODSK MOV A,M ADI '0'-1 MOV C,A CALL CRTO ;disk CALL MSG DB ': ',0 POP D PUSH D MOV A,D CALL COBYTE ;ST0 POP D MOV A,E CALL COBYTE ;ST1 POP H MOV A,H CALL COBYTE ;ST2 POP B PUSH B MOV A,B CALL COBYTE ;operace CALL MSG DB ' st:',0 CALL BIOSHL MVI L,IOTRK MOV A,M CALL COBYTE ;stopa CALL MSG DB 'H se:',0 CALL BIOSHL MVI L,IOSEC MOV A,M CALL COBYTE CALL MSG DB 'H',CRLF,'0=opakuj,1=ignoruj,2=chyba:',0 CALL BIOSHL MVI L,DSKCNF MOV A,M ANI 2 MVI A,'2' CZ KICO SUI '1' POP B RNC ;navrat PUSH B CALL FDHOME JMP IOOP01 ; MSR EQU 0AAH DATAR EQU 0ABH ; SCMD EQU 3H ;Specify WCMD EQU 5H ;Write RCMD EQU 6H ;Read SECMD EQU 0FH ;Seek SISCMD EQU 8H ;Sense Interrupt Status RECMD EQU 7H ;Recalibrate ; ; SRT EQU 8 ;Step Rate = 16-SRT(max.15) ms HUT EQU 15 ;Head Unload Time = HUT(max.15)*16 ms HLTIM EQU 63 ;Head Load Time = HLTIM(max.127)*2 ms ND EQU 1 ;rezim Non DMA GPL EQU 7 ;GAP 3 FGPL EQU 1BH ;GAP3 pro formatovani DTL EQU 128 ;zvlastni delka dat ; FDRDWR: ;operace cteni azapisu ; CRW: ;prikazova faze cteni a zapisu - prikaz v B ; DI XRA A MVI D,DTL ;DTL - zvlastni delka dat PUSH D MVI D,GPL ;GPL - delka mezery PUSH D CALL BIOSHL MVI L,IOSEC+1 MOV D,M PUSH D ;EOT PUSH PSW ;N - priznak zvlastni delky dat DCX H MOV D,M PUSH D ;R - cislo sektoru XRA A PUSH PSW ;H - cislo hlavy MVI L,IOTRK MOV D,M PUSH D MVI L,IODSK MOV A,M PUSH PSW ;jednotka a hlava PUSH B ;prikaz MVI D,9 CRW2: POP B CALL OUTPR DCR D JNZ CRW2 MVI L,IODMA MOV E,M INX H MOV D,M ; ; provadeci faze ; MVI H,EXERW SHR 8 CALL EXERW1 ; RRW: ;vysledkova faze cteni a zapisu ; XCHG CALL INPR ;ST0 MOV D,A CALL INPR ;ST1 MOV E,A CALL INPR ;ST2 MOV H,A MVI C,4 RRW1: CALL INPR DCR C JNZ RRW1 EI MOV A,D ANI 80H RNZ MOV A,E ORA H ANI 77H RET ; ; FDCINI: ;inicializace radice MVI B,SCMD CALL OUTPR ;SPECIFY MVI B,(SRT SHL 4) OR HUT CALL OUTPR MVI B,(HLTIM SHL 1) OR ND CALL OUTPR JMP SIS ; ;Tabulka akci pri provadeci fazi cteni a zapisu ; ORG (($+0EFH) AND 0FF00H) + 16 ;*************** nic EXERW: IN MSR MOV L,A PCHL ;*** ; OUTPRI: IN DATAR DB 3EH ;MVI A OUTPR0: ;vystup bajtu z adresy v HL MOV B,M OUTPR: ;vystup bajtu z B IN MSR ADD A JNC OUTPR ;cekani na RQM JM OUTPRI ;vycteni neocekavanych vstupu MOV A,B OUT DATAR RET ; INPR: ;vstup bajtu do A IN MSR ADD A JNC INPR ;cekani na RQM CMA RP ;chyba, neni vstup IN DATAR RET ;*** ORG EXERW+32 ;*************** ND EXERW1: IN MSR MOV L,A PCHL ;*** ; SAVSP: ;uschova SP pri vyvolani BIOSu ; LXI H,2 DAD SP SHLD USRSP LHLD XMEMTO MVI L,BIOSSP AND 0FFH SPHL LXI H,RETSP PUSH H LHLD USRSP DCX H MOV A,M DCX H MOV L,M MOV H,A EI PCHL ;*** ORG EXERW+32*2 ;*************** DIO IN MSR MOV L,A PCHL ;*** ; SIS: ;Sense Interrupt Status MVI B,SISCMD CALL OUTPR CALL INPR ;ST0 SIS0: IN MSR ADD A JNC SIS0 RP IN DATAR JMP SIS ; SETTRS: ;nastaveni stopy(C) a sektoru(B) PUSH B CALL SETTRK POP B JMP SETTS2 ;*** ORG EXERW+32*3 ;*************** DIO+ND IN MSR MOV L,A PCHL ;*** ; FDHOME: ;Recalibrate ; MVI B,RECMD CALL OUTPR CALL BIOSHL MVI L,IODSK CALL OUTPR0 JMP SIS1 ; FDSEEK: ;seek ; MVI B,SECMD CALL OUTPR CALL BIOSHL MVI L,IODSK CALL OUTPR0 INX H CALL OUTPR0 ; SIS1: MVI B,SISCMD CALL OUTPR CALL INPR ;ST0 ADD A JC SIS1 ;Invalid Cmd PUSH PSW CALL INPR POP PSW STC RM CMC RET ; SETTS2: MOV C,B JMP SETSEC ; BOOTER: ;chyba pri cteni systemu ; RST 7 ;*** ORG EXERW+32*5 ;*************** RQM+ND LDAX D OUT DATAR INX D IN MSR MOV L,A PCHL ;*** ; COBYTE: ; Vypis slabiky na konzoli hexa ; PUSH PSW RRC RRC RRC RRC CALL COHXDG POP PSW COHXDG: ANI 0FH CPI 10 JC COHX2 ADI 'A'-'9'-1 COHX2: ADI '0' MOV C,A JMP CRTO ;*** ORG EXERW+32*6 ;*************** RQM+DIO RET ;*** ; RETSP: ;obnova SP pri opusteni BIOSu ; XCHG LHLD USRSP SPHL XCHG RET ; MSG: ;Vypis textu ukonceneho bin. nulou za volanim ; XTHL MOV A,M INX H XTHL ORA A RZ MOV C,A CALL CRTO JMP MSG ; XBREAK: ;Preruseni tlacitkem BREAK PUSH H LXI H,RST7A XTHL PUSH PSW JMP EOINT ;skok na JMP YBREAK resp. JMP DDT ;*** ORG EXERW+32*7 ;*************** RQM+DIO+ND IN DATAR STAX D INX D IN MSR MOV L,A PCHL ;*** ; JMP CBOOT ; BIOSHL: ;nastaveni adresy skokoveho vektoru BIOSu do HL ; LHLD XMEMTO DCR H RET ; END