TITLE    VOKABEL - Ein-Ausgabe Datei VOKTEST.DAT
.Z80
;*************************************************************
;*      Hobby, Z80/Z180
;*      einfache Programmierung
;*      Lernen Z80 Maschinensprache
;*************************************************************
;*      Kurt Pieper, Germany [Europa]
;*      Version 15.09.2020
;*      Update  17.09.2020
;*************************************************************
;*      Wahlfrei beschreiben und lesen
;       SC24a CPU
;*      Compiler: z80asm vokabel
;*************************************************************
; 
; Die Benutung des Programmes erfolgt auf eigene Gefahr.
;
; Konstanten: CPM Funktionen
bdos	      equ	05h
rdcha	      equ	01h
wrcha	      equ	02h
type	      equ	09h
rdbuf	      equ	0Ah
open	      equ	0Fh
close	      equ	10h
search	      equ	11h
read	      equ	14h
write	      equ	15h
make	      equ	16h
setdma	      equ	1Ah
randrd	      equ	21h
randwr	      equ	22h
board_x       equ       25h
board_y       equ       06h
one           equ       31h
two           equ       32h
three         equ       33h

;
;
	      ORG	0100h
        ;
	;***** init: lokalen Stapel anlegen 
	      LD	HL,0
	      ADD	HL,sp
	      LD	(oldstk),HL
	      LD	sp,oldstk
	;
	;***** Datei: VOKTEST.DAT
	      LD	DE,dma
	      LD	C,setdma
	      CALL	bdos
	      LD	DE,efcb
	      LD	C,search
	      CALL	bdos
	      INC	A
	      jp        nz,found
	;
	;'**** Datei: VOKTEST.DAT nicht gefunden
	;
	      LD	DE,efcb
	      LD	C,make
	      CALL	bdos
	      INC	A
	      jp        z,full
	      JP	menu0
	;
	;***** Datei:VOKTEST.DAT schon vorhanden
found:	      LD	DE,efcb
	      LD	C,open
	      CALL	bdos
	      INC	A
	      jp        z,nodat
	;
	;***** Datei mit neue Daten fuellen bzw fortsetzen
menu0:        LD        DE,help1
              JP        menu1
menue:	      LD	DE,help
menu1:	      LD	C,type
	      CALL	bdos
	      LD	C,rdcha
	      CALL	bdos
	      PUSH	AF
	      LD	DE,crlf
	      LD	C,type
	      CALL	bdos
	      POP	AF
;
	      ;SUB	A,'1'
	      ;jp       z,lesen
	      ;DEC	A
	      ;jp       z,schreib
	      ;DEC	A
	      ;jp       nz,menue
;
              cp        one               ; A =  ? Taste 1
              jp        z,lesen           ; Vokabel lesen
              cp        two               ; war Taste 2
              jp        z,schreib         ; Vokabel erfassen + speichern
              cp        three
              jp        z,fin
              cp        'h'
              jp        z,menu0           ; hilfe          
              cp        '#'
              jp        z,fin
              cp        'Q'               ; Ende
              jp        z,fin
              cp        'q'               ; ende
              jp        z,fin
              jp        menue              
;
	;
	;***** Datei schliessen
fin:	      LD	DE,efcb
	      LD	C,close
	      CALL	bdos
	      INC	A
	      jp        z,nodat
	;
	;***** korrekte Programmbeendigung
	      LD	DE,mess1
	      JP	mess
	;
	;***** Fehler 1: Datei nicht gefunden
nodat:	      LD	DE,mess2
	      JP	mess
	;
	;***** Fehler 2:Diskette oder Direktory voll
full:	      LD	DE,mess3
mess:	      LD	C,type
	      CALL	bdos
	;
	;***** Programm beenden
	      LD	HL,(oldstk)
	      LD	SP,HL
	      RET	
	;
	;***** Texte fuer Hauptschleife
help1:	      DEFB      1BH, '[2J'                    ; loesche Bildschirm
help:         DEFB      1BH, '[','1',';','1','H'      ; gotoxy
              DEFB      1BH, '[7m'                    ; revers
              DEFB      '                            '
              DEFB      'A U S W A H L M E N U E'
              DEFB      '                             '
              DEFB      1BH, '[0m'                    ; normal
              DEFB      1BH, '[','6',';','30','H'
	      DEFB	'1: Vokabel lesen    ' ;,13,10
              DEFB      1BH, '[','8',';','30','H'
	      DEFB	'2: Vokabel schreiben'; ,13,10
              DEFB      1BH, '[','10',';','30','H'
	      DEFB	'3: Programmende';,13,10
              ;DEFB      1BH, '[','14',';','30','H'
              ;DEFB      '-----------------------'
              DEFB      1BH, '[','12',';','30','H'
	      DEFB	'Bitte waehlen Sie: $' 
              DEFB      '$'
;
mess1:	      DEFB      1BH, '[','16',';','30','H'
              DEFB      'VOKTEST.DAT geschlossen !'
              DEFB      1BH, '[s'
              DEFB      1BH, '[J'
              DEFB      1BH, '[u'
              DEFB      13,10,'$'
mess2:	      DEFB	'***** Fehler: Datei nicht gefunden',13,10
	      DEFB	'Achtung: duerfte nicht auftreten.$ ',13,10
mess3:	      DEFB	'***** Fehler: Diskette oder Verzeichnis voll'
	      DEFB	13,10,'$'
	;
	;***** Im Programm verwendeter Dateischreiber
efcb:	      DEFB	0
              DEFB      'VOKTEST DAT'   ; Daten fuer Programm VOKABEL.COM
efcbex:	      DEFB	0
	      DEFB	0      	 
efcbs2:	      DEFB	0
	      DEFS	17
efcbcr:	      DEFB	0	      ; 1, benoetigter Record im Element
rand:	      DEFB	0,0,0
	;
	;***** Prg benuzter Zwischenspeicher
puffer:	      DEFB	128                ; 128
	      DS	1
dma:	      DS	128                ; 128
	      DS	64                 ; 64
oldstk:	      DS	2
	;
	;***** wahlfreien Record lesen
lesen:	      CALL	inpnr
	      CALL	diskin
	      jp        c,menue
	      LD	DE,ergmes
	      LD	C,type
	      CALL	bdos
	;(Record ausgeben)
	      LD	HL,dma	
	      LD	B,80h
nxtcha:	      LD	A,(HL)
	      INC	HL
	      AND	7fh
	      CP	7fh
	      jp        z,steuer
	      CP	20h
	      jp        nc,keinst
steuer:	      LD	A,' '                ;oder 2eh Punkt
keinst:	      LD	E,A
	      PUSH	BC
	      PUSH	HL
	      LD	C,wrcha
	      CALL	bdos
	      POP	HL
	      POP	BC
	      DEC	B
	      jp        nz,nxtcha
	      JP	menue
	;
	;***** wahlfreien Record schreiben
schreib:      CALL	inpnr
	      PUSH	HL
	      LD	DE,getmes
	      LD	C,type
	      CALL	bdos
	      LD	DE,puffer
	      LD	C,rdbuf
	      CALL	bdos
	      LD	A,(puffer+1)	  ;siehe puffer: 3A1B03
	      LD	E,A
	      LD	D,0
	      LD	HL,dma
	      ADD	HL,DE
	      LD	A,80h
	      SUB	A,E
	      jp        z,clend
	      LD	B,A
	      XOR	A
clear:	      LD	(HL),A
	      INC	HL
	      DEC	B
	      jp        nz,clear
clend:	      POP	HL
	      CALL	diskot
	      JP	menue
	;
	;***** dezimale Zahl von der Tastatur einlesen
inpnr:	      LD	DE,gibnum
	      LD	C,type
	      CALL	bdos
	      LD	HL,0
ziff:	      PUSH	HL
	      LD	C,rdcha
	      CALL	bdos
	      POP	HL
	      SUB	A,'0'
	      CP	0ah
	      jp        nc,endzah
	      ADD	HL,HL
	      LD	D,H
	      LD	E,L
	      ADD	HL,HL
	      ADD	HL,HL
	      ADD	HL,DE
	      LD	E,A
	      LD	D,0
	      ADD	HL,DE
	      JP	ziff
endzah:	      PUSH	HL
	      LD	DE,crlf
	      LD	C,type
	      CALL	bdos
	      POP	HL
	      RET	
	; ****  Meldungen bei Ein- und Ausgabe
crlf:	      DEFB	13,10,'$'
gibnum:       DEFB      1BH, '[','16',';','1','H'
              DEFB      1BH, '[J'                     ; loesche ab Cursor
gibnum1:      DEFB      1BH, '[','16',';','30','H'
              DEFB      'Satznummer eingeben: '
              DEFB      1BH, '[s'                     ; save Cursorposition
              DEFB      1BH, '[J'
              DEFB      1BH, '[u'                     ; restore Cursorpos.
              DEFB      '$'
ergmes:	      DEFB      1BH, '[','15',';','30','H'
              DEFB      1BH, '[0K'                    ; loesche ab Curs. Zeile 
              DEFB      1BH, '[','16',';','30','H'
              DEFB      'Datensatz gelesen: '
              DEFB      1BH, '[','17',';','30','H'
              DEFB      '$'
getmes:	      DEFB      1BH, '[','16',';','30','H'
              DEFB      'Text eingeben: '
              DEFB      1BH, '[s'
	      DEFB	1BH, '[J'
              DEFB      1BH, '[u'
              DEFB      '$'
	;
	;***** durch Register hl adressierten Record auf Diskette
diskot:	      LD	C,randwr
	      JP	diskrw
	;
	;***** durch Register hl adressierten Record lesen
diskin:	      LD	C,randrd
diskrw:	      LD	(rand),HL
	      LD	DE,efcb
	      CALL	bdos
	      AND	A
	      ret     z
	;
	;***** Fehler beim Schreiben/Lesen aufgetreten
	      LD	DE,errmsg
	      LD	C,type
	      CALL	bdos
	      SCF	
	      RET	
	;
	;*****  Fehlermeldung
errmsg:	      DEFB      1BH, '[','17',';','30','H'
              DEFB	'*** Keine Daten ! ***$'
        ;
       ;***** Fehler beim Schreiben/Lesen aufgetreten
              LD        DE,loemsg
              LD        C,type
              CALL      bdos
              RET
        ;*****  Meldug loeschen
loemsg:       DEFB      1BH, '[','17',';','30','H'
              DEFB      '                                                   '
              DEFB      '$' 
        ;
;
datum:        DEFB     '17.09.20 $'   
;
	END
