.Z80 LF EQU 10 CR EQU 13 BDOS EQU 5 FCB EQU 5CH DMA EQU 80H ORG 100H LD SP,STACK LD A,(DMA) AND A JR NZ,NER LD DE,ERR1 ;Anzeige "No File !" ERROR: LD C,9 CALL BDOS LD C,0 ;Warmstart CALL BDOS NER: LD HL,FCB+12 LD B,21 CLR: LD M,0 INC HL DJNZ CLR ;FCB Grundeinstellung LD DE,FCB LD C,15 ;Datei eroeffnen CALL BDOS LD DE,ERR2 ;Anzeige "File not found" INC A JR Z,ERROR XOR A LD (FCB+32),A ;aktuelle Satznummer fuer 1. Satz LD DE,FCB LD C,20 ;Sequentiell lesen CALL BDOS AND A JR Z,R1OK ;Lesen erfolgreich INC A LD DE,ERR3 ;Anzeige Lesefehler JR Z,ERROR LD DE,ERR4 ;Anzeige Dateiende JR ERROR R1OK: LD A,(DMA+16) ;Anzahl der Adressen CP 2 JR Z,KCD CP 3 LD DE,ERR5 ;Keine CAOS-MC-Datei JR NZ,ERROR KCD: CALL CRLF LD A,' ' CALL CRT LD BC,7 LD HL,DMA+16 LD DE,ADPU LDIR ;Adressen merken LD HL,(ADPU+1) ;Anfangsadresse CALL HLHX EX DE,HL LD HL,(ADPU+3) ;Endadresse CALL HLHX LD A,(ADPU) ;Anzahl Adressen CP 2 JR Z,NST ;Keine Startadresse PUSH HL LD HL,(ADPU+5) ;Startadresse CALL HLHX POP HL NST: AND A SBC HL,DE ;HL=Laenge LD (LEN),HL PUSH HL LD HL,(6) ;Endadresse TPA LD DE,PU AND A SBC HL,DE ;HL=maximale Laenge POP DE AND A SBC HL,DE LD DE,ERR6 ;Anzeige nicht genug Speicher JP C,ERROR LD DE,TEXT ;Ueberschrift LD C,9 ;Anzeige Zeichenkette CALL BDOS LD HL,PU-80H ;Puffer LD (DMAPU),HL READ: LD HL,(DMAPU) ;DMA-Adresse alt LD BC,80H ADD HL,BC LD (DMAPU),HL ;DMA-Adresse neu EX DE,HL LD C,26 ;DMA-Adresse setzen CALL BDOS LD DE,FCB LD C,20 ;Sequentiell lesen CALL BDOS AND A JR Z,R2OK ;Lesen erfolgreich INC A LD DE,ERR3 ;Anzeige Lesefehler JP Z,ERROR LD DE,ERR4 ;Anzeige Dateiende JP ERROR R2OK: LD HL,(LEN) ;Dateilaenge LD BC,80H AND A SBC HL,BC ;CY=1, wenn Laenge kleiner als 80H LD (LEN),HL JR Z,ANZ ;Z=1, wenn Laenge gleich 80H JR NC,READ ;CY=0, wenn Laenge groesser als 80H ANZ: LD HL,PU LD (DMAPU),HL ;Pufferspeicher ANZW: LD B,1 CALL SPACE LD HL,(ADPU+1) ;Adresse alt CALL HLHX ;Adresse anzeigen LD BC,8 ADD HL,BC LD (ADPU+1),HL ;Adresse neu EX DE,HL LD HL,(ADPU+3) ;Endadresse AND A SBC HL,DE JR NC,VLIN ;Volle Zeile ADD HL,BC LD C,L ;Anzahl Bytes auf letzter Zeile VLIN: LD B,1 CALL SPACE LD B,C ;8 oder weniger Byte LD DE,0 LD HL,(DMAPU) ;Speicher alt LINE: LD A,M INC HL CALL AHEX ADD A,E ;Berechnen Checksum JR NC,NCY INC D NCY: LD E,A LD A,' ' CALL CRT DJNZ LINE LV: LD A,C ;Anzahl der Bytes auf der Zeile CP 8 JR Z,CHS LD B,3 CALL SPACE INC C JR LV CHS: LD (DMAPU),HL ;Speicher neu LD B,2 CALL SPACE EX DE,HL CALL HLHX ;Checksum anzeigen CALL CRLF LD HL,(ADPU+3) ;Endadresse LD DE,(ADPU+1) ;Anfangsadresse neu AND A SBC HL,DE JR Z,FINE ;Anzeige beendet JR NC,ANZW ;Anzeige naechste Zeile FINE: LD DE,COPY LD C,9 ;Zeichenkettenanzeige CALL BDOS LD C,0 ;Warmstart CALL BDOS ;------ Unterprogramme ------ TAST: LD E,0FFH LD C,6 CALL BDOS ;Tastaturabfrage CP 3 JR NZ,NBRK ;^C --> Programmabbruch BRK: LD C,0 ;Warmstart CALL BDOS NBRK: CP 13H ;^S --> Bildschirm anhalten RET NZ TA: LD E,0FFH LD C,6 CALL BDOS ;Tastaturabfrage CP 3 JR Z,BRK ;^C --> Programmabbruch CP 11H ;^Q --> Fortsetzen Bildschrmausgabe JR NZ,TA RET ;------ HLHX: LD A,H CALL AHEX LD A,L CALL AHEX LD A,' ' CALL CRT RET ;------ AHEX: PUSH AF RRCA RRCA RRCA RRCA CALL HEX POP AF HEX: PUSH AF AND 0FH CP 10 JR NC,H10 ADD A,'0' JR H9 H10: ADD A,'A'-10 H9: CALL CRT ;Zeichen anzeigen POP AF RET ;------ CRLF: LD A,CR CALL CRT LD A,LF CALL CRT RET ;------ SPACE: LD A,' ' CALL CRT DJNZ SPACE RET ;------ CRT: PUSH HL PUSH DE PUSH BC PUSH AF LD E,A ;Zeichen LD C,2 ;Zeichen anzeigen CALL BDOS CALL TAST ;Abfrage Bildschirmsteuertasten POP AF POP BC POP DE POP HL RET ;------ Texte ------ ERR1: DB "No File!$" ERR2: DB "File not found!$" ERR3: DB CR,LF,"Read-Error!$" ERR4: DB "End of File!$" ERR5: DB "No CAOS-MC-File!$" ERR6: DB " --> Not enough memory!$" TEXT: DB CR,LF," Adresse Daten Checksum" DB CR,LF," ______________________________________",CR,LF,CR,LF,'$' COPY: DB CR,LF,' CAOS-MC-Programm angezeigt mit' DB CR,LF,' DISPKC.COM (c) ml 10.11.1990',CR,LF,'$' ;------ Variablen ------ ADPU: DS 7,0 ;Speicher fuer Adressen ;Byte 0: Anzahl der Adressen ;Byte 1 und 2: Anfangsadresse ;Byte 3 und 4: Endadresse ;Byte 5 und 6: Startadresse LEN: DW 0 ;Laenge Speicherbereich DS 80,0 ;32 Wort Stacktiefe reserviert DMAPU: DW 0 ;Speicher fuer DMA-Puffer-Position STACK EQU $-2 PU EQU $ END