ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt
SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | klony SM50/40 | PETR | PLAN-80A | IQ151 | TNS | FK-1 | HVĚZDA | SP 830 | PCS 1-QR6000
ZPS | Technické prostředky | Programové vybavení | Dokumentace
PAGE 66
;*******************************************************
;* *
;* B D O S p r o Z P S 2 *
;* *
;*******************************************************
;
; modify Jiri Hlavac
; 22.3.1988
;
;*************************************************************
.z80
longBD EQU $next - bdosb ;delka BDOSu (max 0E00H)
;*******************************************************
iobyte EQU 40E2H ;adresa IOBYTU v MONITORU ZPS2
dmaad EQU 4280H ;implicitni buffer
ramb EQU 4300H ;zacatek pouzitelne RAM
TPA EQU 4400H ;zacatek uzivatelske oblasti
bdosl EQU 0E00H ;delka BDOS
bdosb EQU 0F000H ;baze BDOS
biosb EQU bdosb + bdosl ;baze BIOS
bdos EQU bdosb + 6 ;vstupni bod BDOS
bios EQU biosb ;vstupni bod BIOS
reboot EQU bios+3 ;adresa restartu
;*******************************************************
.PHASE bdosb
SSEQ: DEFB 'ZPS-2 ' ; SYNCHRO SEKVENCE
JP BD100 ; VSTUPNI BOD B D O S
; TABULKA ADRES PROCEDUR ZPRACOVANI CHYBOVYCH STAVU
BDSJPA: DEFW BADSEC ; BAD SECTOR
SLEJPA: DEFW SELERR ; ERROR SELECT
ROEJPA: DEFW ROERR ; READ ONLY ERROR
FROJPA: DEFW FROERR ; FILE READ ONLY ERROR
;
;
;
BD100: EX DE,HL ; ADRESA FCB DO [HL]
LD (FCBSAV),HL ; USCHOVA ADRESY FCB
EX DE,HL ;
LD A,E ; USCHOVA REG.[E]
LD (ESAV),A ;
LD HL,0 ; NULA DO [HL]
LD (RETPRM),HL ; NULOVANI NAVRATOVEHO PAR.
ADD HL,SP ; [SP] DO [HL]
LD (SPSAV),HL ; USCHOVA UZIV. ZASOBNIKU
LD SP,BDSP ; NASTAVENI [SP] PRO BDOS
XOR A ; NULA DO [A]
LD (UNITNO),A ; NULOVANI # DISK. JEDNOTKY
LD (DSKFLG),A ; NILOVANI DISK FLAG
LD HL,RTBDOS ; PRIPRAVA NAVRATOVE ADRESY
PUSH HL ; Z BDOS DO [SP]
LD A,C ; CISLO SLUZBY DO [A]
CP 41 ; TEST CISLA SLUZBY < 40
RET NC ; NAVRAT PRI NEPLATNEH # SLUZBY
LD C,E ; PRESUN [E] DO [C]
LD HL,CHDJPT ; VST.BOD TAB.ADRES SLUZEB BDOS
LD E,A ; # SLUZBY DO [E]
LD D,0 ; NULA DO [D]
ADD HL,DE ; VYPOCET ADRESY PROCEDURY
ADD HL,DE ; SLUZBY BDOS
LD E,(HL) ; A JEJI PRESUN DO [DE]
INC HL
LD D,(HL) ;
LD HL,(FCBSAV) ; INICIALIZACE FCB ADR
EX DE,HL ;
JP (HL) ; SKOK DO PROCEDURY SLUZBY
;
;
; PRI SKOKU DO PROCEDURY SLUZBY BDOS JSOU PAMET A REGIST-
; RY NASTAVENY TAKTO:
;
; REG [C] OBSAHUJE [E] PRED VOLANIM BDOS
; [DE] OBSAHUJE [DE] PRED VOLANIM BDOS
;
; PAMET ESAV OBSAHUJE USCHOVANY [E]
; FCBSAV OBSAHUJE USCHOVANY [DE]
; SPSAV OBSAHUJE USCHOVANY UZIVATELSKY [SP]
;
; STACK ADRESA NAVRATOVE PROCEDURY Z BDOS
;
;
;
; TABULKA ADRES SLUZEB BDOS
;
;
CHDJPT: DEFW BIOS+03H ; CMD 00- RESET SYSTEMU (BOOT)
DEFW CONINP ; CMD 01- VSTUP ZNAKU Z KONZOLY
DEFW CONOUT ; CMD 02- VYST.ZNAKU NA KONZOLU
DEFW RDINP ; CMD 03- VST.ZNAKU ZE SNIMACE
DEFW BIOS+12H ; CMD 04- VYST.ZNAKU NA DEROVAC
DEFW BIOS+0FH ; CMD 05- VYST.ZNAKU NA TISKARN
DEFW DCONIO ; CMD 06- PRIHY I/O NA KONZOLU
DEFW GETIOB ; CMD 07- DEJ I/O BYTE
DEFW SETIOB ; CMD 08- NASTAV I/O BYTE
DEFW PRTSTG ; CMD 09- VYPIS ASCII RETEZEC
DEFW RDCONB ; CMD 10- CTI RETEZEC Z KONZOLY
DEFW GCOSTS ; CMD 11- DEJ STATUS KONZOLY
DEFW RETVER ; CMD 12- DEJ CISLO VERZE OS
DEFW RESDSY ; CMD 13- RESET DISK. SYSTEHU
DEFW SELDSK ; CMD 14- VYBER DISK
DEFW OPFIL ; CMD 15- OTEVRI SOUBOR
DEFW CLFIL ; CMD 16- ZAVRI SOUBOR
DEFW SFFRST ; CMD 17- HLEDEJ PRVNI VYSKYT
; V ADRESARI
DEFW SFNEXT ; CMD 18- HLEDEJ DALSI VYSKYT
; V ADRESARI
DEFW DELFIL ; CMD 19- ZRUS SOUBOR
DEFW RDSEQ ; CMD 20- SEKVENCNI CTENI
DEFW WRTSEQ ; CMD 21- SEKVENCNI ZAPIS
DEFW MAKFIL ; CMD 22- ZALOZ SOUBOR
DEFW RENFIL ; CMD 23- PREJHENUJ SOUBOR
DEFW RETLOG ; CMD 24- VRAT VEKTOR AKTIVNICH
; DISKU
DEFW RETCDK ; CMD 25- VRAT # VYBRANEHO DISKU
DEFW SETDMA ; CMD 26- NASTAV DMA ADREQU
DEFW GETALC ; CMD 27- DEJ ADR.ALOKACN.VEKT,
DEFW WRTPRT ; CMD 28- OZNAC DISK JAKO R/O
DEFW GETROV ; CMD 29- DEJ ADRESU R/O VEKTORU
DEFW SETFAT ; CMD 30- NASTAV ATRIB. SOUBORU
DEFW GETDPA ; CMD 31- DEJ ADR.PARAM. DISKU
DEFW SGUCD ; CMD 32- DEJ/ZMEN # UZIVATELE
DEFW RDRND ; CMD 33- PRIME CTENI ZE SOUBORU
DEFW WRTRND ; CMD 34- PRIMY ZAPIS DO SOUBORU
DEFW CFSIZE ; CMD 35- VYPOC. DELKU SOUBORU
DEFW SRNDRC ; CMD 36- NASTAV CISLO ZAZNAMU
; PRO PRIMY ZAPIS
DEFW RESDSK ; CMD 37- RESET DISK. JEDNOTKY
DEFW RETRET ; CMD 38- NEIMPLEMENTOVANO
DEFW RETRET ; CMD 39- NEIMPLEMENTOVANO
DEFW WRRDZF ; CMD 48- POPIS ALOKACNI BLOK
; NULANI A ULOZ ZAZNAM
;
;
; CHYBOVE PROCEDURY BDOS
;
BADSEC: LD HL,BDSMSG ; ADRESA HLASENI DO [HL]
CALL BDOSER ; VYPIS HLASENI
CP 03H ; TEST ZADANI CTRL-C
JP Z,REBOOT ; CTRL-C ZADANO => REBOOT
RET ; JINAK RETURN
;
SELERR: LD HL,SELMSG ; ADRESA CHYB. HLASENI DO [HL]
JP COHEER ; VYPIS HLASENI + REBOOT
;
ROERR: LD HL,ROMSG ; ADRESA CHYB, HLASENI DO [HL]
JP COHEER ; VYPIS HLASENI + REBOOT
;
FROERR: LD HL,FILMSG ; ADRESA CHYB. HLASENI DO [HL]
COHEER: CALL BDOSER ; VYPIS HLASENI
JP REBOOT ; A REBOOT
;
BDEMSG: DEFB 'BDOS ERR ON '
BDEUNI: DEFB ' : $'
BDSMSG: DEFB 'BAD SECTOR$'
SELMSG: DEFB 'SELECT$'
FILMSG: DEFB 'FILE '
ROMSG: DEFB 'R/O$'
;
;
; PROCEDURA VYPISU CHYBOVYCH HLASENI BDOS
;
BDOSER: PUSH HL ; USCHOVA ADRESY HLASENI
CALL CRLF ; VYPIS CR + LF
LD A,(DSKNO) ; CISLO DISKU DO [A]
ADD A,41H ; JEHO UPRAVA NA ASCII
LD (BDEUNI),A ; A PRESUN DO TEXTU HLASENI
LD BC,BDEMSG ; INICIALIZACE ADRES A VYPIS
CALL TYPSTG ; HLASENI
POP BC ;
CALL TYPSTG ;
; CEKANI NA VSTUP ZNAKU
;
;
; CTENI ZNAKU Z KONZOLY
;
COIN: LD HL,INBYT ; ADRECA VCTUPNIHO BYTE DO [HL]
LD A,(HL) ; VST. BYTE (ZNAK) DO [A]
LD (HL),0 ; NULOVANI VST. BYTE
OR A ; TEST VST. BYTE
RET NZ ; RET KDYZ VST.BYTE JIZ BYL
; NAPLNEN
JP BIOS+09H ; JINAK CTENI ZNAKU + RETURN
;
;
; PROCEDURA VSTUPU ZNAKU Z KONZOLY
;
CORD: CALL COIN ; CTENI ZNAKU Z KONZOLY
CALL TSTCTL ; TEST MOZNOSTI ZOBRAZENI
RET C ; KDYZ NELZE ZOBRAZIT
PUSH AF ; USCHOVA ZNAKU DO ZACOBNIKU
LD C,A ; A DO [C]
CALL CONOUT ; ZOBRAZENI (ECHO) ZNAKU
POP AF ; PRIPRAVA ZNAKU DO [A]
RET
;
;
; TEST MOZNOCTI ZOBRAZENI ZNAKU
;
TSTCTL: CP 0DH ; TEST NA CR
RET Z ; RETURN KDYZ CR
CP 0AH ; TEST NA LF
RET Z ; RETURN KDYZ LF
CP 09H ; TEST NA TAB
RET Z ; RETURN KDYZ TAB
CP 08H ; TEST NA BACKCPACE
RET Z ; RETURN KDYZ BACKCPACE
CP ' ' ; TEST NA MEZERU (20H)
RET ; RETURN
;
;
; TEST VSTUPU - OBSLUHA CTRL-S (STOP) A CTRL-C
;
TSTINP: LD A,(INBYT) ; VSTUPNI BYTE DO [A]
OR A ; JEHO TEST
JP NZ,TCP130 ; CKOK KDYZ JIZ BYL NAPLNEN
;
CALL BIOS+06H ; TEST STATUSU CONSOLY
AND 01H ;
RET Z ; RET KDYZ JE ZNAK V BUFFERU
CALL BIOS+09H ; CTENI VST. BYTU (ZNAKU)
CP 13H ; JE TO CTRL-S (STOP)?
JP NZ,TCP120 ; CKOK KDYZ NE
CALL BIOS+09H ; CEKANI NA VSTUP DALSIHO ZNAKU
CP 03H ; JE TO CTRL-C (REBOOT)
JP Z,REBOOT ; REBOOT KDYZ ANO
XOR A ; NULOVANI [A]
RET
;
TCP120: LD (INBYT),A ; ULOZENI VST. BYTE
TCP130: LD A,01 ; INDIKACE DO [A]
RET
;
;
; OBSLUHA NEGRAFICKEHO VYSTUPNIHO BYTE (ZNAK S CTRL)
;
CTLBYT: LD A,C ; BYTE DO [A]
CALL TSTCTL ; TEST NA PLATNY CTRL ZNAK
; NEBO HEZERU
JP NC,CONOUT ; VYSTUP BYTU + RETURN
PUSH AF ; USCHOVA BYTU
LD C,'^' ; '^' K INDIKACI CTRL BYTU
CALL COOUT ; TISK '^'
POP AF ; OBNOVA BYTU
OR 40H ; NASTAV 6 BIT ZNAKU(JE ASCII)
LD C,A ; A JEHO PRESUN DO [C]
;
;
; PROCEDURA VYSTUPU ZNAKU NA KONZOLU
;
COOUT: LD A,(BSFLAG) ; BACKSPACE FLAG DO [A]
OR A ; JEHO TEST
JP NZ,COO110 ; SKOK KDYZ JE BACKSPACE FLAG
; NASTAVENY
PUSH BC ; USCHOVA [BC]
CALL TSTINP ; TEST VSTUPU (CTRL-S)
POP BC ; INICIALIZACE [BC]
PUSH BC ; USCHOVA [BC]
CALL BIOS+0CH ; VYPIS NA CONSOLU
POP BC ; INICIALIZACE [BC]
PUSH BC ; USCHOVA [BC]
LD A,(CTLPF) ; CTRL-P FLAG DO [A]
OR A ; TEST CTRL-P FLAG
CALL NZ,BIOS+0FH ; KDYZ JE NASTAVENY => TISK
POP BC ; INICIALIZACE [BC]
;
COO110: LD A,C ; VYSTUPNI BYTE DO [A]
LD HL,CHRPOS ; ADRESA POZICE VYST. ZNAKU
CP 7FH ; JE TO RUBOUT / DELETE ?
RET Z ; RET KDYZ RUBOUT/DELETE
INC (HL) ; INIC. POZICE VYST. ZNAKU
CP 20H ; TEST HODNOTY ZNAKU (ASCII)
RET NC ; RET KDYZ NEBYL S CTRL
DEC (HL) ; RESET POZICE VYST. ZNAKU
LD A,(HL) ; POZICE ZNAKU DO [A]
OR A ; JEHO TEST NA NULU
RET Z ; RET KDYZ JE ROVEN NULE
LD A,C ; VYSTUPNI ZNAK DO [A]
CP 08H ; JE TO BACKSPACE
JP NZ,COO120 ; SKOK KDYZ NE
DEC (HL) ; ANO,UPRAV POZICI VYST.ZNAKU
RET ; RETURN
COO120: CP 0AH ; JE TO LINE FEED ?
RET NZ ; RET KDYZ NE
LD (HL),0 ; NULOVANI POZICE VYST.ZNAKU
RET ; RETURN
;
;
; VYSTUP ZNAKU NA KONZOLU CMD 02
; =======================
;
CONOUT: LD A,C ; VYST.ZNAK DO [A]
CP 09H ; JE TO TAB ?
JP NZ,COOUT ; SKOK KDYZ NENI TAB
CO10: LD C, ' ' ; MEZERA DO [C]
CALL COOUT ; VYPIS MEZERY
LD A,(CHRPOS) ; POZICE VYST.ZNAKU DO [A]
AND 07H ; TEST NA TAB STOP
JP NZ,CO10 ; OPAKOVANI PO TAB STOP
RET ; RETURN
;
;
; VYMAZ ZNAKU Z OBRAZOVKY
;
BACKSP: CALL BCKSP ; NAVRAT KURZORU O JEDNU POZ.
LD C, ' ' ; MEZERA DO [C]
CALL BIOS+0CH ; VYSTUP NA CONSOLU
BCKSP: LD C,08H ; BACKSPACE DO [C]
JP BIOS+0CH ; VYSTUP NA CONSOLU + RETURN
;
;
; ZRUSENI VSTUPNIHO RADKU - OSETRENI CTRL-U
;
CTLU: LD A,'#' ; PRIPRAVA ZNAKU '#'
CALL COOUT ; JEHO VYPIS
CALL CRLF ; A CR + LF
CTLU20: LD A,(CHRPOS) ; POZICE VYST. ZNAKU DO [A]
LD HL,ICPOS ; ADRESA POZICE VST.ZNAKU
CP (HL) ; POROVNANI OBOU
RET NC ; RET PRI JEJICH ROVNOSTI
LD C, ' ' ; MEZERA DO [C]
CALL COOUT ; JEJI VYPIS
JP CTLU20 ; OPAKOVANI
;
;
; PROCEDURA VYPISU CR + LF
;
CRLF: LD C,0DH ; PRIPRAVA CR
CALL COOUT ; VYPIS CR
LD C,0AH ; PRIPRAVA LF
JP COOUT ; VYPIS LF + RETURN
;
;
; PROCEDURA VYPISU ASCII RETEZCE
;
TYPSTG: LD A,(BC) ; PRIPRAVA VYST. BYTU
CP '$' ; JE TO TERMINATOR ?
RET Z ; RET KDYZ ANO
INC BC ; UPRAVA UKAZATELE
PUSH BC ; USCHOVA UKAZATELE
LD C,A ; VYSTUPNI BYTE DO [C]
CALL CONOUT ; JEHO VYPIS
POP BC ; INICIALIZACE UKAZATELE
JP TYPSTG ; OPAKOVANI
;
;
; CTI RETEZEC ZNAKU Z KONZOLY CMD 10
; ===========================
;
RDCONB: LD A,(CHRPOS) ; INICIALIZACE HODNOTY POZICE
LD (ICPOS),A ; VSTUPNIHO ZNAKU
;
LD HL,(FCBSAV) ; ADRESA VST. BUFFERU DO [HL]
LD C,(HL) ; DELKA BUFFERU DO [C]
INC HL ; ADR. ULOZENI SKUTECNEHO POCTU
PUSH HL ; JEJI USCHOVA DO ZASOBNIKU
LD B,0 ; NULOVANI POCITADLA VST.BYTU
;
RCB110: PUSH BC ; USCHOVA [BC]
PUSH HL ; USCHOVA ADR. VSTUP. BUFFERU
;
RCB120: CALL COIN ; CTI VSTUPNI BYTE Z KONZOLY
AND 7FH ; NULUJ 7 BIT
POP HL ; OBNOVA ADR. VSTUP.
POP BC ; BUFFERU OBNOVA [BC]
CP 0DH ; TEST VSTUPU NA CR
JP Z,RCB350 ; SKOK KDYZ JE VSTUP CR
CP 0FH ; TEST VSTUPU NA LF
JP Z,RCB350 ; SKOK KDYZ JE VSTUP LF
CP 08H ; TEST VSTUPU NA BACKSPACE
JP NZ,RCB130 ; SKOK KDYZ VSTUP NENI BACKPACE
;
LD A,B ; POCET VST. BYTU DO [A]
OR A ; TEST NA NULU
JP Z,RCB110 ; KDYZ NULA - CTI DALSI
DEC B ; UPRAVA POCTU VST.BYTU
LD A,(CHRPOS) ; POZICE VYST. ZNAKU DO [A]
LD (BSFLAG),A ; ULOZENI NA BACKSPACE FLAG
JP RCB240
;
;
RCB130: CP 7FH ; TEST VSTUPU NA RUBOUT/DELETE
JP NZ,RCB150 ; SKOK KDYZ NENI RUBOUT/DELETE
LD A,B ; POCET VST.BYTU DO [A]
OR A ; JEHO TEST NA NULU
JP Z,RCB110 ; CTI DALSI
LD A,(HL) ; POSLEDNI VSTUP. BYTE DO [A]
DEC B ; UPRAVA POCTU VST. BYTU
DEC HL ; UPRAVA ADRESY VST.BUFFERU
JP RCB320 ; SKOK NA "ECHO" VST. BYTU
;
;
RCB150: CP 05H ; TEST VSTUPU NA CTRL-E
; (END-OF-LINE)
JP NZ,RCB170 ; SKOK KDYZ NEBYLO CTRL-E
PUSH BC ; USCHOVA [BC]
PUSH HL ; USCHOVA ADR. VST. BUFFERU
CALL CRLF ; VYPIS CR + LF
XOR A
LD (ICPOS),A ; NULOVANI POZICE VST. ZNAKU
JP RCB120 ; SKOK NA DALSI CTENI
;
;
RCB170: CP 10H ; TEST VSTUPU NA CTRL-P
; (TOGGLE PRINT)
JP NZ,RCB190 ; SKOK KDYZ NOT CTRL-P
PUSH HL ; USCHOVA ADRESY VST.BUFFERU
LD HL,CTLPF ; ADRESA CTRL-P FLAG DO [HL]
LD A,1 ; INICIALIZACE CTRL-P FLAGU
SUB (HL)
LD (HL),A
POP HL ; OBNOVENI ADR. VST. BUFFERU
JP RCB110 ; SKOK NA DALSI CTENI
;
;
RCB190: CP 18H ; TEST NA VSTUP CTRL-X
; (WIPE-OUT LINE)
JP NZ,RCB210 ; NENI TO CTRL-X
POP HL ; RESET ADRESY ZASOBNIKU
RCB200: LD A,(ICPOS) ; POZICE VST. ZNAKU DO [A]
LD HL,CHRPOS ; ADRESA POZICE VYST. ZNAKU
CP (HL) ; JEJICH POROVNANI
JP NC,RDCONB ; RESTART KDYZ SE ROVNAJI
DEC (HL) ; DEC POZICE VYST. ZNAKU
CALL BACKSP ; VYMAZ POSLEDNIHO ZNAKU
JP RCB200 ; OPAKOVANI
;
;
RCB210: CP 15H ; TEST NA CTRL-U (#,CR,LF,...)
JP NZ,RCB230 ; NENI TO CTRL-U
CALL CTLU ; OSETRENI CTRL-U
POP HL ; RESET ADRESY ZASOBNIKU
JP RDCONB ; SKOK NA RESTART
;
;
RCB230: CP 12H ; TEST NA VSTUP CTRL-R
; (#,CR,LF,...,INPUT)
JP NZ,RCB310 ; NENI TO CTRL-R
RCB240: PUSH BC ; USCHOVA [BC]
CALL CTLU ; OSETRENI CTRL-U
POP BC ; INICIALIZACE [BC]
POP HL ; INICIALIZACE [HL]
; (LINE POINTER)
PUSH HL ; JEHO USCHOVA
PUSH BC ; USCHOVA [BC]
RCB250: LD A,B ; POCET VST.BYTU DO [A]
OR A ; JEHO TEST NA NULU
JP Z,RCB270 ; SKOK KDYZ VSECHNY VSTUPY
; MELY "ECHO"
INC HL ; UPRAVA ADR.VST. BUFFERU
LD C,(HL) ; VST. BYTE DO [C]
DEC B ; DEC POCTU VST. BYTU
PUSH BC ; USCHOVA POCTU VST. BYTU
PUSH HL ; USCHOVA ADR. VST. BYTU
CALL CTLBYT ; TEST NA CTRL-BYTE A VYSTUP
POP HL ; INICIALIZACE ADR. VST. BYTU
POP BC ; INICIALIZACE POCTU VST. BYTU
JP RCB250 ; OPAKOVANI
;
RCB270: PUSH HL ; USCHOVA ADR. VST. BUFFERU
LD A,(BSFLAG) ; BACKSPACE FLAG DO [A]
OR A ; JEHO TEST
JP Z,RCB120 ; KDYZ NENI NAST.-DALSI CTENI
LD HL,CHRPOS ; ADR. POZICE VYST. ZNAKU
SUB (HL) ; SUBTRACT S BACKSPACE FLAG
LD (BSFLAG),A ; USCHOVA BACKSPACE FLAG
RCB290: CALL BACKSP ; VYMAZ POSLEDNIHO BYTE
LD HL,BSFLAG ; ADRESA BACKSPACE FLAG DO [HL]
DEC (HL) ; DEC BACKSPACE FLAG
JP NZ,RCB290 ; OPAKOVANI KDYZ .NE. NULE
JP RCB120 ; DALSI CTENI
;
;
RCB310: INC HL ; UPRAVA ADRESY VST. BUFFERU
LD (HL),A ; ULOZENI VST. BYTU DO BUFFERU
INC B ; INC POCTU VST. BYTU
RCB320: PUSH BC ; USCHOVA POCTU VST. BYTU
PUSH HL ; USCHOVA ADR. VST. BUFFERU
LD C,A ; VST. BYTE DO [C]
CALL CTLBYT ; JEHO TEST NA CTRL-BYTE A
; A VYSTUP
POP HL ; INIC. ADR. VST. BUFFERU
POP BC ; INIC. POCTU ZNAKU
LD A,(HL) ; VST. BYTE DO [A]
CP 03H ; TEST NA CTRL-C (REBOOT)
LD A,B ; POCET VST.BYTU DO [A]
JP NZ,RCB330 ; NENI TO CTRL-C
CP 01H ; JE TO PRVNI VST.BYTE
JP Z,REBOOT ; KDYZ ANO => REBOOT
RCB330: CP C ; JE VST. BUFFER PLNY ?
JP C,RCB110 ; NE - DALSI CTENI
;
RCB350: POP HL ; OBNOVA ADR. POCTU VST.ZNAKU
LD (HL),B ; ULOZENI POCTU VST. ZNAKU
LD C,0DH ; CR DO [C]
JP COOUT ; VYPIS CR + RETURN
;
;
; VSTUP ZNAKU Z KONZOLY CMD 01
; =====================
;
CONINP: CALL CORD ; ROCEDURA CTENI Z KONZOLY
JP SVSING ; NAVRAT S NASTAVENIM
; NAVRATOVEHO PARAMETRU
;
;
; VSTUP ZNAKU ZE SNIMACE CMD 03
; ======================
;
RDINP: CALL BIOS+15H ; NACTENI ZNAKU ZE SNIMACE
JP SVSING ; NAVRAT S NASTAVENIM NAVRATO-
; VEHO PARAMETRU
;
;
; PRIMY I/O NA KONZOLU CMD 06
; ====================
;
DCONIO: LD A,C ; PRESUN [E](PRI CALL 5) DO [A]
INC A ; JEHO TEST NA 0FFH = VSTUP
JP NZ,BIOS+0CH ; VYPIS NA KONZOLU + RETURN
;
DCIO10: CALL BIOS+06H ; STATUS KONZOLY
OR A ; TEST STATUSU
JP Z,RSTSP ; NAVRAT KDYZ STATUS = 0
CALL BIOS+09H ; CTENI VST. BYTU Z KONZOLY
JP SVSING ; NAVRAT S NASTAVENIM
; NAVRATOVEHO PARAMETERU
;
;
; DEJ HODNOTU I/O BYTU CMD 07
; ====================
;
GETIOB: LD A,(IOBYTE) ; I/O byte MONITORU do [A]
JP SVSING ; INICIALIZACE NAVRATOVEHO
; PARAMETRU + NAVRAT
;
;
; NASTAV I/O BYTE CMD 08
; ===============
;
SETIOB: LD HL,iobyte
LD (HL),C ; ulozeni I/O bytu MONITORU
RET ; RETURN NA RETURN
;
;
; VYPIS ASCII RETEZCE CMD 09
; ===================
;
PRTSTG: EX DE,HL ; ADR. ULOZENI TEXTU DO [HL]
LD C,L ; A DO [BC]
LD B,H
JP TYPSTG ; SKOK NA VYPIS RETEZCE
;
;
; DEJ STATUS KONZOLY CMD 11
; ==================
;
GCOSTS: CALL TSTINP ; TEST VSTUPU
;
;
; ULOZENI NAVRATOVEHO PARAMETRU PRED NAVRATEM
;
SVSING: LD (RETPRM),A ; PRESUN NAVRATOVEHO PARAMETRU
RETRET: RET ; RETURN NA RETURN
;
;
SREPRM: LD A,1 ; NASTAVENI NAVR.PARAM.NA 1
JP SVSING ; SKOK NA ULOZENI NAVR.PARAM.
;
;
;
; POLE PRACOVNICH PROMENNYCH
; ==========================
;
BSFLAG: DEFB 0 ; BACKSPACE FLAG
ICPOS: DEFB 0 ; POZICE VSTUPUJICICH ZNAKU
CHRPOS: DEFB 0 ; POZICE VYSTUPUJICICH ZNAKU
CTLPF: DEFB 0 ; CTRL-P FLAS
INBYT: DEFB 0 ; BUFFER VSTUPUJICIHO BYTU
DEFS 42H ; ZASOBNIK BDOS
BDSP EQU $ ; VRCHOL ZASOBNIKU
SPSAV: DEFW 0 ; ULOZENI UZIV. [SP]
USRNO: DEFB 0 ; CISLO UZIVATELE
DSKNO: DEFB 0 ; CISLO DISKU
FCBSAV: DEFW 0 ; ULOZENI ADRESY FCB
RETPRM: DEFW 0 ; ULOZENI NAVR. PARAMETRU
;
;
;
; PROCEDURA SKOKU PODLE [HL]
;
VJUMP: LD HL,SLEJPA ; ADRESA ULOZENI ADRESY
; SKOKU DO [HL]
VJUMP1: LD E,(HL) ; PRESUN ADRESY SKOKU DO [DE]
INC HL
LD D,(HL)
EX DE,HL ; JEJI PRESUN DO [HL]
JP (HL) ; A SKOK
;
;
; VYBER DISKU A VYHLEDANI PARAMETRU DISKU
;
SD110: LD A,(DSKNO) ; CISLO DISKU DO [A]
LD C,A ; A DO [C]
CALL BIOS+1BH ; VYBER DISKU - [HL]
; OBSAHUJE PO NAVRATU
; ADRESU DISKOVYCH PA-
; RAMETRU
LD A,H
OR L ; TEST [HL] NA NULU => CHYBA
RET Z ; RETURN PRI CHYBE
LD E,(HL) ; ADRESA PREKLADOVE TABULKY
INC HL ; DO [DE]
LD D,(HL)
INC HL ; ADRESA PRACOVNI OBLASTI 1
LD (DPSC1),HL ; JEJI ULOZENI
INC HL
INC HL ; ADRESA PRACOVNI OBLASTI 2
LD (DPSC2),HL ; JEJI ULOZENI
INC HL
INC HL ; ADRESA PRACOVNI OBLASTI 3
LD (DPSC3),HL ; JEJI ULOZENI
INC HL
INC HL ;
EX DE,HL ; ADRESA ADRESY BUFFERU
; ADRESARE DO [DE]-
; (DIRBUF-VIZ BIOS)
LD (STRNP),HL ; ULOZENI ADR. PREKLADOVE TAB
LD HL,DIRBUP ; PRESUN CASTI PARAMETRU DISKU
LD C,8 ;
CALL MOVE ;
;
LD HL,(DPBP) ; PRESUN DRUHE CASTI PARAMETRU
EX DE,HL ; DISKU
LD HL,CUDPB ;
LD C,15 ;
CALL MOVE ;
;
LD HL,(CUDSM) ; VELIKOST DISKU (V BLOCICH)
LD A,H ; HORNI BYTE DO [A]
LD HL,DSKSFL ; ADR. DISK-SIZE-FLAGU DO [HL]
LD (HL),0FFH ; A JEJI INICIALIZACE
OR A ; TEST DISK-SIZE .GT.256 BLOKU
JP Z,SD150 ; SKOK DISK-SIZE .LE.256
LD (HL),0 ; NULOVANI DISK-SIZE FLAGU
SD150: LD A,0FFH ; NASTAVENI NZ-FLAGU PRED RET
OR A ;
RET
;
;
; 'HOME' A NULOVANI POCITADLA (#) STOP A MAX. POCTU
; SEKTORU NA STOPE
;
;
HOMCLR: CALL BIOS+18H ; 'HOME'-JEN PRO FLOPPY
XOR A ; NULA DO [A]
LD HL,(TRACK) ; ADR. # STOP DO [HL]
LD (HL),A ; NULOVANI # STOP
INC HL ;
LD (HL),A ;
;
LD HL,(MAXSOT) ; ADR. MAX. # SEKTORU NA STOPE
LD (HL),A ; JEHO NULOVANI
INC HL ;
LD (HL),A
RET
;
;
; PROCEDURA CTENI A ZAPISU NA DISK
;
READ: CALL BIOS+27H ; CTI VYBRANY SEKTOR
JP WRITE1
;
WRITE: CALL BIOS+2AH ; ZAPIS VYBRANY SEKTOR
WRITE1: OR A ; TEST [A] NA CHYBU
RET Z ; RET KDYZ DISK I/O OK
;
LD HL,BDSJPA ; ADR. NAVRATU S CHYBOU
JP VJUMP1 ; SKOK NA NAVRAT
;
;
;
; VYPOCET SEKTORU A STOPY A NASTAVENI SEKTORU A STOPY
;
DSKCAL: LD HL,(DETYNO) ; # AKT.VST.ADRESARE DO [HL]
LD C,2 ; CITAC POSUNU = 2
CALL RSHHL ; # AKT. VSTUPU/4
LD (BLOCK),HL ; ULOZENI CISLA SECTOR
LD (DETYSC),HL ; V NEMZ JE AKT. FCB ULOZENE
DSKCA1: LD HL,BLOCK ; ADR. ULOZENI # SEKTORU
LD C,(HL) ; PRESUN # SEKTORU DO [BC]
INC HL ;
LD B,(HL) ;
LD HL,(MAXSOT) ; HAX. # SEKTORU NA STOPE
LD E,(HL) ; DO [DE]
INC HL ;
LD D,(HL) ;
;
LD HL,(TRACK) ; AKT. # STOPY DO [HL]
LD A,(HL) ;
INC HL ;
LD H,(HL) ;
LD L,A ;
;
DC120: LD A,C ; POROVNANI HAX. A AKT.
SUB E ; CISLA SEKTORU
LD A,B ; [BC] - [DE]
SBC A,D ;
JP NC,DC140 ; AKT.# SEKTORU .GE. HAX.# SEK
;
PUSH HL ; UCHOVANI CISLA STOPY
LD HL,(CUSPT) ; AKT. # STOPY DO [HL]
LD A,E ; [DE] - [HL] = [DE]
SUB L ; MAX. # SEKT. NA STOPE -
LD E,A ; AKT. # SEKTORU
LD A,D
SBC A,H
LD D,A
POP HL ; OBNOVA # STOPY
DEC HL ; ; DEC CISLA STOPY
JP DC120 ; OPAKOVANI
;
DC140: PUSH HL ; USCHOVA # STOPY
LD HL,(CUSPT) ; AKT. CISLO SEKTORU DO [HL]
ADD HL, DE ; AKT. # SEKTORU + MAX. A SEK.
JP C,DC160 ; SKOK PRI OVERFLOW (65536)
LD A,C ; [BC] - [HL]
SUB L ;
LD A,B
SBC A,H
JP C,DC160 ; SKOK KDYZ SEKTOR JE NA
; .AKT. STOPE
EX DE,HL ; MAX # SEKTORU NA STOPE-> [DE]
POP HL ; # STOPY DO [HL]
INC HL ; INC # STOPY
JP DC140 ; OPAKOVANI
;
DC160: POP HL ; # STOPY DO [HL]
PUSH BC ; USCHOVA # VSTUPU ADRESARE
PUSH DE ; USCH.MAX # SECTORU NA STOPE
PUSH HL ; USCH. # STOPY
EX DE,HL ; # STOPY DO [DE]
LD HL,(CUOFF) ; OFFSET STOPY DO [HL]
ADD HL,DE ; URCENI FYZICKEHO # STOPY
LD B,H ; # STOPY DO [BC]
LD C,L
CALL BIOS+1EH ; NASTAVENI STOPY
POP DE ; OBNOVA # STOPY
LD HL,(TRACK) ; ADRESA ULOZENI # STOPY V BLO-
LD (HL),E ; KU DISKOVYCH PARAMETRU A ULO-
INC HL ; ZENI # STOPY
LD (HL),D
POP DE ; OBNOVA MAX # SEKTORU NA STOPE
LD HL,(MAXSOT) ; A JEHO ULOZENI DO BLOKU
LD (HL),E ; DISKOVYCH PARAMETRU (DPBASE)
INC HL
LD (HL),D
POP BC ; OBNOVA # SEKTORU
LD A,C ; [BC] - [CD] = [BC]
SUB E ; VYPOCET LOG. # SEKTORU
LD C,A
LD A,B
SBC A,D
LD B,A
LD HL,(STRNP) ; ADR. PREKLADOVE TAB SEKTORU
EX DE,HL ; DO [DE]
CALL BIOS+30H ; PREVOD LOG. # NA FYZICKE
LD C,L ; FYZ. # DO [BC]
LD B,H
JP BIOS+21H ; NASTAVENI SEKTORU + RET
;
;
; VYPOCET ADRESY ULOZENI CISLA BLOKU V FCB
;
BSHIFT: LD HL,CUBSH ; ADR BLOK-SHIFT-FAKTORU DO [HL]
LD C,(HL) ; BLOK-SHIFT-FAKTOR DO [C]
LD A,(D9) ; AKT. # ZAZNAMU DO [A]
BSH120: OR A ; NULA DO CARRY
RRA ; ROTACE VPRAVO
DEC C ; DEC BL-SH-FA
JP NZ,BSH120 ; OPAKOVANI
;
LD B,A ; VYSLEDEK DO [B]
LD A,08H ;
SUB (HL) ; ODECT. HODN. BL-SH-FA
LD C,A ; VYSLEDEK JAKO CITAC ROTACE
LD A,(MEX) ; MASKA ROZSIRENI DO [A]
BSH140: DEC C ; DEC CITACE
JP Z,BSH160 ; UKONCENI ROTACEXH
OR A ; NULOVANI CARRY
RLA ; ROTACE VLEVO
JP BSH140 ; OPAKOVANI
;
BSH160: ADD A,B ; CISLO BLOKU DO [A]
RET
;
;
; VYHLEDANI CISLA ALOKACNIHO BLOKU Z FCB
;
RETBLK: LD HL,(FCBSAV) ; ADR. FCB DO [HL]
LD DE,0010H ; OFFSET DO [DE]
ADD HL,DE ; ADR. ULOZENI # ALOK.BLOKU
ADD HL,BC ; AKT. ADRESA ULOZ.# AL.BLOKU
LD A,(DSKSFL) ; DISKSIZE FLAG DO A
OR A ; JEHO TEST
JP Z,RTBL10 ; SKOK PRI # BLOKU NAD 256
LD L,(HL) ; # BLOKU Z FCB DO [L]
LD H,0 ; NULOVANI HIGH BYTU # BLOKU
RET
;
RTBL10: ADD HL,BC ; AKT. ADRESA # BLOKU
LD E,(HL) ; # BLOKU Z FCB DO [DE]
INC HL
LD D,(HL)
EX DE,HL ; PRESUN # BLOKU DO [HL]
RET
;
;
; ZJISTI CISLO BLOKU
;
GETBLK: CALL BSHIFT ; VYPOCET # BLOKU
LD C,A ; VYSLEDEK DO [C]
LD B,0 ; NULA DO HORNIHO BYTU
CALL RETBLK ; VYHLEDANI # AL. BLOKU Z FCB
LD (BLOCK),HL ; ULOZENI CISLA BLOKU
RET
;
;
; TEST CISLA BLOKU NA NULU
;
TSTBLK: LD HL,(BLOCK) ; CISLO BLOKU DO [HL]
LD A,L
OR H ; A JEHO TEST NA NULU
RET
;
;
; ZJISTI CISLO SEKTORU
;
GETSEC: LD A,(CUBSH) ; BL-SH-FA DO [A]
LD HL,(BLOCK) ; # BLOKU DO [HL]
GET10: ADD HL,HL ; # BLOKU * 2
DEC A ; DEC BL-SH-FA
JP NZ,GET10 ; OPAKOVANI
LD (SECTOR),HL ; ULOZENI # SEKTORU
LD A,(CUBLM) ; HASKA BLOKU DO [A]
LD C,A ; A DO [C]
LD A,(D9) ; CITAC AKT.ZAZNAHU DO [A]
AND C ; JEHO MASKOVANI MASKOU BLOKU
OR L ; OR S # SEKTORU
LD L,A ;
LD (BLOCK),HL ; ULOZENI VYSLEDKU
RET
;
;
; ZJISTI ADRESU EXTENT Z FCB
;
EXADD: LD HL,(FCBSAV) ; ADRESA FCB DO [HL]
LD DE,12 ; OFFSET NA EX Z FCB
ADD HL,DE ; ADRESA EX Z FCB
RET
;
;
; ZJISTI ADRESU RC [DE] A D9 [HL] Z FCB
;
RCADD: LD HL,(FCBSAV) ; ADR. FCB DO [HL]
LD DE,15 ; RC OFFSET DQ [DE]
ADD HL,DE ; ADR. RC Z FCB
EX DE,HL ; DO [DE]
LD HL,17 ; OFFSET NA D9
ADD HL,DE ; ADR. D9
RET
;
;
; DEJ D9 (AKTUALNI CLTAC ZAZNAMU) A RC (CITAC ZAZNAMU)
;
LDD9RC: CALL RCADD ; PRIPRAVA ADR.D9 [HL] A RC [DE]
LD A,(HL) ; AKT.CITAC ZAZNAMU DO [A]
LD (D9),A ; ULOZENI D9
EX DE,HL ; ADR.RC DO [HL]
LD A,(HL) ; RC DO [A]
LD (RC),A ; ULOZENI RC
CALL EXADD ; ADR.NA EXTENT DO [HL]
LD A,(CUEXM) ; EXTENT-MASKA DO [A]
AND (HL) ; AND S EX Z FCB
LD (MEX),A ; ULOZENI MASKY ROZSIRENI
RET
;
;
; ULOZENI D9 A RC DO FCB
;
SVD9RC: CALL RCADD ; PRIPRAVA ADR.D9 [HL] A RC [DE]
LD A,(SECSE) ; INDIKACE DISKOVE SLUZBY DO [A]
CP 02 ; JE TO CMD 48?
JP NZ,SVRD10 ; NENI TO CMD 40
XOR A ; NULA DO [A]
SVRD10: LD C,A ; INDIKACE DO [C]
LD A,(D9) ; D9 DO [A]
ADD A,C ; D9+1 KDYZ CMD 20,21
; JINAK D9+0
LD (HL),A ; ULOZENI D9
EX DE,HL ; ADR.RC DO [HL]
LD A,(RC) ; RC DO [A]
LD (HL),A ; ULOZENI RC DO FCB
RET
;
;
; POSUN SPOJENYCH RESISTRU [HL] VPRAVO [C] KRAT
;
RSHHL: INC C ; TEST CITACE POSUNU
RSHHL1: DEC C ;
RET Z ; RET PO UKONCENI
LD A,H ; HORNI BYTE DO [A]
OR A ; NULOVANI CARRY
RRA ; ROTACE VPRAVO
LD H,A ; BYTE DO [H]
LD A,L ; DOLNI BYTE DO [A]
RRA ; ROTACE VPRAVO
LD L,A ; BYTE ZPET DO [L]
JP RSHHL1 ; OPAKOVANI
;
;
; GENEROVANI KONTROLNIHO SOUCTU ADRESARE
;
DIRCKS: LD C,128 ; DELKA BUFFERU ADRESARE
LD HL,(DIRBUP) ; ADR.BUFFERU ADRESARE DO [HL]
XOR A ; NULA DO [A]
DIRCK1: ADD A,(HL) ; VYPOCET SOUCTU
INC HL ; UPRAVA ADRESY
DEC C ; DEC POCITADLA
JP NZ,DIRCK1 ; OPAKOVANI
RET
;
;
; GENEROVANI MASKY DISKU
;
; REG C CISLO DISKU PRI VOLANI - NULA PO RET
; HL 0001 PRI CALL - MASKA DISKU PRI RET
;
GENMSK: INC C ; TEST CISLA DISKU
GEMSK1: DEC C ;
RET Z ; RETURN
ADD HL,HL ; SHIFT BIT MASKY O 1 POZ.VLEVO
JP GEMSK1 ; OPAKOVANI
;
;
; NASTAVENI BITU VEKTORU DISKU
;
; REG BC PUVODNI VEKTOR DISKU PRI CALL
; HL NOVY VEKTOR DISKU PRI RET
;
SETVEC: PUSH BC ; USCHOVA PUVODNIHO VEKTORU
LD A,(DSKNO) ; CISLO DISKU DO [A]
LD C,A ; A DO [C]
LD HL,0001 ; NASTAVENI MASKY PRO JEDN. A:
CALL GENMSK ; GENEROVANI MASKY
POP BC ; OBNOVA PUVODNIHO VEKTORU
LD A,C ; SPODNI BYTE DO [A]
OR L ; JEHO AKTUALIZACE
LD L,A ; A PRESUN DO [L]
LD A,B ; HORNI BYTE DO [A]
OR H ; JEHO AKTUALIZACE
LD H,A ; A PRESUN DO [H]
RET
;
;
; TEST NA DISK R/O
;
TSTDRO: LD HL,(ROVEC) ; READ ONLY VEKTOR DO [HL]
LD A,(DSKNO) ; # DISKU DO [A]
LD C,A ; DO [C]
CALL RSHHL ; NASTAVENI ODPOV, BITU R/O VEKT.
LD A,L ; LOW BYTE (0 BIT) DO [A]
AND 01 ; NASTAVENI 0 BITU
RET
;
;
; OZNAC DISK JAKO CHRANENY PROTI ZAPISU CMD 28
; =====================================
;
WRTPRT: LD HL,ROVEC ; ADR.READ ONLY VECTORU
LD C,(HL) ; JEHO PRESUN DO [BC]
INC HL
LD B,(HL)
CALL SETVEC ; NASTAVENI BITU V R/O VEKTORU
LD (ROVEC),HL ; ULOZENI R/O VEKTORU
;
LD HL,(CUDRM) ; KAX.# VSTUPU ADRESARE
INC HL ; JEHO INC
EX DE,HL ; A PRESUN DO [DE]
LD HL,(DPSC1) ; ADR.PRAC.POLE 1 V DPBASE
LD (HL),E ; ULOZENI MAX. #+1 ADRESARE
INC HL
LD (HL),D
RET
;
;
; TEST NA READ ONLY
;
TSTRO: CALL DIRADR ; DEJ ADR. VSTUPU ADRESARE
TST1: LD DE,9 ; OFFSET NA T1 NAZVU SOUBORU
ADD HL,DE ; ADRESA T1
LD A,(HL) ; T1 DO [A]
RLA ; TEST HIGH BITU
RET NC ; RET KDYZ NENI NAST.=>NOT R/O
LD HL,FROJPA ; ADR. NA "FILE R/O ERROR"
JP VJUMP1 ; SKOK NA SKOK PODLE [HL]
;
; TEST NA NOT R/O
;
TSTNRO: CALL TSTDRO ; TEST NA R/O
RET Z ; RET KDYZ NOT READ ONLY
LD HL,ROEJPA ; ADR. NA "READ ONLY ERROR"
JP VJUMP1 ; SKOK NA SKOK PODLE [HL]
;
;
; GENEROVANI ADRESY AKT. FCB V BUFFERU ADRESARE
;
DIRADR: LD HL,(DIRBUP) ; ADRESA BUFFERU ADRESACE
LD A,(DIROFF) ; OFFSET ADRESARE
DIRAD1: ADD A,L ; ADRESA AKT. FCB DO [HL]
LD L,A
RET NC
INC H
RET
;
;
; PRESUN S2 Z FCB
;
LDS2: LD HL,(FCBSAV) ; ADRESA FCB DO [HL]
LD DE,14 ; OFFSET NA S2
ADD HL,DE ; ADRESA S2
LD A,(HL) ; S2 DO [A]
RET
;
;
; NULOVANI S2 V FCB
;
CLRS2: CALL LDS2 ; PRIPRAVA ADRESY S2
LD (HL),0 ; NULA DO S2
RET
;
;
; NASTAVENI 7 BITU S2 V FCB
;
ST7S2: CALL LDS2 ; ADR. S2 DO [A]
OR 80H ; NAST.7 BITU S2
LD (HL),A ; ULOZENI S2
RET
;
;
; POROVNANI AKT. # VSTUPU ADRESARE S MAX # VSTUPU
; ADRESARE
;
TDIRET: LD HL,(DETYNO) ; # VSTUPU DO [HL]
EX DE,HL ; A DO [DE]
LD HL,(MAXDIE) ; MAX.# VSTUPU DO [HL]
LD A,E ; JEJICH POROVNANI
SUB (HL) ;
INC HL
LD A,D
SBC A,(HL)
RET
;
;
; VYPOCET A TEST CISLA VSTUPU ADRESARE
;
TSTMDI: CALL TDIRET ; POROVNANI AKT. A MAX # VST.
RET C ; RET KDYZ AKT. .LE. MAX
INC DE ; INC AKT. # VSTUPU
LD (HL),D ; JEHO PRESUN DO [HL]
DEC HL
LD (HL),E
RET
;
;
; POROVNANI AKTUALNIHO CITACE VSTUPU ADRESARE S MAX.
; REG DE - MAX.
; HL - AKT.
;
;
SDEMHL: LD A,E ; [DE] - [HL] = [HL]
SUB L
LD L,A
LD A,D
SBC A,H
LD H,A
RET
;
;
; KONTROLA NA ZMENU ADRESARE
;
CKDS00: LD C,0FFH ; 0FFH DO [C]
;
CKDSKC: LD HL,(DETYSC) ; # AKT.SEKTORU ADRESARE DO [HL]
EX DE,HL ; DO [DE]
LD HL,(CUCKS) ; VELIKOST VEKT. ADRESARE DO [HL]
CALL SDEMHL ; [DE] - [HL] = [HL]
RET NC ; RET KDYZ VEKT.ADR.LE.#AKT SEK
PUSH BC ; USCHOVA [BC]
CALL DIRCKS ; GENER.KONTROLNIHO SOUCTU
; SEKTORU ADRESARE DO [A]
LD HL,(CSVP) ; ADR.PRAC.POLE PRO VYM.DISKU
EX DE,HL ; DO [DE]
LD HL,(DETYSC) ; # SEKTORE VSTUPU ADRESARE
ADD HL,DE ; ADR. ULOZ. KONTR. SOUCTU
; PUVODNIHO
POP BC ; OBNOVENI [BC]
INC C
JP Z,CKDS10 ; SKOK BYL VST.BOD CKD00
CP (HL) ; POROVNANI S NOVYM
; KONTROLNIM SOUCTEM
RET Z ; RET KDYZ SOUHLASI
CALL TDIRET ; TEST VSTUPU ADRESARE
RET NC ;
CALL WRTPRT ; PRI VYMENE DISKU =>
; WRITE PROTECT DISK
RET
CKDS10: LD (HL),A ; ULOZENI KONTROLNIHO SOUCTU
RET
;
;
; ZAPIS A CTENI BUFFERU ADRESARE
;
WDB: CALL CKDS00 ; KONTROLA NA ZMENU ADRESARE
;
CALL DMA120 ; NASTAVENI DMA-ADR PRO
; BUFFER ADRESARE
LD C,01 ; INDIKACE DO [C]
CALL WRITE ; ZAPIS SEKTORU ADRESARE
JP DMA110 ; RESET DMA ADR + RETURN
;
WDB1: CALL DMA120 ; NAST.DMA-ADR PRO BUFFER
CALL READ ; CTENI SEKTORU ADRESARE
;
;
; NASTAVENI DMA ADRESY
;
DMA110: LD HL,DMAADR ; DMA ADR. DO [HL]
JP DMA130
DMA120: LD HL,DIRBUP ; ADR. BUFFERU ADRESARE DO [HL]
;
DMA130: LD C, (HL) ; DMA ADR DO [BC]
INC HL
LD B,(HL)
JP BIOS+24H ; SKOK NA NASTAVENI DMA + RET
;
;
; PRESUN SEKTORU ADRESARE DO DMA-ZONY
;
MOVDIR: LD HL,(DIRBUP) ; ADR. BUFFERU ADRESARE DO [HL]
EX DE,HL ; A DO [DE]
LD HL,(DMAADR) ; DMA ADR DO [HL]
LD C, 128 ; NASTAVENI DELKY
;
;
; PROCEDURA PRESUNU
;
; PRESUN [C] BYTU Z ADRESY V [DE] NA ADRESU V [HL]
;
MOVE: INC C ; TEST PRENESENEHO POCTU ZNAKU
MOVE10: DEC C ;
RET Z ; RETURN PO UKONCENI PRESUNU
LD A,(DE) ; BYTE DO [A]
LD (HL),A ; JEHO ULOZENI
INC DE ; UPRAVA ADRES ZDROJOVEHO
; A CILOVEHO POLE
INC HL
JP MOVE10 ; OPAKOVANI
;
;
; TEST AKT.CLSLA VSTUPU => LOW BYTE .EQ. HIGH BYTE
;
TSTDIE: LD HL,DETYNO ; ADR. ULOZENI # VSTUPU
LD A,(HL) ; LOW BYTE DO [A]
INC HL
CP (HL) ; TEST LOW BYTE .EQ. HI5H BYTE
RET NZ ; RET KDYZ .NE.
INC A ;
RET
;
;
; OBSLUHA ADRESARE
;
DIR: LD HL,(CUDRM) ; MAX.# POLOZEK ADRESARE
EX DE,HL ; DO [DE]
LD HL,(DETYNO) ; AKT. CITAC VSTUPU DO [HL]
INC HL ; NASTAVENI PRVNIHO (0)
LD (DETYNO),HL ;
CALL SDEMHL ; POROVNANI AKT. CITACE VSTUPU
; S MAX.
JP NC,DIR120 ; AKT.CITAC .LE. MAX.
;
;
; NASTAVENI AKT. CISLA (#) VSTUPU ADRESARE NA -1
;
CLRDIR: LD HL,-1 ; NASTAVENI [HL]
LD (DETYNO),HL ; NASTAVENI # VSTUPU NA -1
RET
;
DIR120: LD A,(DETYNO) ; AKT. CITAC VSTUPU DO [A]
AND 03H ; VYPOCET POSUNUTI (OFFSET)
LD B,5 ; V ULOZENI SEKTORU ADRESARE
DIR140: ADD A,A ;
DEC B ;
JP NZ,DIR140 ;
LD (DIROFF),A ; ULOZENI OFFSETU
OR A ; TEST OFFSETU NA NULU
RET NZ ; RET KDYZ VSTUP NENI PRVNI
;
; NACTENI DALSIHO SEKTORU ADRESARE
;
PUSH BC ; USCHOVA [BC] B=0 C=-1
CALL DSKCAL ; VYPOCET A NASTAVENI # SEKTORU
; A # STOPY ADRESARE
CALL WDB1 ; NACTENI SEKTORU ADRESARE
POP BC ; OBNOVA [BC]
JP CKDSKC ; KONTROLA NA VYMENU DISKU+RET
;
; PRIPRAVA ZAZNAMU DO ALOKACNI KAPY
;
TL100: LD A,C ; CISLO ALOKACNIHO BLOKU DO [A]
AND 07H ; URCENI BITU V ALOKACNIH BYTU
INC A ;
LD E,A ; JEHO USCHOVA
;
LD D,A ; VYPOCET OFFSETU V ALOKACNI
LD A,C ; MAPE
RRCA ; [BC] - CISLO BLOKU
RRCA
RRCA
AND 1FH ; ROTOVANEHO LOW BYTU
LD C,A ; # ALOKACNIHO BLOKU DO [C]
LD A,B
ADD A,A ; ([A] * 32)OR(# BLOKU/MOD 8)
ADD A,A
ADD A,A
ADD A,A
ADD A,A
OR C
LD C,A ; VYSLEDEK DO [C]
;
LD A,B ; HORNI BYTE # AL. BLOKU
RRCA
RRCA
RRCA
AND 1FH ; EX. BITU 5,6,7
LD B,A
LD HL,(ALVP) ; ADR. ULOZENI ALOKACNI MAPY
ADD HL,BC ; ADR. AKT.BYTU AL. MAPY
LD A,(HL) ; ALOKACNI BYT DO [A]
TL120: RLCA ; ROTACE ALOKACNIHO BYTU
DEC E ; A NAST.AKT.BITU K ZAZNAMU
JP NZ,TL120
RET
;
; ZAZNAM DO ALOKACNIHO BYTU A JEHO ULOZENI
;
TL140: PUSH DE ; USCHOVA [DE]
CALL TL100 ; PRIPRAVA ZAZNAMU DO AL. MAPY
AND 0FEH ; VYMAZ AKT.BITU Z MAPY
POP BC ; OBNOVA ZAZN. KONSTANTY
OR C ; ZAPIS AL. BITU
TL160: RRCA ; ZPETNA ROTACE ALOKACNIHO
DEC D ; BYTU
JP NZ,TL160 ;
LD (HL),A ; ULOZENI ALOKACNIHO BYTU
RET
;
; GENEROVANI ALOKACNI MAPY
;
TL180: CALL DIRADR ; ADR. AKT. FCB DO [HL]
LD DE,16 ; OFFSET NA PRVNI # AL.BLOK(D0)
ADD HL,DE ; ADR. D0 V ADRESARI
PUSH BC ; USCHOVA [BC]
LD C,11H ; POCITADLO ULOZENI # AL.BLOKU
TL190: POP DE ; E=L, D=0
DEC C
RET Z ;
PUSH DE ; USCHOVA [DE]
LD A,(DSKSFL) ; VELIKOST DISKU DO [A]
OR A ; JEHO TEST
JP Z,TL200 ; VELIKOST .GT. 256
PUSH BC ; USCHOVA POCITADLA
PUSH HL ; USCHOVA ADR. # AL.BLOKU
LD C,(HL) ; # ALOKACNIHO BLOKU DO [C]
LD B,0 ; NULA DO [B]
JP TL220 ;
;
TL200: DEC C ; UPRAVA POCITADLA
PUSH BC ; JEHO USCHOVA
LD C,(HL) ; # AL. BLOKU DO [BC]
INC HL ;
LD B,(HL) ;
PUSH HL ; USCHOVA ADR.# AL. BLOKU
;
TL220: LD A,C ; TEST # ALOKACNIHO BLOKU NA
OR B ; NULU
JP Z,TL240 ; SKOK KDYZ # A. BL. .EQ. 0
LD HL,(CUDSM) ; TEST NA PREKROCENI MAX.
LD A,L ; VELIKOSTI DISKU
SUB C ; [HL] - [BC]
LD A,H ;
SBC A,B ;
CALL NC,TL140 ; VELIKOST NENI PREKROCENA
;
TL240: POP HL ; AKTUALIZACE ADRESY # AL.BLOKU
INC HL ;
POP BC ;
JP TL190 ;
;
;
;
;
; NULOVANI ALOKACNI MAPY (VEKTORU)
;
CLRALV: LD HL,(CUDSM) ; VELIKOST DISKU V BLOCICH DO HL
LD C,3 ; CITAC = 3
CALL RSHHL ; DELENO 8 =>POCET BYTU AL. VEKT.
INC HL ;
LD B,H ; PRESUN VYSLEDKU DO [BC]
LD C,L ;
LD HL,(ALVP) ; PRVNI BYTE AL.VEKTORU DO [HL]
CLALV1: LD (HL),0 ; NULOVANI JEDNOTLIVYCH BYTU
INC HL ;
DEC BC ;
LD A,B ; TEST POCITADLA BYTU
OR C
JP NZ,CLALV1 ; OPAKOVANI
;
LD HL,(CUAL) ; AL. VEKTOR ADRESARE DO [HL]
EX DE,HL ; DO [DE]
LD HL,(ALVP) ; ADR. ALOKACNIHO VEKTORU
LD (HL),E ; INICIALIZACE AL. VEKTORU
INC HL
LD (HL),D
;
CALL HOMCLR ; "HOHE" A NULOVANI #STOPY
; A MAX. POCTU SEKTORU NA STOPE
LD HL,(MAXDIE) ; NAST. MAX. CISLA VSTUPU DO
LD (HL),3 ; SEKTORU ADRESARE NA 3
INC HL ; ADR. HIGH BYTU MAXDIE
LD (HL),0
CALL CLRDIR ; NASTAVENI # VSTUPU DO SEKTORU
; ADRESARE NA -1
TL260: LD C,0FFH ; [C] DO -1
CALL DIR ; OBSLUHA ADRESARE
CALL TSTDIE ; TEST # VST.ADRESARE NA NULU
RET Z ; RET KDYZ A VSTUPU .EQ. 0
;
CALL DIRADR ; GENER.ADR. ULOZENI AKT, FCB
LD A,0E5H ; PRIZNAK INICIALIZACE FCB [A]
CP (HL) ; JE FCB INICIALIZOVANE
JP Z,TL260 ; SKOK KDYZ NENI
;
LD A,(USRNO) ; # UZIVATELE DO [A]
CP (HL) ; JEHO TEST
JP NZ,TL280 ; # UZIVATELE NESOUHLASI
INC HL ; ADR. DRUHEHO BYTU ADRESARE
LD A,(HL) ; DO [A]
SUB 24H ; SUBTRACT '$'
JP NZ,TL280 ; SKOK KDYZ .NE. $
DEC A ; INICIALIZACE RETPRM
LD (RETPRM),A ; NA 0FFH
;
TL280: LD C,1 ;
CALL TL180 ; GENEROVANI ALOKACNI MAPY
CALL TSTMDI ; PRIPRAVA DALSIHO # VSTUPU
JP TL260 ; ADRESARE A OPAKOVANI
;
; PRIPRAVA NAVRATOVEHO PARAMETRU PROCEDURY
;
TL300: LD A,(RPSAV) ; NAVR. PARAMETER DO [A]
JP SVSING ; JEHO ULOZENI + RET
;
;
TL320: PUSH BC ; USCHOVA "EX" Z DIR
PUSH AF ; USCHOVA "EX" Z FCB
LD A,(CUEXM) ; EXTEND-HASK DO [A]
CPL ; JEJI KOMPLEMENT
LD B,A ; DO [B]
LD A,C ; "EX" Z DIR DO [A]
AND B ; JEHO .AND. S KOHPL. CUEXM
LD C,A ; VYSLEDEK DO [C]
POP AF ; "EX" Z FCB DO [A]
AND B ; JEHO .AND. S KOMPL. CUEXM
SUB C ; ODECTENI UPRAVENEHO EX
AND 1FH ; A MASKA
POP BC ; OBNOVENI [BC]
RET ;
;
; HLEDEJ PRVNI VYSKYT V ADRESARI
;
SFFP: LD A,0FFH ; INICIALIZACE NAVRAT. PARAM.
LD (RPSAV),A ; PROCEDURY
LD HL,SRGSAV ; ADR.ROZSAHU SHODY PRI HLEDANI
LD (HL),C ; JEJI NASTAVENI
LD HL,(FCBSAV) ; ADR. FCB DO [HL]
LD (FCBP),HL ; JEJI POMOCNE ULOZENI
CALL CLRDIR ; NAST. # VST. DO SEKT.DIR =-1
CALL HOMCLR ; "HOME" A NULOVANI # STOPY A
; MAX. POCTU SEKTORU NA STOPE
;
; HLEDEJ DALSI VYSKYT SOUBORU V ADRESARI
;
TL400: LD C,0 ; 0 DO [C]
CALL DIR ; OBSLUHA ADRESARE
CALL TSTDIE ; TEST # VSTUPU ADRESARE NA 0
JP Z,TL500 ; SKOK KDYZ # VSTUPU .EQ. 0
LD HL,(FCBP) ; ADRESA FCB DO [HL]
EX DE,HL ; DO [DE]
LD A,(DE) ; TEST PLATNOSTI FCB
CP 0E5H ;
JP Z,TL420 ; FCB JE ZRUSENE
PUSH DE ; USCHOVA ADRESY FCB
CALL TDIRET ; TEST PREK. MAX.# VST.ADRESARE
POP DE ; OBNOVA ADRESY FCB
JP NC,TL500 ; SKOK KDYZ # VSTUPU PREKROCENO
;
TL420: CALL DIRADR ; GENEROVANI ADRESY ADRESARE
LD A,(SRGSAV) ; ROZSAH POROVNANI DO [A]
LD C,A ; DO [BC]
LD B,0 ;
;
TL430: LD A,C ; TEST UKONCENI
OR A ;
JP Z,TL480 ; POROVNANI UKONCENE
LD A,(DE) ; ZNAK NAZVU DO [A]
CP '?' ; JE TO ?
JP Z,TL460 ; ANO,HUZE TO BYT JAKYKOLIV ZNAK
LD A,B ; PORADI ZNAKU DO [A]
CP 0DH ; POROVNANO VCETNE "EX" ?
JP Z,TL460 ; ANO
CP 0CH ; POROVNANO AZ PO "EX" ?
LD A,(DE) ; PRUBEZNE POROVNAVANY ZNAK DO [A]
JP Z,TL440 ; NASLEDUJE POROVNANI "EX"
SUB (HL) ; POROVNANI PRUBEZNYCH ZNAKU
AND 7FH ;
JP NZ,TL400 ; NESOUHLASI
JP TL460 ; JSOU SHODNE
;
TL440: PUSH BC ; USCH.CITACE PORADI A POR.ZNAKU
LD C,(HL) ; "EX" Z DIR DO [C]
CALL TL320 ; UPRAVA "EX"
POP BC ; OBN.CITACE PORADI A POR. ZNAKU
JP NZ,TL400 ; SKOK KDYZ UPRAVA "EX" .NE. 0
;
TL460: INC DE ; ADR. DALSIHO ZNAKU V UZIV FCB
INC HL ; ADR. DALSIHO ZNAKU V DIR-FCB
INC B ; INC CITACE PORADI
DEC C ; DEC CITACE POR. ZNAKU
JP TL430 ; OPAKOVANI
;
TL480: LD A,(DETYNO) ; AKT.# VSTUPU ADRESARE DO [A]
AND 03 ; EXTRAKT SPODNICH 2 BITU
LD (RETPRM),A ; AKT.# VSTUPU DO NAVR.PAR.SLUZBY
LD HL,RPSAV ; TEST A NASTAVENI NAVRATOVEHO
LD A,(HL) ; PARAHETRU SLUZBY
RLA ; TEST BITU 7
RET NC ; RET KDYZ NENI NASTAVENY
XOR A ; NULA DO [A]
LD (HL),A ; A DO NAVRATOVEHO PARAHETRU
RET ; PROCEDURY
;
; HLEDANY SOUBOR SE NENASEL
;
TL500: CALL CLRDIR ; NAST.AKT,# VSTUPU NA -1
LD A,0FFH ; INDIKACE CHYBY DO [A]
JP SVSING ; NACTAVENI NAVR.PAR. SLUZBY+RET
;
;
; PROCEDURA ZRUSENI SOUBORU
;
;
DELFP: CALL TSTNRO ; TEST NA NOT READ ONLY
; HLEDANI PRVNIHO EXTENDU SOUBORU
LD C,12 ; ROZSAH POROVNANI (JHENO)
CALL SFFP ; HLEDANI PRVNIHO VYSKYTU V ADRESARI
LB004: ; TEST NALEZENI HLEDANEHO SOUBORU
CALL TSTDIE ;
RET Z ; RET KDYZ NENALEZEN
; OZNACENI EXTENDU JAKO ZRUSENEHO
CALL TSTRO ; TEST NA R/O SOUBORU
CALL DIRADR ; GENEROVANI ADRESY ADRESARE
LD (HL),0E5H ; OZNACENI FCB
LD C,0 ; NULA DO [C]
CALL TL180 ; NULOVANI ODPOVIDAJICICH BITU AL.HAPY
CALL WDB ; ZAPIS BUFFERU ADRESARE
CALL TL400 ; HLEDANI DALSIHG EXTENDU ADRESARE
JP LB004 ;
;
;
;
; VYPOCET ALOKACE BLOKU
;
COBLLO: ; HLEDANI NEJBLIZSIHO VOLNEHO
LD D,B ; BLOKU V OBOU SHERECH
LD E,C ; PREDCHOZI OBSAZENE # BLOKU DO [BC]
LB018: ;
; TEST CLSLA BLOKU NA NULU
LD A,C
OR B
JP Z,LB015 ; KDYZ NULA =>HLEDANI V SMERE DOLU
; JINAK TEST DALSIHO BLOKU
DEC BC ; DEKREMENT # BLOKU
PUSH DE ; USCH. # BLOKU PRO HLEDANI
; VE SHERU NAHORU
PUSH BC ; VE SHERU DOLU
CALL TL100 ; TEST BITU Z ALOKACNI HAPY
RRA ;
;
JP NC,LB016 ; BLOK JE VOLNY-JEHO REZERVACE
; A RETURN
; OBNOVA # BLOKU PRO HLEDANI
POP BC ; VE SMERU NAHORU
POP DE ; VE SMERU DOLU
LB015: ;
;
LD HL,(CUDSM) ; VELIKOST DISKU (POCET BLOKU)DO [HL]
; [DE] - [HL] TO TDE]
LD A,E ; TEST PREKROCENI VELIKOSTI
SUB L
LD A,D
SBC A,H
JP NC,LB017 ; VELIKOST PREKROCENA
; HLEDANI DALSIHO BLOKU
INC DE ; INC # BLOKU
PUSH BC ; SUSCHOVA # BLOKU PRO HLEDANI
PUSH DE ; V OBOU SMERECH
;
LD B,D ; PRESUN # BLOKU DO [BC]
LD C,E
CALL TL100 ; TEST BITU V ALOKACNI MAPE
RRA ;
JP NC,LB016 ; REZERVOVANI + RET
;
POP DE ; OBNOVA # BLOKU PRO HLEDANI V
POP BC ; OBOU SMERECH
JP LB018 ; OPAKOVANI
LB016: ; ZPETNE ULOZENI DO ALOKACNI
; MAPY
RLA
INC A ; OBSAZENI BITU V AL. MAPE
CALL TL160 ;
; OBNOVA # BLOKU
POP HL ; # VOLNEHO BLOKU
POP DE ; # POSLEDNIHO BLOKU
RET ;
LB017: ;
LD A,C ; TEST # BLOKU NA NULU (V SMERE DOLU)
OR B
JP NZ,LB018 ; OPAKOVANI
LD HL,0 ; JINAK 0=>[HL] - DISK PLNY
RET ;
;
;
; PRESUN FCB DO SEKTORU ADRESARE A ZAPIS
;
; PRIPRAVA VST. PARAMETRU
LB020: LD C,0 ; RELATIVNI ADRESA PRESOUVAME CASTI
LD E,32 ; ROZSAH PRESOUVANE CASTI
;
; PRESUN CASTI FCB DO SEKTORU ADRESARE A ZAPIS
;
;
MOVFCB: ;
PUSH DE ; USCHOVA ROZSAHU PRESUNU
LD B,0 ; NULA DO [B]
LD HL,(FCBSAV) ; ADR. FCB DO [HL]
ADD HL,BC ; POC. ADRESA PRESUNU DO [HL]
EX DE,HL ; A DO [DE]
CALL DIRADR ; ADRESA VOLNEHO FCB
POP BC ; ROZSAH PRESUNU DO [BC]
CALL MOVE ; PRESUN [C] BYTO Z [DE] DO [HL]
LB014: CALL DSKCAL ; VYPOCET A NASTAVENI SEKTORU A STOPY
JP WDB ; ZAPIS SEKTORU ADRESARE
;
;
; PROCEDURA PREJMENOVANI SUBORU
; =============================
;
RENFP: CALL TSTNRO ; TEST NA DISK NOT READ ONLY
; HLEDANI PRVNIHO EXTENDU SOUBORU
LD C,12 ; ROZSAH POROVNANI (JMENO)
CALL SFFP ; HLEDANI PRVNIHO VYSKYTU
; PRESUN # DISKU A # UZIVATELE
LD HL,(FCBSAV) ; ADRESA FCB DO [HL]
LD A,(HL) ; # DISKU A # UZIVATELE DO [A]
; ADRESA 1 ZNAKU NOVEHO JMENA
LD DE,16 ; DO [HL]
ADD HL,DE
LD (HL),A ; ULOZENI # DISKU A # UZIVATELE
;
LB003: CALL TSTDIE ; EXTEND NALEZEN ?
RET Z ; RET KDYZ NE
; PREJMENOVANI PRVNIHO EXTENDU A
; HLEDANI DALSIHO
CALL TSTRO ; TEST NA READ ONLY SOUBORU
;
LD C,16 ; REL. ADRESA NOVEHO
LD E,12 ; ROZSAH PRESUNU
CALL MOVFCB ; PRESUN JMENA DO DIR-FCB A ZAPIS
CALL TL400 ; HLEDANI DALSIHO EXTENDU SOUBORU
JP LB003 ;
;
;
; PROCEDURA NACTAVENI ATRIBUTU SOUBORU
; ====================================
;
; HLEDANI PRVNIHO EXTENDU SOUBORU
SETFAP: LD C,12 ; NACTAVENI ROZSAHU POROVNANI
CALL SFFP ; HLEDANI PRVNIHO VYSKYTU SOUBORU
;
LBA14: CALL TSTDIE ; TEST NALEZENI
RET Z ; RET KDYZ NENALEZEN
;
LD C,0 ; REL. ADR. PRESUNU DO [C]
LD E,12 ; ROZSAH POROVNAVANI DO [E]
CALL MOVFCB ; PRESUN JMENA DO DIR-FCB + ZAPIS
CALL TL400 ; HLEDANI DALSIHO EXTENDU SOUBORU
JP LBA14 ;
;
;
; PROCEDURA OTEVRENI SOUBORU
; ==========================
;
OPFP: ; HLEDANI EXTENDU SOUBORU
LD C,15 ; NASTAVENI ROZSAHU POROVNANI
CALL SFFP ; HLEDANI PRVNIHO VYSKYTU
CALL TSTDIE ; TEST NALEZENI
RET Z ; RET KDYZ NENALEZEN
; ULOZENI "EX" Z UZIV. FCB
OPFP1:
CALL EXADD ; ADRESA NA "EX"
LD A,(HL) ; "EX" Z UZIV. FCB DO [A]
PUSH AF ; USCHOVA "EX"
PUSH HL ; A JEHO ADRESY
; PRESUN DIR-FCB DO UZIV. FCB
; PRIPRAVA PARAMETRU
CALL DIRADR ; GENEROVANI ADRESY ADRESARE
EX DE,HL ; PRESUN DIR.ADR DO [DE]
LD HL,(FCBSAV) ; ADRESA UZIV. FCB DO [HL]
LD C,32 ; ROZSAH PRESUNU DO [C]
PUSH DE ; USCHOVA DIR. ADR
CALL MOVE ; PRESUN FCB
CALL ST7S2 ; NASTAVENI BITU 7 V S2
; PRESUN "EX" Z DIR-FCB DO [C]
POP DE ; OBNOVA DIR. ADR
LD HL,12 ; OFFSET NA "EX"
ADD HL,DE ; ADR. "EX" Z DIR-FCB DO [HL]
LD C,(HL) ; "EX" DO [C]
; "RC" Z DIR-FCB DO [B]
LD HL,15 ; OFFSET NA "RC"
ADD HL,DE ; ADRESA "RC" Z DIR-FCB DO [HL]
LD B,(HL) ; "RC" DO [B]
; ZPETNE ULOZENI "EX" DO UZIV.FCB
POP HL ; ADRESA UZIV. "EX" DO [HL]
POP AF ; OBNOVA "EX"
LD (HL),A ; ULOZENI"EX"
; POROVNANI "EX" Z UZIV. A DIR. FCB
LD A,C ; "EX" Z DIR-FCB DO [A]
CP (HL) ; POROVNANI
; KDYZ SE ROVNAJI
LD A,B ; ULOZENI "RC"
JP Z,LB005
; KDYZ "EX" Z DIR-FCB .LT."EX" UZIV.
LD A,0 ; NULOVANI "RC"
JP C,LB005
; KDYZ "EX" Z DIR-FCB .GT. "EX" UZIV.
LD A,80H ; NASTAVENI "RC" NA 80H
; ULOZENI "RC"
; ADRESA "RC" DO [HL]
LB005: LD HL,(FCBSAV)
LD DE,15 ; OFFSET NA "RC"
ADD HL,DE
LD (HL),A ; ULOZENI
RET ; RETURN
;
;
; PRESUN 2 BYTU Z ADRESY V [DE] NA ADRESU V [HL] KDYZ
; [HL].EQ.[HL+1]
;
LB011: ; KDYZ [HL].EQ.[HL+1]
LD A,(HL)
INC HL
OR (HL)
DEC HL
RET NZ
; POTOM
; PRESUN LOW BYTU
LD A,(DE)
LD (HL),A
; PRESUN HIGH BYTU
INC DE
INC HL
LD A,(DE)
LD (HL),A
; UPRAVA ADRES
DEC DE
DEC HL
RET ; RETURN
;
;
; PROCEDURA UZAVRENI SOUBORU
; ==========================
;
CLFP: ; NULOVANI PRAC. PARAMETRU
XOR A ; NULA DO [A]
LD (RETPRM),A ; NULOVANI NAVRATOVEHO PARAMETRU
; NULOVANI CISLA VSTUPU ADRESARE
LD (DETYNO),A ; LOW BYTE
LD (DETYNO+1),A ; HIGH BYTE
; RET KDYZ JE DISK READ ONLY
CALL TSTDRO ; TEST
RET NZ ; RETURN
; RET KDYZ EXTEND NENI NASTAVEN
; K ZAPISU
CALL LDS2 ; S2 DO A
AND 80H ; EX. 7 BITU
RET NZ ; RET KDYZ 7. BIT S2 = 1
; HLEDANI ODPOVIDAJICI POLOZKY V
LD C,15 ; ADRESARI - NAST. ROZSAHU
CALL SFFP ; HLEDANI PRVNIHO VYSKYTU
CALL TSTDIE ; TEST NALEZENI
RET Z ; NENALEZEN => RET
; PRIPRAVA PARAM. K PRESUNU # BLOKU
; DO [DE] ADR, PRVNIHO # BLOKU Z FCB
LD BC,16 ; 16 DO [BC]
CALL DIRADR ; GENEROVANI ADRESY ULOZENI ADRESARE
ADD HL,BC ; VYPOCET ADRESY ULOZENI PRVNIHO
; # BLOKU (D0) V ADRESARE
EX DE,HL ; A JEJI PRESUN DO [DE]
; NASTAVENI ADR. D0 V UZIV. FCB
LD HL,(FCBSAV) ; ADR, UZIV. FCB DO [HL]
ADD HL,BC ; ADR. D0 V UZIV FCB
LD C,16 ; NASTAVENI CITACE PRESUNU
LB012: ;
LD A,(DSKSFL) ; TEST VELIKOSTI DISKU
OR A ;
JP Z,LB006 ; SKOK KDYZ VELIKOST .GT. 256 KB
;
; KDYZ # BLOKU Z UZIV.FCB JE NULA
LD A,(HL) ; OAD D(N) OF USER FCB TO [A]
OR A ;
LD A,(DE) ; PRESUN # BLOKU Z FCB V ADRESARI
; (DIR-FCB)
JP NZ,LB007 ; SKOK KDYZ NOT .EQ. 0
; PRESUN # BLOKU Z DIR-FCB DO
LD (HL),A ; UZIVATELSKEHO FCB
LB007: ;
OR A ; TEST # BBLOKU Z DIR-FCB NA NULU
JP NZ,LB008
;
LD A,(HL) ; PRESUN # BLOKU DO UZIV. FCB
LD (DE),A
LB008: ; POROVNANI # BLOKU Z UZIVATELSKEHO
CP (HL) ; A DIR-FCB
JP NZ,LB009 ; NEJSOU SHODNA => CHYBA + RET
JP LB010 ; JSOU SHODNA
;
LB006: ; PRESUN # BLOKU Z DIR-FCB
CALL LB011 ; DO UZIVATELSKEHO FCB A NAOPAK
EX DE,HL
CALL LB011
;
; POROVNANI # BLOKU V UZIV. PCB A DLR-FCB
;
EX DE, HL ; POROVNANI DOLNIHO BYTE
LD A,(DE)
CP (HL)
JP NZ,LB009 ; NEROVNAJI SE => NAST. NAVR.
; PARAMETRU NA 255 + RET
;
INC DE ; POROVNANI HORNIHO BYTE
INC HL
LD A,(DE)
CP (HL)
JP NZ,LB009 ; NEROVNAJI SE => NAVR. PAR=255 +
; RET
DEC C ; DEC CITACE PRESUNU
LB010: ;
INC DE ; UPRAVA ADRES CISEL BLOKU
INC HL
DEC C ; DEC CITACE OPAKOVANI
JP NZ,LB012 ; OPAKOVANI
;
; POROVNANI "EX" Z UZIV. FCB A DIR-FCB
;
; NASTAVENI ADRES "EX"
LD BC,0FFECH ; -20 DO [BC]
ADD HL,BC ; SOUCET S [HL]
EX DE,HL ; ADRESA UZIV."EX"
ADD HL,BC ; ADRESA DIR."EX" V [HL]
; POROVNANI
LD A,(DE)
CP (HL)
JP C,LB013
;
; PRESUN "EX" A "RC" DO UZIV. FCB
;
;
LD (HL),A ; PRESUN "EX"
LD BC,3 ; PRIPRAVA ADRESY "RC"
ADD HL,BC
EX DE,HL
ADD HL,BC
; PRESUN "RC"
LD A,(HL)
LD (DE),A
LB013: ;
; NASTAVENI SAV NA -1
LD A,0FFH ;
LD (SAV),A
JP LB014 ; ZAPIS SEKTORU ADRESARE + RET
LB009: ; NASTAVENI NAVRATOVEHO PARAMETRU
LD HL,RETPRM ; NA -1 + RET
DEC (HL)
RET
;
;
;
; PROCEDURA VYTVORENI SOUBORU
; ===========================
;
MKFLP: CALL TSTNRO ; TEST NA NOT READ ONLY
LD HL,(FCBSAV) ; ADR. FCB DO [HL]
PUSH HL ; USCHOVA ADRESY FCB
LD HL,FFAT ; ADR. PRIZNAKU VOLNEHO FCB(E5)
LD (FCBSAV),HL ; A JEHO USCHOVA
LD C,1 ; ROZSAH POROVNANI
CALL SFFP ; HLEDANI VOLNEHO FCB
CALL TSTDIE ; TEST NALEZENI - NAST. VLAJEK
POP HL ; OBNOVA ADRESY FCB
LD (FCBSAV),HL ; A PRIPRAVA JEJIHO ZPRACOVANI
RET Z ; RET KDYZ JE ADRESAR PLNY
;
;
;
EX DE,HL ; ADRESA FCB DO [DE]
LD HL,0FH ; OFFSET NA S2 DO [HL]
ADD HL,DE ; ADRESA S2 DO [HL]
LD C,11H ; PARAMETR CYKLU DO [C]
XOR A ; NULA DO [A]
LB100: LD (HL),A ; NULOVANI ALOKACNIHO VEKTORU
INC HL ; V FCB
DEC C
JP NZ,LB100
LD HL,000DH ; OFFSET NA "EX"
ADD HL,DE ; ADRESA "EX" DO [HL]
LD (HL),A ; NULOVANI HEXH
CALL TSTMDI ; TEST NA MAX. # VSTUPU ADRESARE
CALL LB020 ; PRESUN FCB DO ADRESARE DICKU
JP ST7S2 ; NASTAVENI 7 BITU C2 + RET
;
;
; OBSLUHA CTENI A ZAPICU SOUBORU
; ==============================
;
;
FLHAN: XOR A ; NULOVANI RIDICIHO BYTE S2
LD (THSE),A ;
CALL CLFP ; PRESUN FCB DO ADRESARE
CALL TSTDIE ; JE PRESUN KOREKTNI?
RET Z ; NE, CHYBOVY NAVRAT
;
;
;
LD HL,(FCBSAV) ; ADRESA FCB DO [HL]
LD BC,0CH ; OFFSET NA "EX" DO [BC]
ADD HL,BC ; VYPOCET ADRESY "EX"
LD A,(HL) ; "EX" DO [A]
INC A ; PRIPRAVA HODNOTY NASLEDUJI-
AND 1FH ; CIHO "EX"
LD (HL),A ; A JEJI ULOZENI
JP Z,LB102 ; CKOK KDYZ [EX] .GT. 32
LD B,A ; "EX" DO [B]
LD A,(CUEXM) ; TEST POCTU EXTENTU
AND B ;
LD HL,THSE ; ADRESA RIDICIHO BYTE C2(FCB)
AND (HL) ;
JP Z,LB103 ;
JP LB104 ;
;
; ZVYSENI INDIKACE POCTU EXTENTU V S2
;
LB102: LD BC,2 ; ADRESA S2 DO [HL]
ADD HL,BC ;
INC (HL) ; S2=S2+1
LD A,(HL) ; ULOZENI S2
AND 0FH ; TEST POCTU EVID. EXTENTU
JP Z,LB106 ; POCET PREKROCEN
;
;
;
LB103: LD C,0FH ; ROZSAH POROVNANI DO [C]
CALL SFFP ; HLEDEJ VYCKYT V ADRESARI
CALL TSTDIE ; TEST NALEZENI
JP NZ,LB104 ; NENALEZEN DALCI EXTENT
LD A,(FRSE) ; INDIKACE CLUZBY DO [A]
INC A ; TEST PROVADENE CLUZBY
JP Z,LB106 ; READ
CALL MKFLP ; WRITE-VYTVORENI NOVEHO EXTENTU
CALL TSTDIE ; TEST VYTVORENI
JP Z,LB106 ; NE, CHYBA + RET
JP LB105 ; O.K.
;
;
;
LB104: CALL OPFP1 ; PRIPRAVA FCB DALSIHO EXTENTU
LB105: CALL LDD9RC ; NASTAVENI"D9"(CR) A "RC" Z FCB
XOR A ; NULA DO NAVR. PARAHETRU
JP SVSING ; + RET
LB106: CALL SREPRM ; 1 DO NAVR. PARAMETRU => CHYBA
JP ST7S2 ; NASTAVENI 7 BITU V S2 + RET
;
;
; PRIPRAVA CTENI A CTENI
;
RPR: LD A,01H ; NASTAVENI ATRIBUTU
LD (SECSE),A ; SEKVENCNIHO CTENI
LB107: LD A,0FFH ;
LD (FRSE),A
CALL LDD9RC ; PRIPRAVA "D9" A "RC" Z FCB
LD A,(D9) ; "D9" DO [A]
LD HL,RC ; ADR. "RC" DO [HL]
CP (HL) ; POROVNANI "D9" A "RC"
JP C,LB108 ; RC .GE. D9=> O.K. CTENI
CP 80H ; D9 .GT. RC, JE .EQ. 128 ?
JP NZ,LB109 ; D9 .NE. 128 =>IND. CHYBY + RET
;
;
;
CALL FLHAN ; PRIPRAVA DALSIHO EXTENTU
XOR A ; NULOVANI "D9" (AKTUALNIHO
LD (D9),A ; CITACE ZAZNAMU)
LD A,(RETPRM) ; TEST NAVRATOVEHO PARAHETRU
OR A ;
JP NZ,LB109 ; IND. CHYBY + RET
;
;
;
LB108: CALL GETBLK ; ZJISTENI # BLOKU
CALL TSTBLK ; TEST # BLOKU NA NULU
JP Z,LB109 ; KONEC CTENI
CALL GETSEC ; ZJISTENI CISLA SEKTORU
CALL DSKCA1 ; VYPOCET A NASTAVENI # STOPY
; A # SEKTORU
CALL READ ; CTENI SEKTORU
JP SVD9RC ; ULOZENI "D9" A "RC"
LB109: JP SREPRM ; NASTAVENI NAVR. PARAM. + RET
;
;
; PRIPRAVA ZAPISU A ZAPIS
;
WPR: LD A,01H ; NASTAVENI ATRIBUTU SEKV.
LD (SECSE),A ; ZAPISU
WPR1: LD A,00H ;
LB110: LD (FRSE),A
CALL TSTNRO ; TEST NA R/O DISKU
LD HL,(FCBSAV) ; ADRESA FCB DO [HL]
CALL TST1 ; TEST NA R/O SOUBORU
CALL LDD9RC ; PRIPRAVA "D9" A "RC
LD A,(D9) ; "D9" DO [A]
CP 80H ; TEST "D9"
JP NC,SREPRM ; INDIKACE CHYBY + RET
CALL GETBLK ; ZJISTENI# BLOKU
CALL TSTBLK ; TEST # BLOKU NA NULU
LD C,00H ; NAST. INDIKACE SLUZBY
JP NZ,LB115 ; SKOK KDYZ # BLOKU .NE. 0
CALL BSHIFT ; VYPOCET ULOZENI # BLOKU V FCB
LD (ESAV+1),A ; JEHO ULOZENI
LD BC,0 ; PRIPRAVA REL. ADR. ULOZENI
OR A ; # ALOKOVANEHO BLOKU V FCB
JP Z,LB111 ;
LD C,A ; # BLOKU DO [C]
DEC BC ;
CALL RETBLK ; VYHLEDANI PREDCH. AL. BLOKU
LD B,H ; JEHO PRESUN DO [BC]
LD C,L ;
LB111: CALL COBLLO ; PRIPRAVA ALOKACE BLOKU
LD A,L ; TEST VYSLEDKU
OR H
JP NZ,LB112 ; O.K.
LD A,02 ; NENALEZEN DALSI VOLNY BLOK
JP SVSING ; IND. CHYBY + RET
;
;
;
LB112: LD (BLOCK),HL ; ULOZENI # BLOKU K ZAPISU
EX DE,HL ; # BLOKU DO [DE]
LD HL,(FCBSAV) ; ADR. FCB DO [HL]
LD BC,0010H ; OFFSET NA D0
ADD HL,BC ; ADRESA D0 V FCB
LD A,(DSKSFL) ; DISKSIZE FLAS DO [A]
OR A ; TESt VELIKOSTI DISKU
LD A,(ESAV+1) ; # BLOKU DO [A]
JP Z,LB113 ; SKOK PRI ZAPISU NAD 256 BLOKU
CALL DIRAD1 ; GENEROVANI ADRESY ULOZ. ADRESARE
LD (HL),E ; ULOZENI # BLOKU DO ALOK. VEKTORU
JP LB114 ;
;
; PRI ZAPISU NAD 256 BLOKU
;
LB113: LD C,A ; OFFSET ULOZENI D0 DO [C]
LD B,0 ; ; NULA DO [B]
ADD HL,BC ; ADRESA NA MISTO ULOZENI # BLOKU
ADD HL,BC ; ; V FCB
LD (HL),E ; PRESUN 1 BLOKU
INC HL
LD (HL),D
LB114: LD C,02H ; NAST. INDIKACE VELIKOSTI DISKU
LB115: LD A,(RETPRM) ; TEST NAVRATOVEHO PARAMETRU
OR A ;
RET NZ ; RET KDYZ RETPRM .NE. 0
;
;
;
;
PUSH BC ; USCHOVA INDIKACE SLUZBY
CALL GETSEC ; ZJISTENI # SEKTORU
LD A,(SECSE) ; ATRIBUT PROVADENE SLUZBY DO [A]
DEC A ; TEST SLUZBY
DEC A
JP NZ,LB118 ; SKOK KYZ SLUZBA .NE.40
POP BC ; OBNOVA [BC]
PUSH BC ;
LD A,C ; TEST PREDCH. VYKONAVANI PROCEDURY
DEC A
DEC A
JP NZ,LB118 ; SKOK KDYZ CMD .NE. 40
;
;
;
PUSH HL ; USCH.ADR.ULOZENI DALSIHO # BLOKU
LD HL,(DIRBUP) ; ADR. BUFFERU ADRESARE DO [HL]
LD D,A ; NULA DO [D]
LB116: LD (HL),A ; NULOVANI BUFFERU ADRESARE
INC HL
INC D
JP P,LB116
CALL DMA120 ; NAST DMA NA ADRESU BUFFERU
LD HL,(SECTOR) ; # SECTORU DO [HLJ
LD C,02H ; 02 DO [C] - IND. PRUCHODU
LB117: LD (BLOCK),HL ; USCHOVA # SEKTORU
PUSH BC ; USCHOVA [BC]
CALL DSKCA1 ; VYPOCET A NASTAVENI # SECTORU
; A # STOPY
POP BC ; OBNOVA [BC]
CALL WRITE ; ZAPIS VYBRANEHO SECTORU NULAMI
LD HL,(BLOCK) ; # SECTORU DO [HL]
LD C,0 ; NULA DO [C]
LD A,(CUBLM) ; BLOCK MASK DO [A]
LD B,A ; BLOCK MASK DO [B]
AND L ; .AND. [A] S # SECTORU
CP B ; POROVNANI VYSLEDKU S BLOK-MASKOU
INC HL ; INICIALIZACE ADRESY
JP NZ,LB117 ; ZAPIS DALSIHO SECTORU NULAMI
POP HL ; OBNOVA [HL] - # SEKTORU
LD (BLOCK),HL ; ULOZENI # SEKTORU
CALL DMA110 ; PRIPRAVA DMA ADRESY
;
;
;
LB118: CALL DSKCA1 ; VYPOCET A NASTAVENI # STOPY
; A # SEKTORU
POP BC ; AKTUALIZACE [BC]
PUSH BC
CALL WRITE ; ZAPIS VYBRANEHO SEKTORU
POP BC
LD A,(D9) ; "D9" DO [A]
LD HL,RC ; ADR. "RC" DO [HL]
CP (HL) ; POROVNANI "D9","RC"
JP C,LB119 ; "RC" > "D9"
LD (HL),A ; SAVE "RC"
INC (HL) ; RC = RC + 1
LD C,02H ; 2 DO [C]
LB119: DEC C ; TEST PROVADENE SLUZBY
DEC C
JP NZ,LB120 ; SKOK KDYZ CMD .NE. 40
PUSH AF
CALL LDS2 ; PRIPRAVA S2 Z FCB
AND 7FH ; EXTRAKCE 7 BITU
LD (HL),A ; USCHOVA S2
POP AF
LB120: CP 7FH ; POROVNANI"RC"(D9)
JP NZ,LB122 ; O.K.
LD A,(SECSE) ; TEST PROVADENE SLUZBY
CP 01
JP NZ,LB122 ; SKOK PRI NESEKVENCNIM ZAPISU
CALL SVD9RC ; PRESUN "D9" A "RC"
CALL FLHAN ; OBSLUHA ZAPISU SOUBORU
LD HL,RETPRM
LD A,(HL) ; NAVR. PAR. DO [A]
OR A ; JEHO TEST NA NULU
JP NZ,LB121 ; SKOK KDYZ .NE. NULE
DEC A ; INICIALIZACE "D9"
LD (D9),A ;
LB121: LD (HL),0 ; NULOVANI NAVR. PARAMETRU
LB122: JP SVD9RC ; PRESUN "D9 A" "RC" DO FCB + RET
;
;
; PROCEDURA PRIMEHO CTENI A ZAPISU DO SOUBORU
; ===========================================
;
;
RAWR: XOR A ; NASTAVENI INDIKACE SLUZBY
LD (SECSE),A ;
;
;
; PROCEDURA ZAPISU ALOK. BLOKU NULAMI A ZAPISU ZAZNAMU
;
;
RAWRZ: PUSH BC ; USCHOVA INDIKACE CTENI NEBO
; ZAPISU
LD HL,(FCBSAV) ; ADR.FCB DO [HL]
EX DE,HL ; DO [DE]
LD HL,0021H ; OFFSET NA NEJNIZSI BYTE # ZAZNAMU
ADD HL,DE ; ADRESA NA FCB+33
LD A,(HL) ; [FCB+33] DO [A]
AND 7FH ; VYPOCET POCTU ZAZNAMU V RAMCI
PUSH AF ; POSLEDNIHO EXTENTU + USCHOVA
LD A,(HL) ; [FCB+33] DO [A]
RLA ; ROTACE DOLEVA
INC HL ; ADRESA FCB+34
LD A,(HL) ; [FCB+34] DO [A]
RLA ; VYPOCET [EX]
AND 1FH ; EXT.BITU 5,6,7
LD C,A ; PRESUN [EX] TO [C]
LD A,(HL) ; [FCB+34] DO [A]
RRA ; [A] / 16
RRA
RRA
RRA
AND 0FH ; EXT.BITU 4,5,6,7
LD B,A ; PRESUN [S2] TO [B]
POP AF ; POCET ZAZNAMU V RAMCI POSLEDNIHO
; "EX" DO [A]
INC HL ; ADRESA FCB+35
LD L,(HL) ; [FCB+35] DO [L]
INC L ; TEST NA [FCB+35]
DEC L ; .EQ. 0
LD L,06H ; PRIPRAVA # CHYBY
JP NZ,LB204 ; CHYBA KDYZ [FCB+35] .NE. NULA
LD HL,20H ; OFFSET NA "D9" DO [HL]
ADD HL,DE ; ADRESA "D9"(AKT. CITAC ZAZNAMU)
LD (HL),A ; [A] DO "D9"
LD HL,000CH ; OFFSET NA "EX" DO [HL]
ADD HL,DE ; ADRESA "EX"
LD A,C ; VYPOCITANY "EX" DO [A]
SUB (HL) ; "EX"- "EX" Z FCB
JP NZ,LB205 ; SKOK KDYZ "EX" NOT.EQ."EX" Z FCB
LD HL,0EH ; OFFSET NA S2 Z FCB
ADD HL,DE ; ADRESA S2 V [HL]
LD A,B ; VYPOCITANE S2 DO [A]
SUB (HL) ; S2 - S2 Z FCB
AND 7FH ; EXT. BITU 7
JP Z,LB206 ; SKOK KDYZ S2 .EQ. S2 Z FCB
;
;
;
LB205: PUSH BC
PUSH DE
CALL CLFP ; ZAPIS FCB DO ADRESARE(TEST NA R/O)
POP DE
POP BC
LD L,03H ; PRIPRAVA KODU CHYBY
LD A,(RETPRM) ; NAVR. PARAMETR DO [A]
INC A ; TEST [RETPRM] .EQ. -1
JP Z,LB207 ; SKOK KDYZ READ ONLY
LD HL,0CH ; OFFSET NA "EX" Z FCB
ADD HL,DE ; ADRESA "EX"
LD (HL),C ; VYPOCITANY "EX" DO FCB
LD HL,0EH ; OFFSET NA S2 Z FCB
ADD HL,DE ; ADRESA S2 DO [HL]
LD (HL),B ; VYPOCITANA S2 DO FCB
CALL OPFP ; VYHLEDANI ODPOVIDAJICIHO FCB
LD A,(RETPRM) ; NAVR. PARAMETR DO [A]
INC A ; TEST [RETPRM] .EQ. -1
JP NZ,LB206 ; SKOK KDYZ SE ODPOVIDAJICI FCB
; NENASLO
POP BC ; OBNOVA [C] (0 NEBO FFH)
PUSH BC
LD L,04H ; PRIPRAVA CHYBOVEHO RODU
INC C ; TEST PROVADENE SLUZBY
JP Z,LB207 ; SKOK KDYZ SLUZBA 33
CALL MKFLP ; VYTVORENI DALSIHO EXTENTU
LD L,05H ; PRIPRAVA CHYBOVEHO KODU
LD A,(RETPRM) ; NAVR. PARAMETR DO [A]
INC A ; TEST [RETPRM] .EQ. -1
JP Z,LB207 ; SKOK KDYZ JE PLNY ADRESAR
;
;
;
LB206: POP BC ; OBNOVA [C] (0 NEBO FFH)
XOR A ; TEST
JP SVSING ; NULOVANI NAVR. PAR. + RET
;
;
;
LB207: PUSH HL ; USCHOVA # CHYBY
CALL LDS2 ; PRIPRAVA S2 Z FCB
LD (HL),0C0H ; C0H DO CS23
POP HL ; OBNOVA # CHYBY
LB204: POP BC ; OBNOVA [C]
LD A,L ; # CHYBY DO [A]
LD (RETPRM),A ; PRESUN # DO (RETPRM)
JP ST7S2 ; NAST 7 BITU S2 + RET
;
;
; PROCEDURA PRIMEHO CTENI ZE SOUBORU
; ==================================
;
RRP: LD C,0FFH ; INDIKACE PRIHEHO CTENI DO [C]
CALL RAWR ; PRIPRAVA PRIHEHO CTENI
CALL Z,LB107 ; KDYZ O.K. => SEKV. CTENI
RET ;
;
;
; PROCEDURA PRIMEHO ZAPISU
; ========================
;
WRP: LD C,00H ; INDIKACE PRIMEHO ZAPISU DO [C]
CALL RAWR ; PRIPRAVA PRIMEHO ZAPISU
CALL Z,LB110 ; KDYZ O.K. SEKV. ZAPIS
RET ;
;
;
; PROCEDURA NASTAVENI CISLA ZAZNAMU
; =================================
;
;
OCFS: EX DE,HL ; OFFSET "D9" DO [HL]
ADD HL,DE ; ADR."D9" Z FCB
LD C,(HL) ; "D9" DO [C]
LD B,00H ; NULA DO [B]
LD HL,0CH ; OFFSET NA "EX" Z FCB
ADD HL,DE ; ADRESA "EX" Z FCB V [HL]
LD A,(HL) ; VYPOCET NEJNIZSIHO BYTE DELKY
RRCA ;
AND 80H ;
ADD A,C ;
LD C,A ; PRESUN VYSLEDKU DO [C]
LD A,0 ; NULA DO [A]
ADC A,B ; PRIPADNE PRETECENI DO [A]
LD B,A ; DO [B]
LD A,(HL) ; [EX] DO CFL]
RRCA ;
AND 0FH ; ZBYLY POCET EX V [A]
ADD A,B ; SOUCET S PRETEC.V PREDCH. OPERACI
LD B,A ; VYSLEDEK DO [B]
LD HL,000EH ; LOAD OFFSET FOR S2 IN FCB
ADD HL,DE ; ADRESA NA S2
LD A,(HL) ; [S2] TO [A]
ADD A,A ; [S2] * 16
ADD A,A
ADD A,A
ADD A,A
PUSH AF ; USCHOVA VYSLEDKU
ADD A,B ; DOPOCITANI DALSIHO BYTE VYSLEDKU
LD B,A ;
PUSH AF ; A NASTAVENI PRIPAD. PRETECENI
POP HL ; DO [A]
LD A,L
POP HL
OR L ;
AND 01 ;
RET
;
;
; PROCEDURA VYPOCTU DELKY SOUBORU
; ===============================
;
CFSP: LD C,0CH ; ROZSAH POROVNANI DO [C]
CALL SFFP ; HLEDEJ PRVNI VYSKYT V ADRESARI
LD HL,(FCBSAV) ; ADRESA FCB DO [HL]
LD DE,21H ; OFFSET NA FCB+33
ADD HL,DE ; ADRESA FCB+33
PUSH HL ; USCH. ADRESY FCB+33
LD (HL),D ; NULOVANI [FCB+33]
INC HL ;
LD (HL),D ; NULOVANI [FCB+34]
INC HL ;
LD (HL),D ; NULOVANI [FCB+35]
;
;
;
LB212: CALL TSTDIE ; TEST NALEZENI SOUBORU
JP Z,LB209 ; NENALEZEN
CALL DIRADR ; GENEROVANI ADRESY ADRESARE
LD DE,0FH ; OFFSET NA "RC" DO [DE]
CALL OCFS ; VYPOCET DELKY SOUBORU
; DANEHO FCB
POP HL ; ADRESA FCB+33 DO [HL]
PUSH HL
LD E,A
LD A,C
SUB (HL) ; TEST CHYBY V NAVAZNOSTI BYTU
; TVORICICH VYPOCTENOU DELKU
; (NBTVD)
INC HL ; ADRESA FCB+34
LD A,B
SBC A,(HL) ; TEST NA NBTVD
INC HL ; ADRESA FCB+35
LD A,E
SBC A,(HL) ; TEST NA NBTVD
JP C,LB211 ; SKOK PRI CHYBE NBTVD
LD (HL),E ; PRESUN [E] DO [FCB+3]
DEC HL ; ADRESA FCB+34
LD (HL),B ; PRESUN [B] DO [FCB+34]
DEC HL ; ADRESA FCB+33
LD (HL),C ; PRESUN [C] DO [FCB+33]
LB211: CALL TL400 ; HLEDANI DALSIHO EXTENTU
JP LB212 ; OPAKOVANI
LB209: POP HL ; ADRESA FCB+33 DO [HL]
RET ;
;
;
; PROCEDURA NASTAVENI CISLA ZAZNAMU
; =================================
;
;
SRRP: LD HL,(FCBSAV) ; ADRESA FCB DO [HL]
LD DE,20H ; OFFSET NA "D?" DO [DE]
CALL OCFS ; VYPOCET DELKY SOUBORU
LD HL,0021H ; ULOZENI VYSLEDKU NA ADRESACH:
ADD HL,DE ;
LD (HL),C ; FCB + 33
INC HL ;
LD (HL),B ; FCB + 34
INC HL ;
LD (HL),A ; FCB + 35
RET ;
;
;
;
; OSETRENI VEKTORU AKTIVNICH DISKU
; ================================
;
LGV120: LD HL,(LOGVEC) ; VEKTOR AKT. DISKU DO [HL]
LD A,(DSKNO) ; CISLO DISKU DO [A]
LD C,A ; A DO [C]
CALL RSHHL ; SHIFT VEKTORU V [HL] [C] KRAT
PUSH HL ; USCHOVA [HL]
EX DE,HL
CALL SD110 ; VYBER DISKU
POP HL ; OBNOVA [HL]
CALL Z,VJUMP ; PRI CHYBE - SKOK
LD A,L ; SHIFT. VEKTOR DO [A]-LOW BYTE
RRA ; JE JIZ DISK AKTIVNI ? - TEST
RET C ; ANO, RET
LD HL,(LOGVEC) ; VEKTOR AKT. DISKU DO [HL]
LD C,L ; A DO [BC]
LD B,H
CALL SETVEC ; NASTAV BIT DISKU VE VEKTORU
LD (LOGVEC),HL ; ULOZENI VEKTORU AKT.DISKU
JP CLRALV ; NULOVANI ALOKACNIHO VEKTORU
;
;
; VYBER DISK CMD 14
; ============
;
SELDSK: LD A,(ESAV) ; CISLO DISKU DO [A]
LD HL,DSKNO ; ADR. ULOZENI # DISKU DO [HL]
CP (HL) ; POROVNANI CLSEL DISKU
RET Z ; RET KDYZ SE ROVNAJI
LD (HL),A ; NAST. NOVEHO # DISKU
JP LGV120 ; UPRAVA VEKTORU AKT. DISKU
;
;
; OSETRENI # JEDNOTKY(DISKU) A # UZIVATELE
;
UU110: LD A,0FFH ; 0FFH DO [A]
LD (DSKFLG),A ; NASTAVENI DISK FLASU
LD HL,(FCBSAV) ; ADR. FCB DO [HL]
LD A,(HL) ; # JEDNOTKY DO [A]
AND 1FH ; EXT. BITU 5,6,7
DEC A ; DEC # JEDNOTKY
LD (ESAV),A ; ULOZENI # JEDNOTKY
CP 1EH ; BYLA JEDNOTKA VYBRANA?
; JE STANDARTNI?
JP NC,UU120 ; ANO
LD A,(DSKNO) ; JINAK 1 DISKU DO
LD (UNITSV),A ; # VYBRANEHO DISKU
;
LD A,(HL) ; # JEDNOTKY DO [A]
LD (UNITNO),A ; JEJI ULOZENI
AND 11100000B ; EXT. BITU 4-0
LD (HL),A ; ZPETNE NASTAVENI
CALL SELDSK ; VYBER DISKU(JEDNOTKY)
UU120: LD A,(USRNO) ; # UZIVATELE DO [A]
LD HL,(FCBSAV) ; ADR. FCB DO [HL]
OR (HL) ; .OR. # JEDN. A # UZIV.
LD (HL),A ; ULOZENI VYSLEDKU DO FCB
RET
;
;
; ZJISTI CISLO VERZE CMD 12
; ==================
;
RETVER: LD A,22H ; NASTAV VERZI 2.2
JP SVSING ; NASTAVENI NAVR. PARAN.+ RET
;
;
; RESET DISKOVEHO SYSTEHU CMD 13
; =======================
;
RESDSY: LD HL,0 ; NULY DO [HL]
LD (ROVEC),HL ; NULOVANI R/O VEKTORU
LD (LOGVEC),HL ; NULOVANI VEKTORU AKT. DISKU
XOR A ; NULA DO [A]
LD (DSKNO),A ; NASTAVENI CISLA DISKU NA NULU
LD HL,DMAAD ; DMA ADRESY NA 80H
LD (DMAADR),HL ;
CALL DMA110 ; NASTAVENI DMA ADR
JP LGV120 ; OSETRENI VEKTORU AKT. DISKU
;
;
; OTEVRI SOUBOR CMD 15
; =============
;
OPFIL: CALL CLRS2 ; NULOVANI S2 V FCB
CALL UU110 ; OSETRENI # DISKU A # UZIV.
JP OPFP ; PROCEDURA OTEVRENI SOUBORU
;
;
; UZAVRI SOUBOR CMD 16
; =============
;
CLFIL: CALL UU110 ; OSETRENI # DISKU A # UZIV.
JP CLFP ; PROCEDURA UZAVRENI SOUBORU
;
;
; HLEDEJ PRVNI ODPOVIDAJICI CMD 17
; POLOZKU V ADRESARI
; ==================
;
SFFRST: LD C,0 ; NULA DO [C]
EX DE,HL ; ADR. FCB DO [HL]
LD A,(HL) ; # DISKU DO [A]
CP '?' ; TEST NA '?'
JP Z,SF120 ; SKOK KDYZ # DISKU = '?'
CALL EXADD ; ADRESA "EX" DO [HL]
LD A,(HL) ; "EX" DO [A]
CP '?' ; TEST NA '?'
CALL NZ,CLRS2 ; NULOVANI S2 KDYZ "EX" NOT '?'
CALL UU110 ; OSETRENI # DISKU A # UZIV.
LD C,0FH ; ROZSAH SHODY PRI PROHLEDAVANI
; ADRESARE DO [C]
SF120: CALL SFFP ; HLEDANI SHODY V POLOZKACH
; ADRESARE
JP MOVDIR ; PRESUN ADRESARE + RET
;
;
; HLEDEJ NASLEDUJICI ODPOVIDAJICI CMD 18
; ODPOVIDAJICI POLOZKU V ADRESARI
; ===============================
;
;
SFNEXT: LD HL,(FCBP) ; ADR. FCB DO [HL]
LD (FCBSAV),HL ; AKTUALIZACE ULOZENI ADR.FCB
CALL UU110 ; OSETRENI # DISKU A # UZIV.
CALL TL400 ; HLEDEJ DALSI VYSKYT V ARESARI
JP MOVDIR ; PRESUN ADRESARE + RET
;
;
; ZRUS SOUBOR CMD 19
; ===========
;
DELFIL: CALL UU110 ; OSETRENI # DISKU A # UZIV.
CALL DELFP ; PROCEDURA ZRUSENI SOUBORU
JP TL300 ; PRIPRAVA NAVR. PAR.+ RET
;
;
; SEKVENCNI CTENI CMD 20
; ===============
;
RDSEQ: CALL UU110 ; OSETRENI # DISKU A # UZIV.
JP RPR ; PRIPRAVA CTENI A CTENI
; ; + RET
;
; SEKVENCNI ZAPIS CMD 21
; ===============
;
WRTSEQ: CALL UU110 ; OSETRENU # DISKU A # UZIV.
JP WPR ; PRIPRAVA ZAPISU A ZAPIS
;
;
; ZALOZ SOUBOR CMD 22
; ============
;
MAKFIL: CALL CLRS2 ; NULOVANI S2 V FCB
CALL UU110 ; OSETRENI # DISKU # UZIVATELE
JP MKFLP ; PROCEDURA VYTVORENI SOUBORU
;
;
; PREJMENUJ SOUBOR CMD 23
; ================
;
RENFIL: CALL UU110 ; OSETRENI # DISKU A # UZIV.
CALL RENFP ; PROCED. PREJMENOVANI SOUBORU
JP TL300 ; PRIPRAVA NAVRATOVEHO PARAMET.
; ; PROCEDURY + RET
;
; VRAT VEKTOR AKTIVNICH DISKU CMD 24
; ===========================
;
RETLOG: LD HL,(LOGVEC) ; SEKTOR AKT. DISKU DO [HL]
JP SVPAIR ; NAST. NAVR. PAR. + RET
;
;
; VRAT CISLO VYBRANEHO DISKU CMD 25
; ==========================
;
RETCDK: LD A,(DSKNO) ; CISLO DISKU DO [A]
JP SVSING ; NAST. NAVR. PARAM. + RET
;
;
; NASTAV DMA ADRESU CMD 26
; =================
;
SETDMA: EX DE,HL ; DMA ADRESA DO [HL]
LD (DMAADR),HL ; ULOZENI DMA ADRESY
JP DMA110 ; NASTAVENI DMA ADRESY +RET
;
;
; NASTAV CISLO ZAZNAMU CMD 36
; PRO PRIMY ZAPIS
; ====================
;
;
SRNDRC: JP SRRP ; PROCEDURA NASTAVENI CISLA
; ; ZAZNAMU
;
; DEJ ADRESU ALOKACNIHO VEKTORU CMD 27
; =============================
;
GETALC: LD HL,(ALVP) ; ALOKACNY VEKTOR DO [HL]
JP SVPAIR ; NAST. NAVR. PARAM.+ RET
;
;
;
;
; DEJ ADRESU R/O VEKTORU CMD 28
; ======================
;
GETROV: LD HL,(ROVEC) ; READ ONLY VEKTOR DO [HL]
JP SVPAIR ; NAST. NAVR. PARAM.+ RET
;
;
; NASTAV ATRIBUTY SOUBORU CMD 30
; =======================
;
SETFAT: CALL UU110 ; OSETRENI # DISKU A # UZIV.
CALL SETFAP ; PROCEDURA NASTAVENI ATRIBUTU
JP TL300 ; NAST. NAVR. PARAM. + RET
;
;
; DEJ ADRESU BLOKU DISKOVYCH CMD 31
; PARAMETRU
; ==========================
;
GETDPA: LD HL,(DPBP) ; ADRESA BLOKU DO [HL]
SVPAIR: LD (RETPRM),HL ; JEJI PRESUN DO NAVR. PARAM.
RET
;
;
; POSKYTNI/ZMEN KOD UZIVATELE CMD 32
; ===========================
;
SGUCD: LD A,(ESAV) ; # UZIVATELE DO [A]
CP 0FFH ; TEST POZADAVKU
JP NZ,SGU120 ; SKOK NA NASTAVENI # UZIVATELE
LD A,(USRNO) ; # UZIVATELE DO [A]
JP SVSING ; NAST. NAVR. PARAM. + RET
SGU120: AND 1FH ; EXT. BITU 5,6,7
LD (USRNO),A ; PRESUN # UZIVATELE
RET ;
;
;
; PRIME CTENI ZE SOUBORU CMD 33
; ======================
;
RDRND: CALL UU110 ; OSETRENI # DISKU A # UZIV.
JP RRP ; PROCEDURA PRIMEHO CTENI
;
;
; PRIMY ZAPIS DO SOUBORU CMD 34
; ======================
;
WRTRND: CALL UU110 ; OSETRENI # DISKU A # UZIV.
JP WRP ; PROCEDURA PRIMEHO ZAPISU
;
;
; VYPOCITEJ DELKU SOUBORU CMD 35
; =======================
;
CFSIZE: CALL UU110 ; OSETRENI # DISKU A # UZIV.
JP CFSP ; PROCEDURA VYPOCTU DELKY
;
;
;
; RESET DISKOVE JEDNOTKY CMD 37
; ======================
;
RESDSK: LD HL,(FCBSAV) ; VEKTOR DISK.JEDNOTEK
; (PARAMETR VOLANI) DO [HL]
LD A,L ;
CPL ; KOMPLEMENT LOW BYTU VEKTORU
LD E,A ; A JEHO PRESUN DO [E]
LD A,H ;
CPL ; KOHPLEHENT HIGH BYTU VEKTORU
LD HL,(LOGVEC) ; INICIALIZACE VEKT.AKT. DISKU
AND H ; HIGH BYTU
LD D,A ; KOMPLEMENT HIGH BYTU DO [D]
LD A,L ; PRIPRAVA LOH BYTU VEK.AKT.DISKU
AND E ;
LD E,A ; PRESUN LOW BYTU DO [E]
LD HL,(ROVEC) ; VEKTOR R/O DO [HL]
EX DE,HL ; DO [DE]
LD (LOGVEC),HL ; ULOZENI VEKTORU AKT. DISKU
LD A,L ; INICIALIZACE VEKTORU R/O
AND E ;
LD L,A ;
LD A,H ;
AND D ;
LD H,A ;
LD (ROVEC),HL ; ULOZENI R/O VEKTORU
RET ;
;
;
;
; NAVRAT Z BDOS
; =============
;
;
RTBDOS: LD A,(DSKFLG) ; DISK-FLAG DO [A]
OR A ; JEHO TEST
JP Z,RSTSP ; SKOK PRI NEDISKOVE SLUZBE
LD HL,(FCBSAV) ; ADRESA FCB DO [HL]
LD (HL),0 ; NULOVANI # JEDNOTKY V FCB
LD A,(UNITNO) ; # JEDNOTKY DO [A]
OR A ; JEJI TEST NA NULU
JP Z,RSTSP ; BEZNY DISK
LD (HL),A ; NASTAVENI # JEDNOTKY V FCB
LD A,(UNITSV) ; # JEDNOTKY DO [A]
LD (ESAV),A ; USCHOVA # VYBRANEHO DISKU
CALL SELDSK ; VYBER DISKU
;
RSTSP: LD HL,(SPSAV) ; ADRESA UZIV.ZASOBNIKU DO [HL]
LD SP,HL ; A JEHO INICIALIZACE
LD HL,(RETPRM) ; NAVRATOVY PARAMETR DO [HL]
LD A,L ; DO [A]
LD B,H ; DO [B]
RET ; RET DO MISTA VOLANI BDOS
;
;
; POPIS ALOKACNI BLOK NULAMI CMD 40
; A POTOM DO NEJ VLOZ ZAZNAM
; ==========================
;
WRRDZF: CALL UU110 ; OSETRENI # DISKU A # UZIV.
LD A,02
LD (SECSE),A ; NASTAVENI INDIKACE PROV.SLUZBY
LD C,0 ; INDIKACE PRUCHODU
CALL RAWRZ ; PRIPRAVA ZAPISU
CALL Z,WPR1 ; KDYZ O.K. ZAPIS
RET ;
;
;
;
; POLE PRACOVNICH PROMENNYCH
; ==========================
;
FFAT: DEFB 0E5H ; ATRIBUT VOLNEHO FCB
ROVEC: DEFW 0 ; READ ONLY VEKTOR
LOGVEC: DEFW 0 ; VEKTOR AKTIVNICH DISKU
DMAADR: DEFW 0 ; DMA ADRESA
MAXDIE: ; MAX # VSTUPU ADRESARE
DPSC1: DEFW 0 ; ADRESA PRAC.POLE 1 V DPBASE
; DPBASE=>BAZE ULOZENI PAR.DISKU
TRACK: ; # STOPY
DPSC2: DEFW 0 ; ADRESA PRAC.POLE 2 V DPBASE
MAXSOT: ; MAX POCET SEKTORU NA STOPE
DPSC3: DEFW 0 ; ADRESA PRAC.POLE 3 V DPBASE
DIRBUP: DEFW 0 ; ADRESA BUFFERU ADRESARE
DPBP: DEFW 0 ; ADRESA BLOKU DISK. PARAMETRU
CSVP: DEFW 0 ; ADRESA PRAC.POLE POUZITEHO
; PRI ZMENE DISKU
ALVP: DEFW 0 ; ADRESA ULOZENI ALOKACNI MAPY
; DISKU
;
CUDPB: ; BLOK PARAMETRU VYBRANEHO DISKU
CUSPT: DEFW 0 ; POCET SEKTORU NA STOPE
CUBSH: DEFB 0 ; BLOCK SHIFT FAKTOR
CUBLM: DEFB 0 ; BLOCK MASKA(DELKA BLOKU)
CUEXM: DEFB 0 ; MASKA ROZSIRENI BLOKU
CUDSM: DEFW 0 ; VELIKOST DISKU-1(# BLOKU)
CUDRM: DEFW 0 ; MAX. VELIKOST ADRESARE
CUAL: DEFW 0 ; # BLOKU PRIRAZENE ADRESARI
CUCKS: DEFW 0 ; POCET SEKTORU ZNICHZ SE PO-
; CITA KONTROLNI SOUCET
CUOFF: DEFW 0 ; POCET STOP OBSAZENYCH OS
;
STRNP: DEFW 0 ; ADRESA PREKLADOVE TABULKY
THSE: DEFB 0 ; S2(FCB) RIDICI BYTE
FRSE: DEFB 0 ; INDIKACE SLUZBY:
; READ SEQ. => FFH
; WRITE SEQ. => 0
RPSAV: DEFB 0 ; NAVRATOVY PARAM. PROCEDURY
SECSE: DEFB 0 ; INDIKACE SLUZBY:
; WRITE RENDOM ZERO FILE = 2
; READ SEQUENTAL = 1
; WRITE SEQUENTAL = 1
; READ RANDOM = 0
; WRITE RANDOM = 0
ESAV: DEFB 0 ; ULOZENI E-REG
DEFB 0 ; ULOZENI # BLOKU
SRGSAV: DEFB 0 ; ULOZENI ROZSAHU POROVNAVANI
FCBP: DEFW 0 ; ADRESA FCB
DEFW 0
DSKSFL: DEFB 1 ; DISKSIZE FLAG<0 KDYZ M > 256)
; 0 KDYZ VELIKOST DISKU > 256
; 1 KDYZ VELIKOST DISKU <= 256
DSKFLG: DEFB 0 ; DISK FLAG
UNITSV: DEFB 0 ; ULOZENI # JEDNOTKY
UNITNO: DEFB 0 ; # JEDNOTKY
RC: DEFB 0 ; CITAC ZAZNAMU
MEX: DEFB 0 ; ULOZENI MASKOVANEHO CISLA EX
D9: DEFB 0 ; AKTUALNI CITAC ZAZNAMU
SAV: DEFB 0 ; PRACOVNI BYTE
BLOCK: DEFW 0 ; CISLO BLOKU
SECTOR: DEFW 0 ; CISLO SEKTORU
DIROFF: DEFB 0 ; OFFSET VSTUPU ADRESARE
; ( 0,32,64,96 )
DETYNO: DEFW 0 ; AKT. CISLO VSTUPU ADRESARE
DETYSC: DEFW 0 ; AKT. CISLO SEKTORU ADRESARE
DEFW 0
DEFB 0
;
$next: ;prvni volny byte
X EQU ($NEXT - BDOSB)
IF X GT 0E00H
.PRINTX 'BD0S JE DELSI NEZ 0E00H !'
ENDIF
IF1
.PRINTX 'konec prvniho pruchodu'
ENDIF
.DEPHASE
;
END
ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt
SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | klony SM50/40 | PETR | PLAN-80A | IQ151 | TNS | FK-1 | HVĚZDA | SP 830 | PCS 1-QR6000
ZPS | Technické prostředky | Programové vybavení | Dokumentace