TITLE    VOKENGL - Ein-Ausgabe Datei english.dat
.Z80
;*************************************************************
;*      Hobby, Z80/Z180
;*      einfache Programmierung
;*      Lernen Z80 Maschinensprache
;*************************************************************
;*      Kurt Pieper, Germany [Europa]
;*      Version 15.09.2020
;*      Update  18.01.2023
;*************************************************************
;*      Wahlfrei beschreiben und lesen
;       Z80 CPU
;*      Compiler: z80asm vokengl
;*************************************************************
; 
; 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
;
;
	      ORG	0100h
        ;
	;***** init: lokalen Stapel anlegen 
	      LD	HL,0
	      ADD	HL,sp
	      LD	(oldstk),HL
	      LD	sp,oldstk
	;
	;***** Datei: ENGLISH.DAT
	      LD	DE,dma
	      LD	C,setdma
	      CALL	bdos
	      LD	DE,efcb
	      LD	C,search
	      CALL	bdos
	      INC	A
	      jp        nz,found
	;
	;'**** Datei: ENGLISH.DAT nicht gefunden
	;
	      LD	DE,efcb
	      LD	C,make
	      CALL	bdos
	      INC	A
	      jp        z,full
	      JP	menu0
	;
	;***** Datei:ENGLISH.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
	;
	;***** Datei schliessen
	      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	
        ;
        ; Unterprogramme 
GOTOXY:       LD        C,02H
              LD        E,1BH
              CALL      BDOS
              LD        C,02H
              LD        E,'['
              CALL      BDOS

              LD        A,(YPOS)
              CP        10H
              JP        C,L2

              RRA
              RRA
              RRA
              RRA
              AND       0FH
              ADD       A,'0'

              LD        C,02H
              LD        E,A
              CALL      BDOS

              LD        A,(YPOS)

L2:           AND       0FH
              ADD       A,'0'

              LD        C,02H
              LD        E,A
              CALL      BDOS

              LD        C,02H
              LD        E,3BH
              CALL      BDOS

              LD        A,(XPOS)
              CP        10H
              JP        C,L3

              RRA
              RRA
              RRA
              RRA
              AND       0FH
              ADD       A,'0'

              LD        C,02H
              LD        E,A
              CALL      BDOS

              LD        A,(XPOS)

L3:           AND       0FH
              ADD       A,'0'

              LD        C,02H
              LD        E,A
              CALL      BDOS

              LD        C,02H
              LD        E,'H'
              CALL      BDOS

              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      'Datei ?.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      'ENGLISH DTA'
             ;DEFB      'ENGLISH DAT'   ; Daten fuer Programm VOKENGL.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      '$' 
        ;
;
strich:       DEFB '-------------------------------------------------------$'
;
datum:        DEFB     '17.01.23 $'   
version:      DEFB     'V 0.1 '  
xpos:         DEFB     0
ypos:         DEFB     0
;
	END
