ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt


SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | PP01 | PETR | PLAN-80A | IQ151 | TNS


ZPS | Technické prostředky | Programové vybavení | Dokumentace


8 bity / SAPI-1 / Programové vybavení / V5.0 / ASM MIKOS/K


Výpis programu MIKOS/K V5.0


.XLIST
PAGE	64
.LIST
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TITLE FIRMWARE SAPI-1 MIKOS/K V5.0 - KZD
;	6.4.88
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

	ASEG
;
;	*** DEFINOVANI PAMETOVEHO PROSTORU *
;
@R@	EQU	4000H	; ZACATEK
RSTN	EQU	0CFH	; RST1 .. POUZIVA SYSTEM

;-----------------------------------------------

MONIT	EQU	0
ERAM	EQU	0000
EP3	EQU	1800H
TVBEG	EQU	3800H	; TV-RAM
EPROM	EQU	0C00H

;
;	* MONITOR ENTRY *
;
CI	EQU	103H
RI	EQU	106H
CO	EQU	109H
PO	EQU	10CH
CSTS	EQU	112H
IOCHK	EQU	115H
IOSET	EQU	118H
IODEF	EQU	11EH
SPCL	EQU	121H
CRLF	EQU	124H
EXPR	EQU	127H
ERROR	EQU	12AH
ASHEX	EQU	12DH
DADR	EQU	130H
DBYT	EQU	133H
HILO	EQU	136H
NEXT	EQU	139H
SPACE	EQU	13CH
CINCR	EQU	13FH
TEXT	EQU	142H
HXASC	EQU	148H
TXIMM	EQU	151H
WND@	EQU	154H
RNAME	EQU	15AH
INTER	EQU	15DH
SERI@	EQU	17BH
SERO@	EQU	17EH
SMST@	EQU	181H
;
; TERMINAL
TLINE	EQU	24
TCOLUM	EQU	80
; ZAZNAM
LENGHT	EQU	255	; DELKA BLOKU
NAMLE	EQU	11	; DELKA JMENA
COMLE	EQU	64	; DELKA KOMENTARE
UVOD	EQU	0FBH	; SYNCHRO BLOKU

;------------------------------------------
; KONSTANTY
ETX	EQU	3
BS	EQU	8
HT	EQU	9
LF	EQU	0AH
VT	EQU	0BH
CR	EQU	0DH
SUBS	EQU	1AH	; END FLAG
ESC	EQU	1BH
HOME	EQU	1DH

; BLOKOVA NAVESTI
SOH	EQU	01H	; "START OF HEADER"
EOT	EQU	04H	; "END OF TEXT"
CAN	EQU	':'	; JMENO PASKY
;		'A'	; DATOVY (ASCII) BLOK
;		'B'	; BINARNI BLOK

; SERIOVY KANAL
; =============

UMODE	EQU	10H
USTAT	EQU	11H
UDATA	EQU	12H
URES	EQU	13H
PRENOS	EQU	0DH

; PARAMETRY KZD-1
; ===============

KZDIN	EQU	31H	; ADRESA VSTUPNIHO PORTU
KZDOUT	EQU	30H	; ADRESA VYSTUPNIHO PORTU
KZDCTR	EQU	33H	; ADRESA RIDICIHO REGISTRU
			; MHB 8255


; VYZNAM CHYBOVYCH HLASENI (PRIZNAK Z=0):
; =======================================
; CHYBA	  <A>
;   0	  30H    ZAZNAM NENI POVOLEN       (SZAVP)
;   2     32H    CHYBA PRI CTENI DAT (CRC) (CTBLD,KOBLD)
;   4     34H    NESOUHLASI CISLO BLOKU	   (@READU)
;	         CHYBA PRI CTENI OZNACENI  (CTOZN)
;   6	  36H	 PRETIZENI MOTORKU	   (TEKP,CTTV)
;   8     38H    BYLA PRECTENA EM	   (@READU)
;   A	  3AH	 NENI BINARNI FORMAT	   (LOAD)
;   C	  3CH	 SOUBOR NEEXISTUJE	   (NUMB,CMPNM)

; DEFINICE KONSTANT:
; ==================
SETPPI	EQU	8BH
SETOUT	EQU	1FH
KSCVP	EQU	0FEH
KSCVPC	EQU	0BEH
KSCVZC	EQU	0BBH
KSCRVP	EQU	0BDH
KSCRVZ	EQU	0B7H
KSZAVP	EQU	0AEH
KSTPCT	EQU	0FFH
KSTPZA	EQU	0AFH
KONST1	EQU	05CH
KPREVZ	EQU	0B3H

;************************************
	ASEG
	ORG	EPROM	; START
;************************************

;====================================
;  T A B U L K A  S L U Z E B  K O S
;====================================

	JMP	MICOS	; BRANCH TABLE
	JMP	INITS	; INIT SYSTEM
	JMP	FIND	; 1
	JMP	OPEN	; 2
	JMP	CLOSE	; 3
	JMP	LOAD	; 4
	JMP	SAVE	; 5
	JMP	BINAR	; 6
ZAC:	JMP	GET@	; 7
	JMP	REWIND	; 8
	JMP	PUT@	; 9
	JMP	STOP	; 10
	JMP	SLEN	; 11
	JMP	NUMB@	; 12

MAXSL	EQU	$-EPROM

;====================================
; INICIALIZACE SYSTEMU KOS
;====================================

INITS:	MVI	A,0A9H	; LO=L,RI-1,PO-1
	STA	FND	; NE FIND MODE
	STA	IOBYT
	CALL	TXIMM	; OHLASENI
	DB	'MIKOS/K V5.0 '
	DC	'(C) TESLA DIZ 1987 '
	LXI	H,KOS@@
	SHLD	KOS@+1
	XRA	A
	STA	@IF1	; FIND FLAG
	STA	@OF1
	STA	JEVER	; NENI VERIFIKACE
	LXI	H,ZAC
	LXI	D,R1LOC
	MVI	B,12
	CALL	MOVE
	CALL	INITIO	 ; INICIALIZACE 8255
	MVI	A,LENGHT ; IMPLICITNI DELKA
	STA	DEBL	 ; BLOKU
	LDA	EP3	; USER SYSTEM ?
	CPI	0C3H
	CZ	EP3 + 3	; START
	RET

;===================================
;  VYHODNOCENI SLUZBY MONITORU
;===================================

KOS@@:	INR	C
	LXI	D,EPROM
	MVI	B,MAXSL
SLUZBA:	XCHG		; JMENO
	MOV	A,C
	ADD	C
	ADD	C	; *3
	CMP	B
	RNC		; VETSI
	MVI	B,0
	MOV	C,A	; OFFSET
	DAD	B	; VYPOCTI ADR
	PCHL

;===================================
; VYHODNOCENI POVELU OBSLUHY
;===================================

MICOS:	CALL	STOP
	XRA	A
	STA	EXTEXT	; 0..NENI
	MVI	C,'_'
	LDA	JEVER
	ORA	A
	JZ	$+5
	MVI	C,'*'	; PRO VERIFIKACI
	CALL	CO
	CALL	ECHOCR
	CPI	'I'
	JZ	INIT	; INICIALIZACE PASKY
	CPI	'O'
	JZ	OPEN	; OPEN OUTPUT
	CPI	'C'	; CLOSE OUTPUT
	JZ	CLOSE
	CPI	'F'	; FIND INPUT
	JZ	FIND
	CPI	'S'
	JZ	SAVE
	CPI	'L'	; LOAD
	JZ	LOAD
	CPI	'E'
	JZ	EOR
	CPI	'Z'
	JZ	@BOT	; NASTAV NA "BOT"
	CPI	'B'
	JZ	@BLOK	; O BLOK VPRED
	CPI	'>'
	JZ	@SKIP	; O SOUBOR VPRED
	CPI	'<'
	JZ	@BACK	; O SOUBOR VZAD
	CPI	'V'
	JZ	VERIF	; NASTAV VERIFIKACI
	CPI	'P'
	JZ	VRF1	; POROVNANI 1 SOUBORU
	CPI	'R'
	MVI	D,1
	JZ	REWIND	; PREVINUTI NA ZACATEK
	CPI	'D'
	JZ	@EOR	; ADRESAR KAZETY
	CPI	'N'
	JZ	NUMB	; NAJDI DLE CISLA SOUBORU
	CPI	'X'
	JZ	SLEN@	; NASTAV DELKU BLOKU
	CPI	'K'	; ZAPIS EM
	RNZ		; JINY POVEL

;************************************
; REALIZACE POVELU KOS-1
;************************************

;====================================
; ZAPIS EM NA PASKU
;====================================

KONEC:	CALL	OK?
	RNZ		; NEPIS
	CALL	SCVZC
	CALL	HLKMM
	CALL	ZAKMM
	JMP	ZAKS1-1

;====================================
; BINARNI SOUBOR NASTAV
;====================================

BINAR:	MVI	A,'B'
	STA	BOUT-1
	RET

;====================================
; UZAVRI A PRIPOJ DALSI SOUBOR
;====================================

NOVYOT:	CALL	CLOSE
	JMP	OPE4

;====================================
; NASTAV DELKU BLOKU
;	VSTUP:	E - DELKA BLOKU
;	       (PRI VOLANI SLUZBY 157
;		JE DELKA BLOKU V <L>
;====================================

SLEN@:	CALL	TXIMM
	DB	CR,LF
	DC	'DELKA BLOKU'
	MVI	C,1
	CALL	EXPR
	POP	D
SLEN:	MOV	A,E
	STA	DEBL	; NOVA DELKA BLOKU
	RET

;====================================
; PREPNI NASTAVENI VERIFIKACE
;====================================

VERIF:	LDA	JEVER
	XRI	0FFH
	STA	JEVER
	RET

;====================================
; OTEVRI NOVY SOUBOR PRO ZAPIS
;====================================

OPEN:	XRA	A
	CALL	IOPO	; NASTAV IOBYT
	CALL	NPO
	RM		; PO=SYSTEM..
	MVI	C,2
	JNZ	CCPM	; USER=2
	CALL	RNAME
	CPI	'@'	; VYBER
	JZ	OPE2	; ZA SOUBOR
	CPI	'.'
	JNZ	OPE5	; NA KONEC (APPEND)
	CALL	BOT	; OD ZACATKU
	PUSH	H
OPE1:	CALL	SEARCH	; KONEC ZAZNAMU ?
	CALL	VYPISH	; SOH
	MOV	A,C
	STA	BTO	; CISLO SOUBORU
	CALL	SKIP
	CALL	STOP
	CALL	OK?
	JNZ	OPE1	; DALSI SOUBOR
OPE4:	LHLD	BNO	; CISLO SOUBORU
	INR	H
	MVI	L,0
	SHLD	BNO	; CISLO BLOKU A SOUBORU
	MVI	A,SOH
	STA	@OF1
	POP	H
	JMP	WRNAM

OPE5:	MVI	A,8	; NASTAV PO=1
	CALL	IOPO1
	PUSH	H
	CALL	BLOK4
	CALL	EOR
	JMP	OPE4

OPE2:	MVI	A,8
	CALL	IOPO1
	LDA	@OF1	; PODRUHE ?
	ORA	A
	JNZ	NOVYOT
	PUSH	H
	CALL	SCVPC
	CALL	HLDMM	; ZA SOUBOR
	JMP	OPE4

;====================================
; OTEVRI SOUBOR PRO CTENI
;====================================

FIND:	XRA	A
	CALL	IORI
	CALL	NRI
	RM		; SYSTEM RI
	MVI	C,1
	JNZ	CCPM	; USER 2
	CALL	RNAME
	CPI	'.'
	CZ	BOT
	MVI	B,NAMLE
	LXI	D,FNAME
	CALL	MOVE
	CALL	CMPNM
FIND1:	MOV	H,C	; CISLO SOUBORU
	MVI	L,1
	SHLD	BNI
	SHLD	BNO	; PRO ZAPIS (PO "K_N")
	MOV	A,L
	STA	@IF1
	CALL	BUFEND
	SHLD	ADRI
	RET

;====================================
; CTI BINARNI SOUBOR
;====================================
;
LOAD:	CALL	FIND	; OTEVRI SOUBOR
LO1:	CALL	RICH
	ORA	A	; BLANK?
	JZ	LO1
	SUI	'<'
	PUSH	PSW
	MVI	A,3AH
	JNZ	ERREND	; NENI BINARNI FORMAT
	POP	PSW
	MOV	B,A	; KONTROLNI SOUCET
	CALL	RADR@
	SHLD	EADR	; KONCOVA ADRESA
	XCHG
	CALL	RADR@
	SHLD	SADR	; START. ADRESA
	CALL	RICH
	CPI	'>'
	PUSH	PSW
	MVI	A,3AH
	JNZ	ERREND	; NENI BINAR
	POP	PSW
	PUSH	H
	CALL	CHECK
	MVI	B,0	; NULUJ
LO2:	CALL	RICH
	MOV	M,A
	CALL	HILO
	JNC	LO2
	CALL	CHECK
	STA	SUM
	POP	H
	LXI	D,4401H
	CALL	HILO
	JNZ	CLSTP
	LXI	H,0
	SHLD	@BT

; UZAVRI VSTUPNI SOUBOR
CLSTP:	CALL	CRLF
	CALL	NRI
	RM
	JNZ	CLST2
DIRSTP:	XRA	A
	STA	@IF1	; CLOSE
	CMA
	STA	DEBL	; BLOK 255 B
	JMP	@SKIP	; ZA EM A STOP
CLST2:	XRA	A
	STA	@IF2
	RET
;====================================
; ULOZ BINARNI SOUBOR
;====================================

SAVE:	CALL	OPEN
	MVI	C,2
	CALL	EXPR	; ROZSAH ADRES
	CALL	NPO
	CZ	BINAR
	MVI	C,'<'	; PRVNI BYTE
	CALL	POCH
	MVI	B,0	; KONTROLNI SOUCET
	POP	H	; POCATECNI ADRESA
	POP	D	; KONCOVA ADRESA
	CALL	PADR@
	XCHG
	CALL	PADR@
	MVI	C,'>'
	CALL	POCH
	MOV	C,B	; KONTROLNI SUMA ADRES
	CALL	POCH
	MVI	B,0	; KONTROLNI SUMA DAT
SAV1:	MOV	C,M
	CALL	POCH
	CALL	HILO
	JNC	SAV1
	MOV	C,B	; SUMA
	CALL	POCH

;====================================
; UZAVRI VYSTUPNI SOUBOR
;====================================

CLOSE:	CALL	NPO
	RM
	MVI	C,3
	JNZ	CCPM
CLOSE0:	LDA	@OF1	; NENI OTEVREN
	ORA	A
	RZ
	PUSH	D
	PUSH	H
	LHLD	ADRO
	INX	H
	MVI	M,SUBS	; ZAPIS POSLEDNI ZNAK
	MVI	A,EOT	; UZAVRI BLOK
	STA	BOUT-1
	CALL	WOB
	XRA	A
	STA	@OF1	; CLOSE
	CALL	EOR1	; PRED EM
	LDA	JEVER
	ORA	A
	JZ	CLOSE1
	CALL	BACK
	CALL	VRF1
CLOSE1:	POP	H
	POP	D
	RET

;====================================
; NAJDI SOUBOR DLE CISLA A OTEVRI
;	VSTUP: PRO VOLANI SLUZBOU 157
;	       L - CISLO SOUBORU
;====================================

NUMB:	CALL	TXIMM
	DB	CR,LF
	DC	'CISLO SOUBORU'
	MVI	C,1
	CALL	EXPR
	POP	D
NUMB@:	MOV	A,E	; CISLO SOUBORU
	ORA	A
	JZ	NUM4	; PRO SOUBOR "00"
	PUSH	PSW
	CALL	SEARCH
	CPI	38H
	JZ	NUM2	; PRO EM
NUM1:	POP	PSW
	CMP	C	; CISLO SOUBORU ?
	JZ	FIND1	; OK - NASEL
	PUSH	PSW	; CISLO SOUBORU ZADANE
	JC	NUM2	; PRO A<C ZPET
	CALL	SKIP	; PRO A>C VPRED
	JMP	NUM3
NUM2:	CALL	BACK	; PRO A<C
	CALL	BACK
NUM3:	CALL	SEARCH
	CPI	38H
	JNZ	NUM1
	CALL	EOR1
	MVI	A,3CH	; SOUBOR NEEXISTUJE
	JMP	ERREND
NUM4:	STA	BTO	; CISLO SOUBORU PRO ZAPIS
	CALL	BOT
	JMP	@BLOK	; NAZEV PASKY


;====================================
; INICIALIZUJ NOVOU KAZETU
;====================================

INIT:	CALL	FORM	; FORMATOVANI
	CALL	TXIMM
	DC	' ZADEJ'
	LXI	H,0	; CISLO SOUBORU
	SHLD	BNO	; A BLOKU
	CALL	RNAME	; JMENO PASKY
	MVI	A,CAN

; ZAPIS JMENO SOUBORU

WRNAM:	PUSH	H
	PUSH	PSW
	CALL	NULBF
	POP	PSW
	MOV	M,A
	INX	H
	MVI	B,COMLE	; JMENO+POZNAMKA
	XCHG
	POP	H
	PUSH	D
	CALL	MOVE
	POP	H
	MVI	B,NAMLE
	LXI	D,WRNM	; VYSTUPNI POLE
WRN1:	MOV	A,M
	ORA	A
	JNZ	$+5
	MVI	A,' '	; BLANK
	STAX	D
	INX	H
	INX	D
	DCR	B
	JNZ	WRN1
	CALL	ZADMM	; DMM PRED SOUBOREM
	MVI	C,COMLE+1 ; DELKA BLOKU
	CALL	WOB1
	MVI	M,'A'	; TYP DATA
	JMP	CRLF

;====================================

; TEST NA JMENO

	CALL	PHDR
CMPNM:	CALL	SEARCH	; POROVNEJ JMENO
	CPI	38H
	JNZ	CMPN1
	MVI	A,3CH	; KONEC SOUBORU
	JMP	ERREND
CMPN1:	LDA	BIN-1
	CPI	CAN
	JZ	CMPNM-3	; VYPIS VOLUME JMENO
			; PRO ZAPIS
CPF10:	PUSH	B	; <C> - CISLO SOUBORU
	LXI	B,FNAME
	LXI	H,BIN-1
	MVI	E,NAMLE
	CALL	TESTJM
	POP	B
	RZ		; OK - NASEL
	CALL	SKIP
	JMP	CMPNM	; DALSI JMENO

TESTJM:	INX	H	; JMENO
	LDAX	B
	CPI	'*'
	JZ	JMENO?
	CALL	@ANAL
	JZ	VYPISH
	CMP	M
	RNZ
	INX	B
	DCR	E
	JNZ	TESTJM


; VYPIS HLAVICKU

VYPISH:	PUSH	B
	PUSH	D
	CALL	PHDR
VYP1:	POP	D
	POP	B
	XRA	A
	RET


SEARCH:	CALL	SCVPC	; NALEZENI SOUBORU
	CALL	HLDMM	; NA PASCE A TEST
	CALL	READBL
	JMP	STOP


; TISK HLAVICKY SOUBORU

PHDR:	CALL	CRLF
PHDR1:	LXI	H,BIN
	MVI	D,COMLE
	JMP	TEXT

PDIR:	PUSH	B
	MOV	A,C
	CALL	DBTV2
	CALL	PHDR1
	CALL	SPACE
	POP	B
	RET


; VYPIS NA CO PRO IDENTIFIKACI BLOKU

PNAME:	LXI	H,READNM ; VYPIS "E" ZNAKU Z POLE
PNAM1:	MOV	A,M	 ; READNM NA CO
	CPI	1FH
	JNC	PNAM2
	ADI	40H	; KOD SAPI-1 NA ASCII
PNAM2:	MOV	C,A
	CALL	CO
	INX	H
	DCR	E
	JNZ	PNAM1
	RET


DBTCR:	CALL	CRLF
DBTV:	MOV	A,D
	CALL	DBYT
DBTV1:	CALL	SPACE
	MOV	A,B
DBTV2:	CALL	DBYT
	JMP	SPACE


OBNOV:	LHLD	POSICE	; VRACENI OKNA
	CALL	TXIMM
	DB	9BH	; ESC
	MOV	C,L
	CALL	CO
	MOV	C,H
	CALL	CO
	LDA	MOD@
	STA	MODE
	RET


OKNO:	PUSH	D	; NASTAVENI OKNA
	PUSH	B
	LXI	H,MODE
	MOV	A,M
	MVI	M,0	; ZRUS ^P
	STA	MOD@
	CALL	SPCL
	LXI	H,2020H
	DAD	D
	SHLD	POSICE
	CALL	TXIMM
	DB	HOME OR 80H
	POP	B
	POP	D
	RET


;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

;  OPERACE SE SOUBORY

;=======================================
; CTI VSTUPNI BUFFER
;=======================================

RIB:	PUSH	D
	PUSH	B
	XRA	A
	STA	FND	; FIND MOD
	CALL	READBL
	ORA	A
	JNZ	ERRD	; CHYBA CTENI BLOKU
	CALL	NUFIL	; CISLA OK ?
	JNZ	ERRD
RIB1:	SHLD	BNI
	POP	B
	POP	D
RIB2:	LDA	BIN-1	; TYP BLOKU
	CPI	CAN	; NAZEV PASKY
	RZ
	CPI	SOH	; JMENO SOUBORU
	RET		; <A> = TYP BLOKU


NUFIL:	LHLD	BNI
	INX	H	; CISLO BLOKU
	MOV	A,C
	CMP	H	; OK?
	RNZ
	MOV	A,B
	CMP	L	; CISLO SOUBORU ?
	RET


;=============================================
; CTENI BLOKU	VYSTUP:	B -CISLO BLOKU CTENE 
;			C -CISLO SOUBORU CTENE
;			A =0 - CTENI OK
;			A<>0 - CHYBA
;=============================================

READBL:	CALL	@READU	; CTENI UVODU BLOKU
	ORA	A
	JNZ	KONBL1	; PRO CHYBU
	LXI	H,READNM
	MVI	M,':'	; VYHLEDAVANI
	LDA	FND
	ORA	A
	JNZ	KONBL0
	MVI	M,'*'
	MOV	A,C
	DCR	A
	STA	DEBL	; DELKA BLOKU
KONBL0:	INX	H
	MVI	M,'"'
	CALL	CTBLD	; CTENI BLOKU DAT

KONBL1:	PUSH	PSW	; <A> = CHYBA
	LDA	BIN-1
	CPI	'B'
	JZ	KONBL2	; NENI STOP
	LDA	FND
	ORA	A
	CZ	STOP
KONBL2:	CALL	OKNO
	MVI	E,15
	MOV	A,E
	STA	FND	; NE FIND MOD
	CALL	PNAME	; VYPIS JMENA
	CALL	DBTV
	CALL	OBNOV
	LXI	H,BIN-1
	SHLD	ADRI
	POP	PSW
	MOV	C,D	; CISLO SOUBORU
	RET		; A=0  PRO OK
			; A<>0 PRO CHYBU

;==============================================
; CTENI UVODU BLOKU
;	VYSTUP: B - CISLO BLOKU CTENE
;		C - DELKA BLOKU
;		D - CISLO SOUBORU CTENE
;	  NEBO  VIZ TEKP
;===========================================

@READU:	CALL	SCVPC
	CALL	HLKMM
	RNZ		; PRO CHYBU (A=31)
	CALL	SCVP
	CALL	CTTV
	CPI	36H
	JZ	ERREND	; KONEC PASKY
	MOV	C,A
	ORA	A
	MVI	A,38H
	RZ		; PRO KONEC SOUBORU
	MOV	A,C
	CPI	UVOD
	RNZ		; NENI SYNCHRONIZACE
	CALL	CTOZN
	RNZ		; PRO CHYBU CTENI ONACENI
	XRA	A	;   BLOKU (A=34)
	RET		; PRO CTOZN OK


;==============================================
; ZAPIS VYSTUPNI BUFFER
;==============================================

WOB:	LDA	DEBL	; DELKA BLOKU
	MOV	C,A
	INR	C	; + TYP BLOKU
WOB1:	LHLD	BNO
	INX	H
	SHLD	BNO
	MOV	B,L	; CISLO BLOKU
	MOV	D,H	; CISLO SOUBORU
	PUSH	B
	CALL	OKNO
	CALL	DBTV1	; CISLO BLOKU NA CO
	CALL	OBNOV
	POP	B

;==============================================
; ZAPIS BLOKU	VSTUP:	B -CISLO BLOKU
;			C -DELKA BLOKU
;			D -CISLO SOUBORU
;		VYSTUP:	B -CISLO BLOKU
;==============================================

@WBLOK:	CALL	ZAKMM
	JNZ	ERREND	; PRO NEPOVOLENY ZAPIS
	CALL	ZAOZN
	CALL	ZABLD
	CALL	TEKP
	JNZ	ERREND	; PRO CHYBU
	LDA	BOUT-1
	CPI	EOT	; BYL POSLEDNI BLOK?
	JZ	ZAKS	; ANO=KONEC
	CPI	CAN
	JNZ	NULBF
ZAKS:	CALL	ZAKMM	; ZAPIS KONEC SOUBORU
	CALL	ZAKBL	; EM
ZAKS1:	CALL	ZADMM	; DMM ZA SOUBOREM
	CALL	TEKP
	RNZ
ZAKS2:	CALL	ZAKBL	; EM
	CALL	ZAKMM

; NULUJ VYSTUPNI BUFFER

NULBF:	LXI	H,BOUT-1
	SHLD	ADRO
	PUSH	H
	MVI	A,LENGHT
	INX	H
	MVI	M,0
	DCR	A
	JNZ	$-4
	POP	H	; (BLOK TYP) ADR
	MOV	A,M
	CPI	'B'
	CNZ	STOP
	XRA	A	; OK
	RET


;==============================
; CTI BYTE Z KAZETY
;==============================

GET@:	PUSH	B
	PUSH	D
	PUSH	H
	LDA	@IF1	; BYL OTEVREN SOUBOR?
	ORA	A
	CZ	FIND	; KDYZ NE, TAK FIND
GET0:	CALL	BUFEND
	XCHG		; DE = BEIND-1
	LHLD	ADRI
	CALL	HILO
	MOV	A,M
	SHLD	ADRI
	JC	GET1	; <A>..BYTE
	CPI	SUBS	; EOF? TEST
	JNZ	GETEX	; -
	MOV	C,A
	CALL	KONEC?
GET00:	MOV	A,C	; POSLEDNI BLOK
	JNZ	GETEX	; -
	MOV	B,L	; ADR ZNAKU SUBS
	CALL	BUFEND	; HLEDEJ OD KONCE
GET01:	DCX	H
	CMP	M	; JE SUBS
	JNZ	GET01	; -
	MOV	A,L
	SUB	E	; STEJNY ADR?
	JNZ	GET00	; - NENI KONEC

GET2:	XRA	A
	STA	@IF1	; UZAVRI SOUBOR
	CMA
	STA	DEBL	; DELKA BLOKU 255 B
	CALL	@SKIP	; ZA EM
	MVI	A,SUBS
	STC
	DB	6
GETEX:	ORA	A
	POP	H
	POP	D
	POP	B
	RET

GET1:	CALL	KONEC?
	CNZ	RIB
	JNZ	GET0	; KONEC SOUBORU
	JMP	GET2

KONEC?:	LDA	BIN-1	; POSLEDNI BLOK?
	CPI	EOT
	RET		; ZY=1...ANO

BUFEND:	LDA	DEBL	; VYPOCTI KONEC BLOKU
	MOV	E,A	;   V BUFFRU
	LXI	H,BIN-1
	MVI	D,0
	DAD	D
	RET


;===============================
; ZAPIS BYTE NA KAZETU
;===============================

PUT@:	CALL	PUTEND	; JE ^Z ?
	JC	CLOSE0
	PUSH	B
	PUSH	D
	PUSH	H
	LDA	@OF1	; BYL OTEVREN?
	ORA	A
	PUSH	B
	CZ	OPEN	; KDYZ NE, TAK OPEN
	POP	B
	CALL	BUFEND	; DE = BOUT-1
	XCHG
	LHLD	ADRO
	INX	H
	MOV	M,C
	SHLD	ADRO
	CALL	HILO
	CC	WOB
 	POP	H
	POP	D
	POP	B
	MOV	A,C
	ORA	A	; NCY
	RET

PUTEND:	LDA	BOUT-1
	CPI	'B'
	RZ
	LDA	MODE
	ANI	2
	XRI	2
	RZ
	MOV	A,C
	CPI	SUBS
	STC
	RZ
	ORA	A
	RET


;===============================
; ZKONTROLUJ JEDEN SOUBOR
;===============================

VRF1:	CALL	CRLF
	CALL	SEARCH
	PUSH	PSW	; <A> = CHYBA
	MOV	A,C
	STA	BTI	; CISLO SOUBORU
	XRA	A
	STA	BNI	; CISLO BLOKU
	CALL	PDIR	; CISLO SOUBORU A HLAVICKA
	POP	PSW	; NA CO
VRF2:	ORA	A
	JZ	VRF4	; OK
	CPI	38H
	JNZ	VRF3	; BYLA EM
	LDA	BIN-1
	CPI	CAN
	JZ	STOP	; OK
VRF3:	PUSH	B	; CISLO BLOKU
	MVI	C,'#'
	CALL	CO
	POP	B
VRF4:	CALL	NUFIL
	MVI	C,'%'
	SHLD	BNI	; ULOZ CISLA
	CNZ	CO	; PRO CHYBU CISEL
	LDA	BIN-1
	CPI	EOT
	JZ	STOP	; KONEC SOUBORU
	CALL	READBL
	JMP	VRF2


;===============================
; OSETRENI CHYBY
;===============================

ERRD0:	CALL	STOP
	CALL	CRLF
	LHLD	BNI
	INX	H
	XCHG		; CISLO SOUBORU
	MOV	B,E	;   A BLOKU NA CO
	CALL	DBTCR
	CALL	TXIMM
	DB	CR,LF,7
	DC	'CHYBA CTENI: I/D/N/A=ZNOVA ?'
	CALL	ECHO
	XCHG		; CISLO SOUBORU A BLOKU
	CPI	'N'	;   PRO "N"
	JZ	RIB1
	CPI	'I'
	JNZ	ERRD1
	LDA	BTI
	INR	A
	STA	BTI	; ZVYS CISLO SOUBORU
	CALL	SKIP
	JMP	ERRD7
ERRD1:	CPI	'D'
	JNZ	ERRD3
	LDA	BTI
	DCR	A	; SNIZ CISLO SOUBORU
	STA	BTI
	CALL	BACK
	CALL	BACK
	JMP	ERRD7
ERRD:	CALL	STOP	; PRO 1. CHYBU - "A"
ERRD3:	CALL	BLOK4
ERRD7:	XRA	A
	STA	FND	; FIND MOD
	CALL	READBL
	ORA	A
	JNZ	ERRD7
	CALL	NUFIL	; NASEL ?
	JZ	RIB1	;  ANO - OK
	JNC	ERRD0	; PREJEL
	JMP	ERRD7

BLOK4:	PUSH	B	; ZPET O 4 BLOKY
	MVI	B,4
BL41:	CALL	BLOK2
	DCR	B
	JNZ	BL41
	POP	B
	RET


; ZASTAV A OHLAS CHYBU

ERSTP:	MVI	A,32H	; CHYBA SOUCTU
ERREND:	PUSH	PSW
	CALL	CRLF
	CALL	TXIMM
	DC	'CHYBA - '
	POP	PSW
	ANI	0FH	; TYP CHYBY
	MOV	E,A
	CALL	STOP
	MVI	D,0
	LXI	H,TXERR
	DAD	D
	CALL	@TEXT
	JMP	NEXT

@TEXT:	MOV	E,M
	INX	H
	MOV	D,M
	XCHG
	MOV	D,M
	INX	H
	JMP	TEXT


CHECK:	MOV	C,B	; KONTROLNI SOUCET ?
	CALL	RICH
	CMP	C
	RZ

RADR@:	CALL	RICH
	MOV	L,A
	CALL	RICH	; HL
	MOV	H,A
	RET

RICH:	CALL	RI	; CTENI & SUMA
	JC	ERSTP
	PUSH	PSW
	ADD	B
	MOV	B,A
	POP	PSW
	RET

PADR@:	MOV	C,L
	CALL	POCH
	MOV	C,H

POCH:	MOV	A,C	; ZAPIS & SUMA
	ADD	B
	MOV	B,A
	JMP	PO


;=======================================
; CTENI TYPU ZAZNAMU
;	VYSTUP: A = 00 - PRO EM
;		    FB - PRO DATOVY BLOK
; 	  NEBO  VIZ TEKP
;=======================================

CTTV:	PUSH	B
	PUSH	D
	LXI	D,5000H	; TIME OUT
	JMP	CTTV2
CTTV0:	MVI	A,5
	DCR	A
	JNZ	$-1
	MVI	C,10H
CTTV1:	DCR	C
	JNZ	CTTV3
	DCX	D
	MOV	A,D
	ORA	E
	JNZ	CTTV2
	POP	D
	POP	B
	MVI	A,38H
	JMP	ERREND	; KONEC PRO TIME OUT
CTTV2:	LXI	B,0110H
CTTV3:	IN	KZDIN
	ANI	0F0H
	JZ	CTTV1
	RAL
	MOV	A,B
	RAL
	MOV	B,A
	JNC	CTTV0
	IN	KZDIN
	ANI	30H	; TEST PRETIZENI MOTORKU
	MOV	A,B
	POP	D
	POP	B
	RZ		; OK
	MVI	A,36H	; PRO CHYBU
	RET


;==============================================
; CTENI OZNACENI BLOKU
;	VYSTUP: B  - CISLO BLOKU
;		C  - DELKA BLOKU
;		D  - CISLO SOUBORU
;	  NEBO  NZ - CHYBA CTENI OZNACENI BLOKU
;		A  - CHYBA 2
;	  NEBO  VIZ TEKP
;==============================================

CTOZN:	PUSH	H
	CALL	CTIBYT
	MOV	B,A	; CISLO BLOKU
	CALL	CTIBYT
	MOV	C,A	; DELKA BLOKU
	CALL	CTIBYT
	MOV	D,A	; CISLO SOUBORU
	CALL	CTIBYT	; KONTROLNI SOUCET OZNACENI
	ADD	D	; BLOKU
	ADD	C
	ADD	B	; MUSI BYT 0, JINAK CHYBA
	POP	H
	MVI	A,34H
	RNZ		; NAVRAT PRO CHYBNY SOUCET
	JMP	TEKP	; PRO OK TEST KONCE PASKY
			; POKUD NENI, JE VSE OK


;====================================
; CTENI BLOKU DAT
;	VSTUP:  C  - DELKA BLOKU
;	VYSTUP: NZ - CHYBA CTENI DAT
;		A  - CHYBA 2
;	  NEBO  VIZ TEKP
;====================================

CTBLD:	PUSH	D
	PUSH	B
	LXI	D,BIN-1	; DATA DO VSTUP. BUFFRU
	LXI	H,0	; PRO VYPOCET CRC
CTBLD1:	CALL	CTIBYT
	STAX	D	; ULOZENI DAT DO PAMETI
	INX	D
	DCR	C
	JNZ	CTBLD1
CTBLD2:	CALL	CTIBYT	; NACTENI KONTROLNI SUMY
	CALL	CTIBYT	; DO HL
	MOV	A,H
	ORA	L	; PRO OK MUSI BYT 0
	MVI	A,32H
	PUSH	PSW	; "Z" A CHYBU
	LXI	D,READNM+2
	MVI	B,NAMLE
CTBLD3:	CALL	CTIBYT	; CTENI JMENA
	STAX	D	; NA CO
	INX	D
	DCR	B
	JNZ	CTBLD3
	XCHG
	MVI	M,'"'
	INX	H
	MVI	M,' '
	POP	PSW
	POP	B
	POP	D
	RNZ		; PRO CHYBU KONTROL. SOUCTU
	JMP	TEKP	; PRO OK KONTROLA KONCE
			; PASKY

;====================================
; NACTENI 1 BYTE Z PASKY
;	VSTUP:  HL - PREDCHOZI CRC
;	VYSTUP: A  - PRECTENY BYTE
;		HL - CRC
;====================================

CTIBYT:	PUSH	B
	MVI	B,01	; POCITADLO BITU
CTIBY1: IN	KZDIN
	ANI	0F0H
	JZ	CTIBY1
	IN	KZDIN
	ANI	0F0H
	JZ	CTIBY1	; PRO RUSENI
	RAL
	PUSH	PSW	; VYPOCET CRC
	SBB	A
	DAD	H	; PREDCHOZI CRC
	ADC	A
	MVI	A,7
	JPE	$+5
	XRA	L
	MOV	L,A
	POP	PSW	; KONEC VYPOCTU CRC
	MOV	A,B
	RAL		; CYKLUS PRO 8 BITU
	MOV	B,A
	JNC	CTIBY1
	POP	B
	RET


;====================================
; ZAPIS BLOKU DAT = "C" BYTU DAT,
;	  2 BYTY CRC, 11 BYTU JMENO,
;	  2 BYTY ODDELOVACI <55H>
;	VSTUP:  C  - DELKA DAT
;====================================

ZABLD:	PUSH	B
	LXI	D,BOUT-1 ; DATA Z VYSTUP. BUFFERU
	LXI	H,0	; PRO VYPOCET CRC
ZABLD1:	LDAX	D
	CALL	PISBYT	; ZAPIS VLASTNICH DAT
	INX	D
	DCR	C
	JNZ	ZABLD1
	MOV	A,H
	CALL	PISBYT	; ZAPIS CRC ZNAKU
	MOV	A,H
	CALL	PISBYT
	LXI	D,WRNM
	MVI	B,NAMLE	; Z WRNM
ZABLD2:	LDAX	D
	CALL	PISBYT	; ZAPIS JMENA
	INX	D
	DCR	B
	JNZ	ZABLD2
	POP	B
PISODD:	MVI	A,55H
	CALL	PISBYT	; ZAPIS 16 BITU ODDELOVACICH


;======================================
; ZAPIS 1 BYTE NA PASKU
;	VSTUP:  A  - BYTE DAT
;		HL - PREDCHOZI CRC
;	VYSTUP: HL - CRC
;======================================

PISBYT:	PUSH	B	
	MVI	C,80H	; POCITADLO (MASKA) BITU
	MOV	B,A	; DATA DO REG.B
	ANA	C	; VYBER BITU
	ADI	0FFH	; BIT DO CARRY
	MVI	A,KONST1
	RAR
	OUT	KZDOUT	; VYSTUP DAT
	PUSH	PSW
	XRI	20H
	OUT	KZDOUT	; DATA PLATNA

	RAL		; VYPOCET CRC
	SBB	A
	DAD	H
	ADC	A
	MVI	A,7
	JPE	$+5
	XRA	L
	MOV	L,A
	MVI	A,2
	DCR	A
	JNZ	$-1
	POP	PSW	; KONEC VYP.CRC

	OUT	KZDOUT	; VRACENI SIGN.D.P.
	MVI	A,3
	DCR	A
	JNZ	$-1
	MOV	A,C
	RRC		; NA DALSI BIT
	MOV	C,A
	MOV	A,B
	JNC	PISBYT+4
	POP	B
	RET


;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

;   INSTALACE TERMINALU  SM 7202

	ORG	EPROM+800H

SERIO:	JMP	SINIT
	JMP	SERI@
	JMP	SCO
	JMP	SMST@

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


; JE EXTERNI JMENO '"' ?

EXT?:	LDA	EXTEXT
	CPI	'"'
	RET


; ANALYZA ODDELOVACU

@ANAL:	CPI	' '
	RZ
ANAL:	CPI	CR
	RZ
	ORA	A
	RET

JMENO?:	CALL	VYPISH	; ANO / NE
OK?:	CALL	TXIMM
	DC	'--(A/N)?'
	CALL	ECHOCR
	CPI	'A'
	RZ
	CPI	'Y'
	RET

;========================================

; TEST NA IOBYTE (PO)

NPO:	LDA	IOBYT
	RRC
	RRC
NRI1:	RRC
	RRC
	ANI	3	; ZARIZENI
	DCR	A	; MINUS .. SYSTEM
	DCR	A	; ZY.. USER=1
	RET		; NZ.. USER=2

; TEST NA IOBYTE (RI)

NRI:	LDA	IOBYT
	JMP	NRI1

; NASTAV IOBYTE PODLE OPTION

IOPO:	CALL	CISLO
	RC
	RLC
	RLC
IOPO1:	MVI	C,0CFH	; MASKA
	JMP	ZMIO

IORI:	CALL	CISLO
	RC
	MVI	C,0F3H	; MASKA
ZMIO:	RLC
	RLC
	MOV	B,A
	LDA	IOBYT
	ANA	C
	ORA	B
	STA	IOBYT
	RET

CISLO:	SUI	'0'
	RC		; CY=1..NENI
	CPI	3
	CMC
	RC
	INR	A
	RET


; VYPIS TEXT

TXNAM:	CALL	TXIMM
	DB	CR,LF
	DC	' NAZEV:'
	RET


BREAK:	CALL	CSTS
	RZ
	CALL	CI
	JMP	ETX?


; CTI A VYPIS ZNAK

ECHO:	CALL	CINCR
	RZ
ETX?:	CPI	ETX
	RNZ
	CALL	DIRSTP	; CLOSE & STOP
	JMP	NEXT	; BREAK=>C


ECHOCR:	CALL	ECHO
	PUSH	PSW
	CALL	CRLF
	POP	PSW
	RET


MOVE:	MOV	A,M	; PRESUN PAMETI
	STAX	D	; HL - ODKUD
	INX	H	; DE - KAM
	INX	D	; B - KOLIK
	DCR	B
	JNZ	MOVE
	RET

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

;====================================
; ZAPIS OZNACENI BLOKU - 0FFH, CISLO
;	A DELKA BLOKU, CISLO SOUBORU,
;	KONTROLNI SOUCET
;	VSTUP:  B - CISLO BLOKU
;		C - DELKA BLOKU
;		D - CISLO SOUBORU
;====================================

ZAOZN:	MVI	A,UVOD	; UVOD BLOKU (0FBH)
	CALL	PISBYT
	CALL	ZAOZN1
	MOV	A,B	; CISLO BLOKU
	CALL	PISBYT
	MOV	A,C	; DELKA BLOKU
	CALL	PISBYT
	MOV	A,D
	CALL	PISBYT	; CISLO SOUBORU
	ADD	C
	ADD	B
	CMA
	INR	A
	CALL	PISBYT	; KONTROLNI SOUCET
ZAOZN1:	MVI	A,32
	DCR	A
	JNZ	$-1
	RET


;====================================
; ZAPIS KONCOVYCH BLOKU (EM, FM)
;	- 16 KRAT PISE <00H>
;	VYSTUP: VIZ TEKP
;====================================

ZAKBL:	PUSH	B
	PUSH	H
	MVI	B,16
ZAKB1:	XRA	A
	CALL	PISBYT
	DCR	B
	JNZ	ZAKB1
	POP	H
	POP	B


;====================================
; TEST KONCE PASKY
;	VYSTUP: NZ - MOTOREK PRETIZEN
;		A  - CHYBA 1
;====================================

TEKP:	CALL	BREAK
	IN	KZDIN
	ANI	30H	; TEST PRETIZENI
	MVI	A,36H	;   OBOU MOTORKU
	RNZ		; PRO CHYBU - NENALEZEN KONEC
	XRA	A	;	      SOUBORU
	RET		; PRO OK - PASKA STOJI

;====================================
; PREVINUTI KAZETY
;	VSTUP:  D=1 - NA ZACATEK
;		D-0 - NA KONEC
;	VYSTUP: VIZ TEKP
;====================================

REW3:	PUSH	D
	MVI	A,KPREVZ
	DCR	D	; URCENI SMERU PREMOTANI
	JZ	REW4
	MVI	A,KSCRVP
REW4:	OUT	KZDOUT
	POP	D
REW7:	CALL	TEKP
	JZ	REW7
REWIND:	PUSH	D
	MVI	A,KSCVZC
	DCR	D	; URCENI SMERU
	JZ	REW5
	MVI	A,KSCVPC
REW5:	OUT	KZDOUT
	POP	D
	PUSH	B
	LXI	B,12000D
REW1:	DCX	B
	MOV	A,B
	ORA	C
	JNZ	REW1
	POP	B
	CALL	TEKP
	JZ	REW3
	XRA	A


;===================================
; STOP POHYBU
;===================================

STOP:	PUSH	PSW
	MVI	A,KSTPCT
	OUT	KZDOUT
	POP	PSW
	RET


;==================================
; INICIALIZACE MHB 8255
;==================================

INITIO:	MVI	A,SETPPI
	OUT	KZDCTR
	MVI	A,SETOUT
	OUT	KZDOUT
	RET

;==================================
; START CTENI VPRED
;==================================

SCVP:	MVI	A,KSCVP
	OUT	KZDOUT
	RET

;==================================
; START CTENI VPRED (SNIZ.CITL.)
;==================================

SCVPC:	MVI	A,KSCVPC
	OUT	KZDOUT
	RET

;==================================
; START CTENI VZAD (SNIZ.CITL.)
;==================================

SCVZC:	MVI	A,KSCVZC
	OUT	KZDOUT
	RET

;==================================
; START CTENI RYCHLE VPRED
;==================================

SCRVP:	MVI	A,KSCRVP
	OUT	KZDOUT
	RET

;==================================
; START CTENI RYCHLE VZAD
;==================================

SCRVZ:	MVI	A,KSCRVZ
	OUT	KZDOUT
	RET

;=======================================
; START ZAZNAMU VPRED
;	VYSTUP: NZ - ZAZNAM NENI POVOLEN
;		A  - CHYBA 0
;=======================================

SZAVP:	MVI	A,KSZAVP
	OUT	KZDOUT
	IN	KZDIN
	ANI	08H
	MVI	A,30H
	RET


;===================================
; VYHLEDANI ZACATKU PASKY (ZN. BOT)
;	VYSTUP: VIZ TEKP
;===================================

@BOT:	CALL	BOT
	JMP	STOP

BOT:	MVI	D,1	; PREVINUTI NA ZACATEK
	CALL	REWIND
	CALL	SCVPC
	CALL	HLDMM
	CALL	HLDMM
	JNZ	ERREND
	PUSH	B
	LXI	B,500D
	CALL	HLBOT1
	POP	B
	JMP	HLDMM


;===============================
; SKOK O 1 SOUBOR VPRED
;	VYSTUP: VIZ TEKP
;===============================

@SKIP:	CALL	SKIP
	JMP	STOP

SKIP:	CALL	SCVPC
	CALL	CTTV
	CALL	SCRVP
	JMP	HLDMM	; NASTAVI NA KONEC SOUBORU


;===============================
; SKOK O 1 SOUBOR VZAD
;	VYSTUP: VIZ TEKP
;===============================

@BACK:	CALL	BACK
	JMP	STOP

BACK:	CALL	SCVZC
	CALL	CTTV	; VYHLED.DAT VZAD
	CALL	SCRVZ	; RYCHLE VZAD


;==============================
; HLEDANI DLOUHE MEZIBL. MEZERY
;	 VYSTUP: VIZ TEKP
;==============================

HLDMM:	PUSH	H
	LXI	H,2000H
	CALL	HLMM2
	JNZ	HLDMM+1
	JMP	HLMM1


;==============================
; ZAPIS KRATKE MEZIBL. MEZERY
;	VYSTUP:	VIZ SZAVP, TEKP
;==============================

ZAKMM:	PUSH	B
	LXI	B,450H
ZAMM2:	CALL	SZAVP
	JNZ	ZAMM3	; PRO NEPOVOLENY ZAZNAM
ZAMM1:	MVI	A,11
	DCR	A
	JNZ	$-1
	NOP
	DCX	B
	MOV	A,C
	ORA	B
	JNZ	ZAMM1
ZAMM3:	POP	B
	RNZ		; PRO NEPOVOLENY ZAZNAM
	JMP	TEKP


;==============================
; ZAPIS DLOUHE MEZIBL. MEZERY
;	VYSTUP:	VIZ SZAVP, TEKP
;==============================

ZADMM:	PUSH	B
	LXI	B,2000H
	JMP	ZAMM2


;==============================
; SKOK O 1 BLOK VPRED
;	VYSTUP: VIZ TEKP
;==============================

@BLOK:	CALL	BLOK1
	JMP	STOP

BLOK1:	CALL	SCVPC
	JMP	BLOK2+3


;==============================
; SKOK O 1 BLOK VZAD
;	VYSTUP: VIZ TEKP
;==============================

BLOK2:	CALL	SCVZC
	CALL	CTTV


;==============================
; HLEDANI KRATKE MEZIBL.MEZERY
;	VYSTUP: VIZ TEKP
;==============================

HLKMM:	PUSH	H
	LXI	H,200H
	CALL	HLMM2
	JNZ	HLKMM+1
HLMM1:	POP	H
	JMP	TEKP

HLMM2:	IN	KZDIN	; HLEDANI MEZERY
	ANI	0C0H	; V ZADANE DELCE
	RNZ
	DCX	H
	ORA	H
	ORA	L
	JNZ	HLMM2
	RET		; PRO OK


;==============================
; VYHLEDANI KONCE VSECH ZAZNAMU
;	VYSTUP: VIZ TEKP
;==============================

EOR:	XRA	A	; = EOR
	JMP	EOR0
@EOR:	MOV	C,A	; C=0/"D" PRO EOR?DIR
	LDA	JEVER
	ORA	C	; A="D" OR JEVER
EOR0:	PUSH	PSW	; A<>0 - DIR
	CNZ	BOT
EOR2:	CALL	SEARCH	; CTENI BLOKU SE JMENEM
	CPI	38H	; TEST CTENI EM
	JZ	EOR3	; CTENA EM
	MOV	A,C
	STA	BTO	; CISLO SOUBORU PRO ZAPIS
	STA	BTI	;      -"-	PRO CTENI
	POP	PSW
	PUSH	PSW
	JZ	EOR4	; NENI DIR
	CALL	PDIR
	MOV	A,C
	ORA	A
	JZ	EOR41	; PRO NAZEV PASKY
	POP	PSW
	PUSH	PSW
	CPI	'D'
	JNZ	EOR5	; PRO VERIFIKACI
EOR41:	CALL	CRLF
EOR4:	CALL	SKIP
	JMP	EOR2
EOR5:	XRA	A	; NENI CHYBA
	STA	BNI	; CISLO BLOKU
	CALL	VRF2
	CALL	CRLF
	MVI	C,'-'
	CALL	CO
	CALL	DBTV1	; CISLO BLOKU
	CALL	CRLF
	JMP	EOR2
EOR3:	POP	PSW
EOR1:	CALL	SCVZC
	CALL	HLDMM
	CALL	HLKMM
	JNZ	ERREND
	JMP	STOP


;==============================
; FORMATOVANI (MAZANI) KAZETY
;	VYSTUP: VIZ TEKP
;==============================

FORM:	MVI	D,1	; PREVIJENI VZAD, TEDY
	CALL	REWIND	; PREVINUTI NA ZACATEK
	CALL	SZAVP
	JNZ	ERREND	; PRO ZAPIS NENI POVOLEN
	PUSH	B
	PUSH	H
	LXI	B,12000D
	MVI	A,55H
FORM1:	CALL	PISBYT
	DCX	B
	MOV	A,B
	ORA	C
	JNZ	FORM1
	CALL	SCRVZ
	CALL	HLDMM
	CALL	HLDMM	; PREVINUTI NA ZACATEK
	CALL	SCVPC
	CALL	HLBOT
	POP	H
	POP	B
	STA	NAMBUF	; A=0 (<>"@")
	CALL	ZAKS1	; ZAPIS DMM, EM A KMM
	JNZ	ERREND
	JMP	EOR1	; NASTAVENI PRED EM

HLBOT:	LXI	B,1100D
HLBOT1:	CALL	CTTV
	DCX	B
	MOV	A,B
	ORA	C
	JNZ	HLBOT1
	RET

;-----------------------------------

; TEXTY CHYBOVYCH HLASENI

TXERR:	DW	TXER0
	DW	TXER2
	DW	TXER4
	DW	TXER6
	DW	TXER8
	DW	TXERA
	DW	TXERC

TXER0:	DB	19
	DC	'ZAZNAM NENI POVOLEN'
TXER2:	DB	15
	DC	'CHYBA CTENI DAT'
TXER4:	DB	20
	DC	'CHYBA OZNACENI BLOKU'
TXER6:	DB	11
	DC	'KONEC PASKY'
TXER8:	DB	18
	DC	'NENI KONEC SOUBORU'
TXERA:	DB	19
	DC	'NENI BINARNI FORMAT'
TXERC:	DB	17
	DC	'SOUBOR NEEXISTUJE'

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

;  OBSLUHA TERMINALU  SM 7202

; INICIALIZACE SYSTEMU
; --------------------

SINIT:	LXI	H,SERIO+3
	LXI	D,CI@0
	MVI	B,9
	CALL	MOVE
	XRA	A
	STA	SEKV	; NENI ESC. SEKVENCE
	MVI	A,9	; TERM.+STOP MGF.
SINI1:	OUT	UMODE
	OUT	URES
	MVI	A,PRENOS ; NASTAVENI PRENOSU
	OUT	USTAT
	IN	UDATA
	RET


; SERIOVY VYSTUP
; --------------

SCO:	LDA	SEKV
	ORA	A
	JNZ	SCO7	; JE ESC. SEKVENCE
	MOV	A,C	; ANALYZA ZNAKU
	CPI	ESC
	JZ	SCO6	; ZACINA ESC. SEKV.
	CPI	HOME
	JZ	SCO1
	CPI	LF
	JZ	SCO3
	CPI	VT
	JZ	SCO3
	CPI	CR
	JZ	SCO2
	CPI	HT
	JZ	SCO4
	CPI	BS
	JNZ	SCO5
	LDA	COLUM	; "BS"
	ORA	A
	JZ	SERO@
	DCR	A
	JMP	SCO21
SCO1:	XRA	A	; "HOME"
	STA	LINE
SCO2:	XRA	A	; "CR"
SCO21:	STA	COLUM
	JMP	SERO@
SCO3:	LDA	LINE	; "LF" A "VT"
	CPI	TLINE	; POCET RADKU
	JZ	SERO@
	INR	A
	STA	LINE
	JMP	SERO@
SCO4:	PUSH	B	; "HT"
	LDA	COLUM
SCO41:	INR	A
	CPI	TCOLUM	; POCET SLOUPCU
	JZ	SCO42
	MOV	B,A
	ANI	7
	MOV	A,B
	JNZ	SCO41
	JMP	SCO43	; TABELACNI POZICE
SCO42:	DCR	A	; POSLEDNI SLOUPEC
SCO43:	POP	B
	JMP	SCO21
SCO5:	MOV	A,C
	CPI	20H
	JNC	SERO@	; PRO RIDICI ZNAK
	LDA	COLUM
	CPI	TCOLUM-1 ; POCET SLOUPCU
	JZ	SERO@
	INR	A
	JMP	SCO21
SCO6:	STA	SEKV	; NASTAVENI ESC. SEKV.
	JMP	SERO@
SCO7:	PUSH	H	; ESC. SEKVENCE
	LDA	SEKV
	RLC
	JC	SCO8	; PRO 3.BYTE
	ORI	80H
	LXI	H,LINE
	JMP	SCO9
SCO8:	XRA	A	; KONEC SEKVENCE
	LXI	H,COLUM
SCO9:	STA	SEKV
	MOV	A,C
	SUI	20H
	JC	SCO10	; NENI ADRESACE KURZORU
	MOV	M,A
SCO10:	POP	H
	JMP	SERO@


@E@KOS	EQU	$

;
;*********************************************
;   ROZDELENI   S Y S T E M O V E    R A M
;*********************************************
;
RST1	EQU	@R@	; RESTART VEKTORY
;........>>>
;......
;<<... UZIVATELSKY & MONITOR. ZASOBNIK


;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	.PHASE	@R@+6DH
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; MONITOR DATA
;
MSTAK:	DS	2
ACSAV:	DS	2
BCSAV:	DS	2
DESAV:	DS	2
HLSAV:	DS	2
PCSAV:	DS	2
SPSAV:	DS	2
;
BRAD:	DS	2
INSTR:	DS	1
BRAD2:	DS	2
INST2:	DS	1
CADR:	DS	2	; KURZOR ADR.
;-------------------------
WMKOD:	DS	14	; KOD PRO KURZORY
PREV:	DS	21	; PREVODNI KODY..0
;-------------------------
;	USER I/O DEVICE
;
CILOC:	DS	3	; 0
COLOC:	DS	3	; 1
R1LOC:	DS	3	; 2
R2LOC:	DS	3	; 3
P1LOC:	DS	3	; 4
P2LOC:	DS	3	; 5
LILOC:	DS	3	; 6
CSLOC:	DS	3	; 7
	DS	1
MEMTOP:	DS	2	; 8
ERRSW:	DS	3	; 9
CI@0:	DS	3	; 10
CO@:	DS	3	; 11
CSTS@:	DS	3	; 12
LO@:	DS	3	; 13
KOS@:	DS	3	; 14
RI@:	DS	3	; 15
PO@:	DS	3	; 16
CCPM:	DS	3	; 17
GRAF:	DS	3
RESER:	DS	3
IONUM	EQU ($-CILOC)/3+1
;
IOBYT:	DS	1	; RIZENI I/O ZARIZENI
;
;******************************
;<< EXTERNE OVLADANE FLAGY: >>
;******************************
MODE:	DS	1	; CO-MODE
@IF1:	DS	1
@IF2:	DS	1
@OF1:	DS	1
@OF2:	DS	1
LINE:	DS	1	; RADEK
COLUM:	DS	1	; SLOUPEC
RESL:	DS	1	; RESERVACE
RESC:	DS	1	; SLOUPEC
RESL1:	DS	1	; POSLEDNI RADEK
RESC1:	DS	1	; POSLEDNI SLOUPEC
PRER:	DS	1	; UROVEN PRERUSENI
;
; PROMENNE PRO OPERACNI SYSTEM
;
CUR@:	DS	1
KEY:	DS	1
CAS:	DS	1

WNDP:	DS	6	; PARAMETRY PRO 2.OKNO
EXSER	EQU	$-MODE	; KONEC SLUZEB
;
CHAR:	DS	1
XFLG:	DS	1
;
;**********************************
; DATA SPOLECNA PRO MONITOR A O.S.
;**********************************
;
@BT:	DS	1
@PED:	DS	1
SADR:	DS	2	; START ADR
EADR:	DS	2	; END ADR
SUM:	DS	1
EXTEXT:	DS	1
OPT:	DS	1
NAMBUF:	DS	65
;
;""""""""""""""""""""""""""""""""""
; PROMENNE PRO O.S.
FNAME:	DS	12	; JMENO SOUBORU
BNO:	DS	1	; CISLO BLOKU
BTO:	DS	1	; CISLO SOUBORU
BNI:	DS	1	;
BTI:	DS	1	; INPUT
ADRO:	DS	2	; ADR OUTPUT
ADRI:	DS	2	; ADR INPUT
FND:	DS	1	; FIND/READ

;**********************************
;  I/O BUFFER PRO KOS
;**********************************
	DS	1	; TYP BLOKU
BOUT:
BIN:	DS	LENGHT	; DATA
BIEND	EQU	$
BOEND	EQU	$
WRNM:	DS	11	; JMENO SOUBORU
READNM:	DS	22	; BUFFER PRO ZOBRAZENI
POSICE:	DS	2	; ZOBRAZENI BLOKU
MOD@:	DS	1
;
TSP:	DS	1	; PRO SP-210
JEDE?:	DS	1	;   - " -
;
DEBL:	DS	1	; DELKA BLOKU
JEVER:	DS	1	; 0 - NENI VERIFIKACE
;
SEKV:	DS	1	; 0 - NENI ESCAPE SEKV.
TSM:	DS	1	; 0 - JE TERMINAL
;
	.DEPHASE
;
	END	;

ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt


SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | PP01 | PETR | PLAN-80A | IQ151 | TNS


ZPS | Technické prostředky | Programové vybavení | Dokumentace


8 bity / SAPI-1 / Programové vybavení / V5.0 / ASM MIKOS/K



SAPI.cz - web o československých osmibitech, zejména SAPI-1. Provozuje EC1045 od roku 2011
Za korekce češtiny dekuji: MELSOFTovi, Silliconovi, Martinu Lukáškovi a NOSTALCOMPovi

Když začínám blbnout z 8bitů tak se chodím léčit mezi otaku.
Animefest.cz