	PAGE 70
	.comment #

	RCVPDP.MAC

empfaengt Files ueber die SIO-A von der PDP-11 (Programm XFER, U.Ranft),
speichert sie zunaechst im Hauptspeicher zwischen und legt sie (ggf. 
zwischendurch, sonst anschliessend) auf Diskette ab.

Es koennen ASCII-Files (max.Recordlaenge 80) oder sog. Binaer-Files (feste 
Recordlaenge 256) empfangen werden. ASCII-Records werden sofort um angehaengte
Blanks beschnitten, ansonsten unveraendert uebernommen. Binaer-Files 
enthalten Bild-Grauwerte von 0 bis 255, die durch je zwei ASCII-Zeichen 
codiert sind:
	1.Zeichen:  "Zehner" (A = 0, B = 10, C = 20, usw.)
	2.Zeichen:  "Einer"  (0 = 0, 1 = 1, usw.)
Der Wertebereich des Codes ist also A0...Y5. 
Die Daten werden in 8 Bit-Werte zurueck-decodiert und ohne CR/LF sequentiell
abgelegt. Den Bilddaten wird interaktiv ein Header von 256 Bytes vorangestellt
mit:
- dem Bildnamen (max. 8 Zeichen, entspricht dem Dateinamen ohne Kennung .PIC)
- dem Bildformat (x,y-Laenge, je 2Byte-Integer, z.B. 256x256, 512x512 o.a.)
- einem beliebigen ASCII-Kommentar (max. 244 Zeichen)

Zum Transfer muessen die Datenleitungen des Verbindungskabels "verdreht" sein.
Folgendes Handshaking wird benutzt (aus der Sicht des ELZET80):

- Empfangen von Records variabler Laenge (bis CR)
  1. Warten auf das erste CR
  2. <6 bel.Zeichen> Ctrl-R Ctrl-R <6 bel.Zeichen> senden
  3. Record beliebiger Laenge bis CR empfangen und weiter bei 2.
     bzw. Ctrl-T Ctrl-T fuer Transfer-Ende empfangen

Der Empfang kann durch Tastendruck abgebrochen werden.
#
	.Z80
	ENTRY RCVPDP

RCVPDP:	JP START

;--------------- Konstanten und Variablen ---------

LF	EQU 0AH		;LINE FEED
EOL	EQU 0DH		;CR = END OF LINE-CHARACTER
ACK	EQU 12H		;CTRL/R = ACKNOWLEDGE-CHARACTER
EOT	EQU 14H		;CTRL/T = END OF TRANSFER-CHARACTER
EOF	EQU 1AH		;END OF FILE MARKER
BDOS	EQU 5		;BDOS EINSPRUNG
FBASE	EQU 6		;FDOS BASIS ADRESSE
SIOC	EQU 6		;SIO-A CONTROL PORT
SIOD	EQU 4		;SIO-A DATA PORT

SIOREG:	DB 11011000B	;RESET
	DB 1,00000000B	;NO INTERRUPTS
	DB 3,11000001B	;RCV 8 BIT/CHAR 
	DB 4,11001100B	;x64 CLOCK, 2 STOP BIT
	DB 5,01101000B	; NO DTR, TSM 8 BIT/CHAR, TRANSMIT ENABLE, NO RTS
SIOLEN	EQU $-SIOREG

DRIVE:	DB 0		;OUTPUT DISK DRIVE
BINFLG:	DB 0		;BINAER FILE FLAG
OPNFLG:	DB 0		;FILE OPEN FLAG

BUFANF:	DW 0		;BUFFER-ANFANG
BUFEND:	DW 0		;BUFFER-ENDE
DATEND:	DW 0		;DATA ENDE

RCNT:	DW 0		;RECORD COUNT

TOGGLE:	DB 0		;ZUR DECODIERUNG
ZEHNER:	DB 0		;VON BINAER-FILES

INPBUF:	DB 12		;INPUT BUFFER
	DB 0		;TATSAECHL.LAENGE
	DS 12		;12 ZEICHEN

STRING:	DW 0		;OUTPUT STRING
	DW 0		;5 ZEICHEN
	DB 0
	DB '$'

CRLF:	DB 0DH,0AH,'$'

ACKSTR:	DB 0DH,0AH,20H,20H,20H,20H
	DB ACK,ACK
	DB 0DH,0AH,20H,20H,20H,20H

FCB:	DS 33		;FILE CONTROL BLOCK
FCBLEN	EQU $-FCB

;--------------- Ausgabe-Strings ------------------

HEADER:	DB 0CH
	DB 'RCVPDP - Version 3.0   28.10.85   (c) A.Herrmann'
	DB '$'

SIOMSG: DB 0DH,0AH
	DB 'SIO-A (Ports 04/06) 9600 Bd, '
	DB '8 Bits/Char, 2 Stop Bits, No Parity, No DTR, No RTS'
	DB '$'

BUFMSG:	DB 0DH,0AH,0AH
	DB 'Buffer Laenge = '
	DB '$'

EQUMSG:	DB ' = '
	DB '$'

KBYMSG:	DB ' KByte'
	DB '$'

DRVMSG:	DB 0DH,0AH,0AH
	DB 'Files auf Drive ? (A/B/C)  '
	DB '$'

BINMSG:	DB 0DH,0AH,0AH
	DB 'File-Typ ASCII/Binaer ? (A/B)  '
	DB '$'

ENTMSG:	DB 0DH,0AH,0AH
	DB 'File-Name ? (filename.ext / RETURN=Ende)  '
	DB '$'

DIMMSG:	DB 0DH,0AH
	DB 'Bilddimensionen'
	DB 0DH,0AH
	DB ' 64 = 0'
	DB 0DH,0AH
	DB '128 = 1'
	DB 0DH,0AH
	DB '256 = 2'
	DB 0DH,0AH
	DB '512 = 5   '
	DB '$'

DIXMSG:	DB 0DH,0AH
	DB 'x-Dim. = '
	DB '$'

DIYMSG:	DB 0DH,0AH
	DB 'y-Dim. = '
	DB '$'

CMTMSG:	DB 0DH,0AH
	DB 'Bildkommentar (max. 244 Zeichen)'
	DB 0DH,0AH
	DB '$'

DATMSG:	DB 'Bin auf Empfang...  '
	DB '$'

RECMSG:	DB '.Record'
	DB 0DH
	DB '$'

LENMSG:	DB 0DH,0AH
	DB 'Daten-Laenge = '
	DB '$'

DSKMSG:	DB 'File auf Disk'
	DB '$'

EMPMSG:	DB 'File leer - nicht auf Disk geschrieben'
	DB '$'

ERRMSG:	DB 0DH,0AH,0AH
	DB '*** Disk Schreib-Fehler ***'
	DB '$'

SERMSG:	DB 0DH,0AH,0AH
	DB '*** SIO-A Empfangs-Fehler ***'
	DB 0DH,0AH
	DB '$'

ABOMSG:	DB 0DH,0AH,0AH
	DB '*** Programm-Abbruch ***'
	DB '$'

RSTMSG:	DB 0DH,0AH,0AH
	DB 'Restart ? (Y/N)  '
	DB '$'

;--------------- PROGRAMM-ANFANG ------------------
		
START:	LD DE,HEADER	;MELDUNG
	CALL PRINT

	LD HL,SIOREG	;SIO-A INIT.
	LD B,SIOLEN
	LD C,SIOC
	OTIR
	LD DE,SIOMSG
	CALL PRINT

	LD HL,PRGEND	;BUFFER-ANFANG BESTIMMEN
	LD L,0
	INC H
	LD (BUFANF),HL
	EX DE,HL

	LD HL,(FBASE)	;BUFFER-ENDE = FDOS-ANFANG
	DEC H		;MINUS "AUSLAUF-ZONE" VON 512 BYTES
	LD (BUFEND),HL	;BUFFER LAENGE BERECHNEN
	SCF
	SBC HL,DE
	PUSH HL
	CALL CONVRT	;HL-WERT NACH STRING KONVERTIEREN
	LD DE,BUFMSG
	CALL PRINT	;UND AUSGEBEN
	LD DE,STRING
	CALL PRINT
	LD DE,EQUMSG
	CALL PRINT	;AUCH IN K BYTE
	POP HL
	CALL KBYTE
	LD DE,STRING
	CALL PRINT
	LD DE,KBYMSG
	CALL PRINT
	LD DE,CRLF
	CALL PRINT

DRSPEZ:	LD DE,DRVMSG	;DRIVE SPEZ.
	CALL PRINT
	CALL INPUT
	SUB 40H
	JR C,DRSPEZ
	CP 4
	JR NC,DRSPEZ
	LD (DRIVE),A

FTSPEZ:	LD DE,BINMSG	;FILE-TYP SPEZ.
	CALL PRINT
	CALL INPUT
	SUB 41H
	JR C,FTSPEZ
	CP 2
	JR NC,FTSPEZ
	LD (BINFLG),A

;--------------- MAIN LOOP ------------------------

MLOOP:	LD B,FCBLEN	;NAECHSTEN FILE EMPFANGEN
	LD HL,FCB	;FILE CONTROL BLOCK INIT.
	XOR A
	LD (OPNFLG),A
FLOOP:	LD (HL),A
	INC HL
	DJNZ FLOOP

	LD A,(DRIVE)	;DRIVE IN FCB
	LD (FCB),A

;------ FILE NAME EINGEBEN ---------

FILNAM:	LD DE,ENTMSG	;VON CONSOLE
	CALL PRINT
	LD C,10
	LD DE,INPBUF
	CALL BDOS

	LD A,(INPBUF+1)	;STRING LAENGE
	OR A
	JP Z,RESTRT	;=0 ?

	LD HL,FCB+1	;NAME IN FCB MIT
	LD A,' '	;BLANKS INIT.
	LD B,11
BLOOP:	LD (HL),A
	INC HL
	DJNZ BLOOP

	LD A,(INPBUF+1)	;NAME IN FCB KOPIEREN
	LD C,A
	LD B,0
	LD HL,INPBUF+2
	LD DE,FCB+1
SLOOP:	LD A,'.'	;BIS PUNKT
	CP (HL)
	JR Z,FILEXT
	LD A,(HL)	;ZEICHEN IN A
	CALL CAPIT	;ZU GROSS-BUCHSTABEN MACHEN
	LD (HL),A
	LDI
	LD A,C
	OR A
	JR NZ,SLOOP
	JP RCVDAT

FILEXT:	LD DE,FCB+9	;FILE EXTENSION
	INC HL
	DEC C
XLOOP:	LD A,C
	OR A
	JP Z,RCVDAT
	LD A,(HL)
	CALL CAPIT
	LD (HL),A
	LDI
	JR XLOOP

;--------------- EMPFANG DES FILES -------------

RCVDAT:	LD HL,0		;RECORD COUNT INIT.
	LD (RCNT),HL
	LD HL,(BUFANF)	;POINTER AUF BUFFER-ANFANG

	LD A,(BINFLG)	;HEADER FUER BINAER-FILE
	OR A
	JP Z,RCVDA1

	XOR A		;FILENAME KOPIEREN
	LD B,A
	LD C,8
	LD DE,FCB+1
	EX DE,HL
	LDIR
	EX DE,HL

	LD DE,DIMMSG	;BILDDIMENSIONEN EINGEBEN
	CALL PRINT
DIMX:	LD DE,DIXMSG
	CALL PRINT
	CALL INPUT	;X-DIM.
	CALL DCDDIM	;DIM.-ZIFFERN DECODIEREN UND ABSPEICHERN
	JR NZ,DIMX	;ERROR, D.H. NOCHMAL?

DIMY:	LD DE,DIYMSG
	CALL PRINT
	CALL INPUT
	CALL DCDDIM
	JR NZ,DIMY

	LD DE,CMTMSG	;KOMMENTAR EINGEBEN
	CALL PRINT
	DEC HL
	LD D,(HL)
	DEC HL
	LD E,(HL)
	PUSH DE		;Y-DIM. RETTEN, WEIL HIER
	LD A,244
	LD (HL),A
	PUSH HL		;EINGABE-ANFANG 
	EX DE,HL
	LD C,10		;BDOS FUNKTION CONSOLPUFFER LESEN
	CALL BDOS
	POP HL
	POP DE
	LD (HL),E
	INC HL
	LD C,(HL)	;TATSAECHL.LAENGE DER EINGABE
	LD B,0
	LD (HL),D	;Y-DIM.RESTAURIERT
	INC HL
	ADD HL,BC	;HL HINTER DIE EINGABE
BLLOOP:	LD A,L		;REST MIT BLANKS AUFFUELLEN
	OR A
	JP Z,RCVDA1
	LD (HL),20H
	INC HL
	JR BLLOOP

;------ SUBROUTINE ------------
DCDDIM:	LD D,0
	LD E,64
	SUB 30H
	JR Z,STODIM
DIM128:	LD E,128
	SUB 1
	JR Z,STODIM
DIM256:	LD D,1
	LD E,0
	SUB 1
	JR Z,STODIM
DIM512:	INC D
	SUB 3
	JR Z,STODIM
	RET		;A<>0 RETURN MIT ERROR
STODIM: LD (HL),E
	INC HL
	LD (HL),D
	INC HL
	RET		;A=0 RETURN OHNE ERROR
;------ SUBROUTINE ENDE -----------

RCVDA1:	LD DE,CRLF
	CALL PRINT
	LD DE,DATMSG	;DATEN EMPFANGEN
	CALL PRINT

CLOOP:	IN A,(SIOC)	;SIO RECEIVE BUFFER LEEREN
	AND 1
	JR Z,ALOOP

	IN A,(SIOD)
	JR CLOOP

ALOOP:	IN A,(SIOC)	;WARTEN AUF ERSTES CR
	AND 1
	JR NZ,GETCR
	
	CALL KEYHIT	;KEY HIT AUF CONSOLE?
	JP NZ,ABORT
	JP ALOOP

GETCR:	IN A,(SIOD)	;ZEICHEN
	CP EOL		;= CR?
	JR NZ,ALOOP

	LD DE,CRLF
	CALL PRINT

;--------------- NAECHSTE ZEILE ---------------

RCVLN:	PUSH HL		;ACKNOWLEDGE SENDEN
	LD B,14
	LD HL,ACKSTR
RCVLN1:	IN A,(SIOC)	;OUTPUT BUFFER LEER?
	AND 4
	JR Z,RCVLN1
	LD A,(HL)
	INC HL
	OUT (SIOD),A
	PUSH BC
	CALL KEYHIT
	POP BC
	JP NZ,ABORT
	DJNZ RCVLN1
	POP HL

	XOR A
	LD (TOGGLE),A	;INIT.FUER BINAER-DECODIERUNG

DLOOP:	IN A,(SIOC)	;ZEICHEN DA?
	AND 1
	JR NZ,GETDCH
	
;	LD A,1		;CHECK READ REG.1
;	OUT (SIOC),A	;FOR ERRORS
;	IN A,(SIOC)
;	AND 70H
;	JP NZ,SERROR

	CALL KEYHIT
	JP NZ,READY
	JP DLOOP

SERROR:	PUSH HL
	LD DE,SERMSG	;SIO ERROR
	CALL PRINT
	POP HL
	LD A,30H	;SIO ERROR RESET
	OUT (SIOC),A

GETDCH:	IN A,(SIOD)	;ZEICHEN

	CP EOT		;EXIT, FALLS END OF TRANSFER
	JP Z,READY

	CP EOL		;END OF LINE ?
	JP Z,NEWLN

	LD B,A		;BINAER-DATEN ZU DECODIEREN?
	LD A,(BINFLG)
	OR A
	LD A,B
	JP Z,STODCH

	LD A,(TOGGLE)	;ERSTES ODER ZWEITES BYTE?
	OR A
	JR NZ,DCODE2
	INC A
	LD (TOGGLE),A
	LD A,B
	SUB 41H
	SLA A		;A*10 = A*8 + A*2
	LD B,A
	SLA A
	SLA A
	ADD A,B
	LD (ZEHNER),A
	JP DLOOP

DCODE2:	XOR A
	LD (TOGGLE),A
	LD A,B
	SUB 30H
	LD B,A
	LD A,(ZEHNER)
	ADD A,B

STODCH:	LD (HL),A	;UEBERNEHMEN
	INC HL		;UND ABLEGEN
	JP DLOOP

NEWLN:	LD A,(BINFLG)	;FALLS FILE-TYP=ASCII,
	OR A
	JP NZ,NEWLN2

	LD A,20H	;ANGEHAENGTE BLANKS ELIMINIEREN.
NEWLN1:	DEC HL
	CP (HL)
	JR Z,NEWLN1
	INC HL
	LD A,EOL
	LD (HL),A
	INC HL
	LD A,LF		;LINE FEED
	LD (HL),A	;ANHAENGEN
	INC HL		;UND ABLEGEN

NEWLN2:	PUSH HL
	LD HL,(RCNT)	;RECORD COUNTER INKR.
	INC HL
	LD (RCNT),HL
	CALL CONVRT	;UND AUSGEBEN
	LD DE,STRING
	CALL PRINT
	LD DE,RECMSG
	CALL PRINT
	POP HL

	CALL KEYHIT	;KEY HIT AUF CONSOLE?
	JP NZ,READY

	EX DE,HL	;BUFFER-ENDE ERREICHT?
	LD HL,(BUFEND)
	SCF
	SBC HL,DE
	EX DE,HL
	CALL C,BUFULL
	JP RCVLN	;NAECHSTE ZEILE

;------- Buffer voll - auf Diskette schreiben -------

BUFULL:	PUSH HL
	LD (DATEND),HL
	LD HL,(BUFEND)
	CALL DSKWRT
	POP HL		;RESTLICHE BYTES 
	LD DE,(BUFEND)
	XOR A
	SBC HL,DE
	LD B,H
	LD C,L
	LD DE,(BUFANF)	;AN BUFFER-ANFANG SCHIEBEN
	LD HL,(BUFEND)
	LDIR
	EX DE,HL
	RET

;--------------- File ablegen --------------------

READY:	XOR A		;REST BIS ..FF
	SUB L		;MIT EOF-CHAR AUFFUELLEN
	JR Z,OKAY
	LD B,A
	LD A,EOF
FILOOP:	LD (HL),A
	INC HL
	DJNZ FILOOP

OKAY:	LD (DATEND),HL	;FILE IST EMPFANGEN
	CALL DSKWRT	;FILE SCHREIBEN
	LD C,16		;FILE SCHLIESSEN
	LD DE,FCB
	CALL BDOS
	CP 0FFH
	JP Z,DSKERR
	
	LD DE,DSKMSG	;FILE IST AUF DISK
	CALL PRINT
	JP MLOOP	;WEITER MIT NAECHSTEM FILE

;------ File(-Stueck) auf Diskette schreiben -----

DSKWRT:	LD DE,(BUFANF)
	XOR A
	SBC HL,DE	;LAENGE BERECHNEN
	PUSH AF
	PUSH HL
	CALL CONVRT	;UND IN STRING KONVERTIEREN
	LD DE,LENMSG
	CALL PRINT
	LD DE,STRING
	CALL PRINT
	LD DE,EQUMSG
	CALL PRINT	;AUCH IN K BYTE AUSDRUECKEN
	POP HL
	CALL KBYTE
	LD DE,STRING
	CALL PRINT
	LD DE,KBYMSG
	CALL PRINT
	LD DE,CRLF
	CALL PRINT

	POP AF
	JR NZ,NEMPTY	;LEERER FILE?
	LD DE,EMPMSG	;JA, WIRD NICHT
	CALL PRINT	;ABGELEGT
	RET

NEMPTY:	LD A,(OPNFLG)	;FILE SCHON OFFEN?
	OR A
	JP NZ,FICONT
	LD C,19		;FILE LOESCHEN
	LD DE,FCB
	CALL BDOS

	LD C,22		;FILE OEFFNEN
	LD DE,FCB
	CALL BDOS
	LD A,0FFH
	LD (OPNFLG),A	;OPEN FLAG SETZEN

FICONT:	LD DE,(BUFANF)	;ERSTE WRITE ADRESSE

WLOOP:	PUSH DE
	LD HL,128	;NEIN, 
	ADD HL,DE	;NAECHSTEN RECORD ANFANG BEST.
	EX DE,HL
	LD HL,(DATEND)	;WUERDE UEBER DATA ENDE HINWEG GESCHRIEBEN?
	XOR A
	SBC HL,DE
	POP DE
	RET C		;JA, RECORD NICHT SCHREIBEN.

	LD C,26		;NEIN,
	PUSH DE
	CALL BDOS	;SET DMA AUF DE
	LD DE,FCB
	LD C,21		;RECORD SCHREIBEN
	CALL BDOS
	POP DE
	OR A		;ERROR?
	JP NZ,DSKERR
	LD HL,128
	ADD HL,DE
	EX DE,HL
	JP WLOOP

;--------------- MAIN LOOP ENDE -------------------

DSKERR:	LD DE,ERRMSG	;DISK WRITE ERROR
	CALL PRINT

ABORT:	LD DE,ABOMSG	;PROGRAMM-ABBRUCH
	CALL PRINT
	LD C,1		;DUMMY-ZEICHEN LESEN
	CALL BDOS

RESTRT:	LD DE,RSTMSG	;RESTART?
	CALL PRINT
	CALL INPUT
	CP 'Y'
	JP Z,START
	CP 'N'
	JP Z,EXIT
	JR RESTRT

;--------------- SUBROUTINEN ----------------------

KEYHIT:	PUSH HL		;CONSOLE ABFRAGEN
	LD C,11
	LD E,0FFH
	CALL BDOS
	POP HL
	OR A
	RET

INPUT:	PUSH BC		;1 BUCHSTABEN VON CONSOLE
	PUSH DE
	PUSH HL
	LD C,1
	CALL BDOS
	POP HL
	POP DE
	POP BC
	RET

CAPIT:	CP 60H		;ZEICHEN IN A GGF.
	RET C		;ZU GROSSBUCHSTABEN MACHEN
	SUB 20H
	RET

PRINT:	PUSH HL		;STRING OUTPUT AUF CONSOLE
	LD C,9
	CALL BDOS
	POP HL
	RET

KBYTE:			;INTEGER IN HL IN K BYTE AUSDRUECKEN
	LD B,10		;D.H. DURCH 2^10 DIVIDIEREN
KBYTE1:	SRL L
	SRL H
	JR NC,KBYTE2
	SET 7,L
KBYTE2:	DJNZ KBYTE1
	CALL CONVRT	;UND NACH STRING KONVERTIEREN
	RET

CONVRT:	LD DE,STRING	;INTEGER IN HL 5-STELLIG
	LD BC,5		;NACH STRING KONVERTIEREN
	EX DE,HL
	ADD HL,BC
	DEC HL
	EX DE,HL
	LD B,C

	PUSH DE		;HL GROESSER GLEICH HEX A000 ?
	EX DE,HL
	LD HL,0A000H
	SCF
	SBC HL,DE
	JR NC,CONVR0

	EX DE,HL	;JA, ERSTMAL A000H = 40960 ABZIEHEN
	LD DE,0A000H
	CCF
	SBC HL,DE
	CALL DIV10	;UND DIE DIFFERENZ ALLEIN TEILEN
	POP DE
	CALL RCODE	;REST CODIEREN
	DEC B		;1 STELLE WENIGER
	PUSH DE
	LD DE,1000H	;AUF DEN QUOTIENTEN 1000H = 4096
	ADD HL,DE	;WIEDER DRAUF
	POP DE
	JR CONVR1	;UND NORMAL WEITER

CONVR0:	EX DE,HL	;NEIN
	POP DE

CONVR1: CALL DIV10	;HL DURCH 10 DIVIDIEREN
	CALL RCODE	;REST CODIEREN
	DJNZ CONVR1	;ALLE STELLEN GENERIERT ?

	LD HL,STRING	;FUEHRENDE NULLEN
	LD A,'0'
COLOOP:	CP (HL)
	JR NZ,CONVEX
	LD (HL),' '	;DURCH BLANKS ERSETZEN
	INC HL
	JR COLOOP	
CONVEX:	RET

DIV10:	PUSH BC		;DIVIDIERT HL DURCH 10.
	PUSH DE
	LD B,12		;DIVIDEND HAT 12+4 BITS.
	LD D,0A0H	;DIVISOR (=10) IM OBEREN HALBBYTE VON D
	LD E,0
DIVBIT:	XOR A		;CLEAR CARRY FLAG
	ADD HL,HL	;HL 1 BIT NACH LINKS
	PUSH AF		;SAVE CARRY FLAG
	XOR A		;CLEAR CARRY FLAG
	SBC HL,DE	;"GEHT DE IN HL"?
	INC HL		;ANGENOMMEN, JA.
	JR NC,DIVCNT	;FALLS NICHT
	POP AF		;UND FALLS VORHER
	JR C,DIVNXT	;KEIN CARRY,
	ADD HL,DE	;SUBTRAKTION UND
	DEC HL		;QUOTIENTEN-STELLE
	JR DIVNXT	;ZURUECKNEHMEN.
DIVCNT:	POP AF
DIVNXT:	DJNZ DIVBIT
	POP DE
	POP BC
	RET

RCODE:	LD A,H		;REST AUS DEM OBEREN HALBBYTE
	RR A		;VON H INS UNTERE SCHIEBEN,
	RR A
	RR A
	RR A
	AND 0FH		;HERAUSMASKIEREN,
	OR 30H		;ALS ASCII-ZEICHEN CODIEREN
	LD (DE),A	;UND ABSPEICHERN.
	LD A,H		;QUOTIENT STEHT IN L UND 
	AND 0FH		;UNTEREM HALBBYTE VON H
	LD H,A
	DEC DE
	RET

;--------------- PROGRAMM-ENDE --------------------

EXIT:	JP 0		;WARMBOOT

PRGEND	EQU $

	END
