NAME ('IQNSBI') ; ; !!! pri uprave zmen VERZE !!! ; ;************************************************* ; ; IQNET SATELIT BIOS pro CP/M ver.2.2 a IQ151 ; ;************************************************* ; FALSE EQU 0 TRUE EQU NOT FALSE ; TSTVER EQU FALSE ; EXTRN IQSRDS,IQSWRS,IQSHEL,ININET,RDNET,RDNETL,WRNET,DPBASE EXTRN ENINET,INTNET EXTRN BIOSSP,IQSDSK,IQSTRK,IQSSEC,IQSDMA,IQSNSC,IQSSRO EXTRN SAVCCP,SAVDRA,SAVDRB ; IF TSTVER ENTRY KICO,WRHEXB,WRSTR,WRLN ENDIF ; ENTRY IQSNMB,MOVES ; ; 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 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Skokovy vektor BIOSu ; Pri CBOOT kopirovano do RAM na (MEMTOP)-128 = BIOS ; ; BTROM EQU $ ; JMP CBOOT ; 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 SECTRN ; JMP ENINET JMP WRNET JMP RDNET JMP RDNETL IQSNMB: ;cislo satelitu MVI A,1 RET ; CAPLCK EQU $-BTROM DB 20H ; RAMINL EQU $-BTROM ;konec vzoru pro inicializaci RAM ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Definice pracovni oblasti na MEMTOP ; ; WRAM EQU $-BTROM ; KBDTBL EQU WRAM+29 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; 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 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 ESC EQU 1BH FF EQU 0CH ;FORM FEED ; CBOOT: ;studeny start - vyvolan po RESETu z monitoru ; DI LXI SP,BUFF+80H CALL ININET ;inicializace site LXI H,0 SHLD XTIMKL SHLD KLSTT SHLD ESCCNT MVI A,0F6H ;ICW1 OUT P590 LDA QMEMTOP+1 MOV H,A ;ICW2 OUT P591 MVI A,9BH OUT P591 ;odmaskuj INT2,INT5 a INT6 SHLD XMEMTO MVI A,(JMP) ;inicializace vektoru preruseni MVI L,0E8H ;INT2 - SIO MOV M,A ;JMP LXI D,INTNET INX H MOV M,E INX H MOV M,D MVI L,0F4H ;IRQ5 - BREAK MOV M,A INX H LXI D,XBREAK MOV M,E INX H MOV M,D INX H INX H MOV M,A INX H LXI D,XPTIME ;IRQ6 - preruseni 50 Hz MOV M,E INX H MOV M,D ; inicializace skokoveho vektoru BIOSu MVI L,0 LXI D,BTROM LXI B,RAMINL CALL MOVEX LXI D,RDADRS MVI L,1 MOV M,E INX H MOV M,D MVI A,95H ;CON:=CRT:, RDR:=PTR:, PUN:=PTP:, LST:=LPT STA IOBYTE ;nastaveni pocatecniho stavu IOBYTE XRA A ;aktualni disk A:, aktualni uzivatel 0 STA CDISK INR A STA RCR ; CALL MSG ;identifikacni hlaska DB CS,CRLF DB 'IQ151 FELNET BIOS',CRLF DB '(C) VS FEL CVUT - ' ; VERZE: DB '110388-',0 ; CALL IQSNMB CALL COBYTE LDA XMEMTO+1 CALL COBYTE CALL WRLN ; LXI B,DPBASE CALL SETDMA CALL IQSHEL ;cteni tabulek CALL RDADRS ;cteni adresaru ; ;cteni systemu MVI A,0 LHLD XMEMTO MVI L,KBDTBL MVI D,1 LXI B,51*256 CALL RDTRK ;cteni tabulky klavesnice ; MVI A,0 LHLD XMEMTO LXI B,CCPE DAD B ;adresa CCP PUSH H MVI D,NSECTS;delka CC/M v sektorech LXI B,0100H ;system ulozen na stope 0 od sektoru 1 CALL RDTRK POP D LXI H,CCPL+8 DAD D MOV A,H SUB M JZ CB02 ;spravna verze systemu ; PUSH PSW ;rozdil mezi pozadovanou a skut. adresou PUSH D ;adresa CCP v pameti ;nacteni bitove mapy MVI A,0 LXI B,(NSECTS+1)*256 MVI D,6 LXI H,100H CALL RDTRK ;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 POP H ;adresa CCP ; CB02: CALL INISPA XCHG PUSH D ; GOCPM: CALL MOVEX ;ulozeni resp.obnoveni CCP CALL ENINET ;povoleni prijmu pod prerusenim LDA CDISK ;aktualni disk a uzivatel ANI 0F1H ;aktualni disk pouze A: nebo B: MOV C,A ;parametr pro CCP EI RET ; WBOOT: ;teply start ; LXI SP,BUFF+80H CALL INISPA PUSH H INX H ;vstup CCP+3 INX H INX H XTHL JMP GOCPM ; MOVES: ;PROCEDURE MOVES(DEST,SRC:WORD) POP H POP D XTHL XCHG LXI B,128 MOVEX: ; LDAX D MOV M,A INX D INX H DCX B MOV A,B ORA C JNZ MOVEX XRA A RET ; INISPA: ;inicializace SPA ; LXI H,YBREAK SHLD RST7A+1 LHLD XMEMTO MVI L,WBOOTE SHLD 1 MVI A,JMP STA RST7A ;BREAK a RST 7 STA 0 ;JMP WBOOTE STA 5 ;JMP BDOS XCHG LXI H,BDOSE-WBOOTE DAD D SHLD 6 LXI H,CCPE-WBOOTE DAD D LXI B,806H LXI D,SAVCCP RET ; RDADRS: ;cteni adresaru ;cteni adresare A: MVI A,0 LXI B,2 ;stopa 2, sektor 0 MVI D,8 ;delka adresare 1KB LXI H,SAVDRA CALL RDTRK ;cteni adresare B: MVI A,1 LXI B,2 ;stopa 2, sektor 0 MVI D,16 ;delka adresare 2KB LXI H,SAVDRB ; JMP RDTRK ; RDTRK: ;cteni po sobe nasledujicich sektoru ze stopy ;od sektoru na adresu z disku PUSH H PUSH D PUSH B MOV C,A CALL SELDSK POP B CALL SETTRS POP PSW MOV M,A POP B CALL SETDMA RDTR0: CALL IQSRDS ORA A JNZ BOOTER CALL MSG DB '*',0 CALL NXTSEC JNZ RDTR0 RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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 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 LHLD XMEMTO 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 REG-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 REG-C na konzoli CALL SAVSP DB (LXI H) ; WRLN: MVI C,CRLF ;zapis CRLF na obrazovku ; 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 ; IF TSTVER KICO: ;vstup znaku z klavesnice + echo + CRLF ; CALL KBDI PUSH PSW MOV C,A CALL CRTO CALL WRLN POP PSW RET ENDIF ; 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 ; STA IQSDSK MOV L,A MVI H,0 LXI B,DPBASE DAD H DAD H DAD H DAD H DAD B ;HL=adresa tabulky DPH RET ; HOME: ;vystaveni na stopu 0, zpracovano stejne jako SETTRK ; MVI C,0 ; SETTRK: ;nastaveni adresy stopy podle REG-C ; MOV A,C STA IQSTRK RET ; SETTRS: ;nastaveni stopy(C) a sektoru(B) ; PUSH B CALL SETTRK POP B MOV C,B ; SETSEC: ;nastavi cislo sektoru podle REG-C ; LXI H,IQSSEC MOV M,C LXI H,IQSNSC RET ; SECTRN:;preklad logickych cisel sektoru na fyzicka ; MOV L,C ;cislo sektoru v C MVI H,0 RET ; SETDMA: ;nastaveni adresy DMA podle BC ; MOV L,C MOV H,B SHLD IQSDMA RET ; NXTSEC: ;prechod na dalsi sektor se zvetsenim adresy LXI H,IQSDMA MOV A,M ADI 80H MOV M,A INX H MOV A,M ACI 0 MOV M,A LXI H,IQSSEC INR M LXI H,IQSNSC DCR M RET ; TSTDIR: ;test, je-li operace se sektorem adresare ; ;vystup: CY=1, ne ; CY=0, ano, BC=128, DE=adresa do bufferu, HL=DMA ; LDA IQSTRK CPI 2 STC RNZ ;adresar je na stope 2 LDA IQSSEC CPI 16 CMC RC ;adresar nejvyse do sektoru 15 MOV B,A MOV L,A MVI H,0 REPT 7 ;cislo sektoru * 128 DAD H ENDM LXI D,SAVDRB LDA IQSDSK ORA A JNZ TSTD2 ;B: LXI D,SAVDRA ;A: MOV A,B CPI 8 ;na A: jen do sektoru 7 CMC RC TSTD2: DAD D ;adresa do bufferu XCHG LHLD IQSDMA LXI B,128 RET ; READ: ;cteni sektoru ; CALL SAVSP CALL TSTDIR JC IQSRDS CALL MOVEX ;cteni sektoru adresare LDA IQSDSK ORA A RZ ;disk A: LDA IQSSRO ORA A RZ ;B: R/W LHLD DPBASE+16+12 ;REF(CSVB) INR M ;zmena CSV - system disk oznaci R/O XRA A RET ; WRITE: ;zapis sektoru ; CALL SAVSP CALL IQSWRS ORA A RNZ ;chyba CALL TSTDIR XCHG CNC MOVEX XRA A RET ; ;*** ; SAVSP: ;uschova SP pri vyvolani BIOSu ; LXI H,2 DAD SP SHLD USRSP POP H EI CALL IPCHL ; ;RETSP: ;obnova SP pri opusteni BIOSu ; XCHG LHLD USRSP SPHL XCHG EI RET ; IPCHL: PCHL ; BOOTER: ;chyba pri cteni systemu ; RST 7 ; IF TSTVER WRHEXB: ;PROCEDURE WRHEXB(C:BYTE) ; POP H XTHL MOV A,L ENDIF ; 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 ; ; IF TSTVER WRSTR: ;PROCEDURE WRSTR(P:WORD) ; POP H XTHL WRS1: MOV A,M CPI '$' RZ MOV C,A PUSH H CALL CRTO POP H INX H JMP WRS1 ENDIF ; 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 ; ; END