TITLE KC 85 KASSETTENINTERFACE .Z80 ;***************************** ;SAVE/LOAD - ROUTINEN DES KC 85/3 ;COPYRIGTH BY MPM ;K.-D.KIRVES ; 27.10.86/26.11.87 ;****************************** ;VORAUSSETZNGEN: ;VOR AUFRUF DER FOLGENDEN UNTERPROGRAMME ;MUESSEN ERFUELLT SEIN: ; IM2 ; IX = LAX00 ; I REG GELADEN ; INTERRUPTVEKTOREN UND ; INTERRUPTTABELLEN GELADEN FUR: ; CTC KANAL 1 AUF IKACT KASS.OUT ; PIO PORT A AUF IKEP KASS.IN ; PIO PORT A INITIALISIERT AUF BYTE-AUSGABE ; ; BENOETIGTE SYSTEMUNTERPROGRAMME ;AUSGABE AKKU AN BILDSCHIRM ALS ZWEI HEX-ZAHLEN AHEX EQU 400H ; AUSGABE EINER ZEICHENKETTE,DIE NACH DEM UP-AUFRUF ; DEF.IST UND MIT 00H ABGESCHLOSSEN IST OSTR EQU 403H ; BREAK TEST BEI UNTERBRECHUNGSANFORDERUNG ; WIRD CY=1 GESTZT BRKT EQU 406H ; AUSGABE NEWLINE CRLF EQU 409H ; AUSGABE AKKU ALS ASCII-ZEICHEN AN DEN BILDSCHIRM CRT EQU 40CH ; AUSGABE EINES LEERZEICHENS -- " -- SPACE EQU 40FH ; AUSGABE HL UND DE -REGISTER ALS ZWEI HEX-ZAHLEN HLDE EQU 412H ; ABFORDERN EINES ZEICHENS VON DER TASTATUR ; UEDEFSGABE IM AKKU KBD EQU 4415H ;I/O ADRESSEN P1AD EQU 88H P1AC EQU 8AH CTC0 EQU 8CH CTC1 EQU 8DH CTC2 EQU 8EH CTC3 EQU 8FH ;TASTENCODES BREAK EQU 03H CR EQU 0DH ;NEWLINE CUD EQU 0AH ;CURSOR DOWN CCR EQU 19H ;CURSOR TO BEGIN OF LINE ;RAM ARBEITSZELLEN ;BUFFER FOR I/O IOPUF: DEFS 128 ; NO OF ARGS ARGN: DEFS 1 ; UP TO 10 ARGS ARG1: DEFS 2 ARG2: DEFS 2 ARG3: DEFS 2 ARG49: DEFS 12 ARG10: DEFS 2 ;BEGIN OF WORKSPACE FOR INPUT/OUTPUT ; ** KASSETTE ** ;(IX+0) = ZEITKONSTANTE LAX00: DEFS 1 ;(IX+1) = CHECK-SUMME LAX01: DEFS 1 ;(IX+2) = BLOCKNR. LAX02: DEFS 1 ;(IX+3) = SOLL BLOCKNR. LAX03: DEFS 1 ;(IX+4) = KENN BYTE LAX04: DEFS 1 ;(IX+5) = I/O PUFFER L LAX05: DEFS 1 ;(IX+6) = " H LAX06: DEFS 1 ;(IX+7) = MERKREG. ;BIT 0 -READ/VERIFY LAX07: DEFS 1 ; ;PROGRAMME ; ; SAVE COMMAND SAVE: LD DE,IOPUF ;HL - BEGIN OF NAME LD BC,11 LDIR EX DE,HL LD M,0 ;NO COPY-PROTECTION LD HL,ARGN LD A,M CP 2 RET C LD DE,IOPUF+16 LD C,21 LDIR CALL ISRLX LD HL,(ARG1) WR1: LD (IX+5),L LD (IX+6),H LD A,(IX+2) CALL AHEX CALL OSTR DB ' ' DB 0 CALL BRKT LD BC,160 JR C,WRE LD DE,80H ADD HL,DE LD DE,(ARG2) AND A SBC HL,DE JR NC,WRE CALL SRLX JR WR1 WRE: CALL CRLF JP CSRLX ; ; READ ROUTINE VERIF: RES 0,(IX+7) JR READ1 READ: SET 0,(IX+7) READ1: CALL ISRLI RD: LD A,(IX+2) ;BLOCK-NR. JR NC,R1 R3: CALL AHEX CALL OSTR DB '* ' DB CCR DB CUD DB 0 CALL SRLIN JR RD R1: CP 2 JR NC,R3 INC A LD E,A LD HL,IOPUF LD B,11 RE: LD A,M INC HL CALL CRT ;ANZEIGE NAME + TYP DJNZ RE LD (IX+3),E ;SOLL BLOCKNR. LD A,(IOPUF+16) BIT 0,(IX+7) ;VERIFY? JR Z,RF LD (IX+4),A CP 2 JR C,R2 CP 11 JR NC,R2 LD DE,(IOPUF+19) LD HL,(IOPUF+17) LD A,(ARGN) AND A JR Z,R5 LD BC,(ARG1) ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL BIT 2,(IX+4) ;ARGN = 4 ? JR NZ,R5 ;YES => NO START OFFSET PUSH HL LD HL,(IOPUF+21) ADD HL,BC LD (IOPUF+21),HL POP HL R5: LD BC,(IOPUF+21) LD (ARG2),BC ;STARTADRESSE CALL SPACE ;SOLL-BLOCKNR.=2 CALL HLDE ;AUSGABE ADRESSEN RF: CALL CRLF R7: CALL BRKT ;BREAK ? RA1: JR C,RA2 CALL SRLIN ;BLOCKLESEN LD A,(IX+2) ;BLOCKNR. PUSH AF CP (IX+3) ;VGL BL-NR. JR Z,R6 INC A JR Z,R6 ;BLOCK FF? POP AF CALL AHEX CALL OSTR DB '* ' DB 0 JR R7 R2: CALL OSTR DB '???' DB CCR DB CUD DB 0 RA2: LD (IX+4),2 JR CSRLI R6: POP AF JR C,RMOD PUSH AF CALL AHEX CALL OSTR DB '> ' DB 0 POP AF RB: INC A JR Z,RLB ;LETZTER BLOCK BIT 0,(IX+7) ;VERIFY JR Z,REE LD BC,80H PUSH DE LD DE,IOPUF EX DE,HL LDIR EX DE,HL POP DE REE: INC (IX+3) ;BLOCK-NR. SOLL RR7: JR R7 RMOD: CALL AHEX CALL OSTR DB ' ?' DB CCR DB CUD DB 0 BIT 0,(IX+7) ;VERIFY JR Z,R7 CALL OSTR DB 'REPEAT (N)?' DB CUD DB CR DB 0 RA: CALL KBD JR Z,RA CP 'N' JR NZ,RR7 LD (IX+4),2 LD A,(IX+2) JR RB RLB: EX DE,HL SBC HL,DE LD C,L LD B,0 BIT 0,(IX+7) ;VERIFY? JR Z,CSRLI LD HL,IOPUF LDIR CSRLI: IN A,(P1AD) AND 9FH OUT (P1AD),A JP CRLF ; ;************CASSETTE*********************** ;DEFINITIONS ;ZEITKONSTANTEN FUER TAKTFREQUENZ F=2,5MHz ;AUSGABE KASSETTE ZKKAT EQU 80H ;TRENNZEICHEN ZKKA0 EQU 20H ; "0" ZKKA1 EQU 40H ; "1" ;****************************************************** ;P R O G R A M M E Z U R A U S G A B E ;INITIALISIERUNGSPROGRAMM FUER AUSGABE ISRLX: IN A,(P1AD) OR 60H ;MOTOR/LED ON OUT (P1AD),A LD (IX+2),0 ;BLOCK 1 LD BC,2000H ;LANGER VORTON SRLX: INC (IX+2) KARAM: DI XOR A LD (IX+1),A LD A,87H OUT (CTC1),A LD A,ZKKA1 ; VORTON 1 OUT (CTC1),A EI LD D,A KARA1: CALL AUS1 ; VORTON AUSGEBEN CPI JP PE,KARA1 CALL AUST LD A,(IX+2) CALL KAUBT ; BLOCKNUMMER AUSGEBEN LD L,(IX+5) LD H,(IX+6) ;BLOCHANFANG LD B,80H KARA2: LD A,M CALL KAUBT LD A,(IX+1) ADD A,M LD (IX+1),A INC HL DJNZ KARA2 CALL KAUBT LD A,D CALL DYNST LD A,3 OUT (CTC1),A RET ; ; SCHREIBEN EINES BYTES ; ; ; KAUBT: PUSH BC LD C,A LD B,8 KAUB1: RRC C PUSH AF CALL C,AUS1 POP AF CALL NC,AUS0 DJNZ KAUB1 POP BC AUST: LD E,ZKKAT JR AUS AUS0: LD E,ZKKA0 JR AUS AUS1: LD E,ZKKA1 AUS: LD A,D CALL DYNST LD A,D DYNST: LD (IX),A DY1: LD A,(IX) OR A JR NZ,DY1 LD D,E RET ; ; INTERRUPTROUTINE ZUM SCHREIBEN ; IKACT: PUSH AF LD A,3 OUT (CTC1),A LD A,87H OUT (CTC1),A LD A,(IX) OUT (CTC1),A XOR A LD (IX),A POP AF EI RETI ; CSRLX: LD (IX+2),0FEH CALL SRLX IN A,(P1AD) AND 9FH ;LED/MOTOR OFF OUT (P1AD),A RET ;*********************************************************** ;FESTWERTE FUER EINLESEN VOM MB IKEZK EQU 0B0H ;CTC-ZEITKONSTANTE FUER EINLESEN VOM MB IKEGN EQU 52H ;GRENZE FUER NULLERKENNUNG IKEG1 EQU 90H ;*********************************************************** ;P R O G R A M M E Z U M E I N L E S E N ;INITIALISIERUNGSPROGRAMM ZUM EINLESEN ISRLI: DI IN A,(P1AD) OR 40H ;MOTOR ON AND 0DFH ;LED OFF OUT (P1AD),A EI SRLI1 EQU $ SRLIN: LD A,5 OUT (CTC2),A LD A,83H OUT (P1AC),A ;INT ENABLE PUSH HL PUSH DE LD A,IKEZK OUT (CTC2),A EI MA1: LD B,22 ; 22 VORTOENE SUCHEN XOR A LD (IX+1),A MA2: CALL LSTOP JR C,MA1 CP IKEG1 CALL LED JR C,MA1 DJNZ MA2 MA5: LD B,2 MA3: XOR A LD C,A LD (IX),A CALL LS1 CP IKEGN JR NC,MA5 DJNZ MA3 CALL IBYTE CALL C,LED ; FEHLER LD (IX+2),A LD B,128 ; 128 BYTE LD L,(IX+5) ; I/O-PUFFER LD H,(IX+6) MA4: CALL IBYTE CALL C,LED LD M,A LD A,(IX+1) ADD A,M LD (IX+1),A INC HL DJNZ MA4 CALL IBYTE CALL C,LED LD B,A LD A,(IX+1) CP B POP DE POP HL LD A,3 OUT (P1AC),A ;INT DISABLE JR Z,LED SCF LED: PUSH AF IN A,(P1AD) SET 5,A JR NC,LED1 RES 5,A LED1: OUT (P1AD),A POP AF RET ; INTERUPTROUTINE LESEN ; IKEP: PUSH AF IN A,(CTC2) LD (IX),A LD A,7 OUT (CTC2),A LD A,IKEZK OUT (CTC2),A POP AF EI RETI ; LSTOP: XOR A LD (IX),A LS0: LD A,(IX) OR A JR Z,LS0 LD C,A XOR A LD (IX),A LS1: LD A,(IX) OR A JR Z,LS1 ADD A,C RET ; ; EIGABE EINES BYTES ; ; IBYTE: LD D,8 XOR A LD E,A IB1: CALL LSTOP CCF JR NC,IB2 CP IKEG1 RET C SCF IB2: RR E DEC D JR NZ,IB1 CALL LSTOP LD A,E RET ;################################## END