PN KI. ;***************************** ;SAVE/LOAD - ROUTINEN DES HC 900 ;COPYRIGTH BY MPM ;K.-D.KIRVES ; 3.12.84 ;***************************** ;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 ; UEBERGABE 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: DEF 03H CR: DEF 0DH ;NEWLINE CUD: DEF 0AH ;CURSOR DOWN CCR: DEF 19H ;CURSOR TO BEGIN OF LINE ;RAM ARBEITSZELLEN ORG 1000H ;BUFFER FOR I/O IOPUF: BER 128 ; NO OF ARGS ARGN: BER 1 ; UP TO 10 ARGS ARG1: BER 2 ARG2: BER 2 ARG3: BER 2 ARG49: BER 12 ARG10: BER 2 ;BEGIN OF WORKSPACE FOR INPUT/OUTPUT ; ** KASSETTE ** ;(IX+0) = ZEITKONSTANTE LAX00: BER 1 ;(IX+1) = CHECK-SUMME LAX01: BER 1 ;(IX+2) = BLOCKNR. LAX02: BER 1 ;(IX+3) = SOLL BLOCKNR. LAX03: BER 1 ;(IX+4) = KENN BYTE LAX04: BER 1 ;(IX+5) = I/O PUFFER L LAX05: BER 1 ;(IX+6) = " H LAX06: BER 1 ;(IX+7) = MERKREG. ;BIT 0 -READ/VERIFY LAX07: BER 1 ; ;PROGRAMME ; ORG 0 ; 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 CMP 2 RC 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 JRC WRE-# LD DE,80H ADD HL,DE LD DE,(ARG2) AND A SBC HL,DE JRNC WRE-# CALL SRLX JR WR1-# WRE: CALL CRLF JMP 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. JRNC R1-# R3: CALL AHEX CALL OSTR DB '* ' DB CCR DB CUD DB 0 CALL SRLIN JR RD-# R1: CMP 2 JRNC 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? JRZ RF-# LD (IX+4),A CMP 2 JRC R2-# CMP 11 JRNC R2-# LD DE,(IOPUF+19) LD HL,(IOPUF+17) LD A,(ARGN) AND A JRZ R5-# LD BC,(ARG1) ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL BIT 2,(IX+4) ;ARGN = 4 ? JRNZ 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: JRC RA2-# CALL SRLIN ;BLOCKLESEN LD A,(IX+2) ;BLOCKNR. PUSH AF CMP (IX+3) ;VGL BL-NR. JRZ R6-# INC A JRZ 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 JRC RMOD-# PUSH AF CALL AHEX CALL OSTR DB '> ' DB 0 POP AF RB: INC A JRZ RLB-# ;LETZTER BLOCK BIT 0,(IX+7) ;VERIFY JRZ 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 JRZ R7-# CALL OSTR DB 'REPEAT (N)?' DB CUD DB CR DB 0 RA: CALL KBD JRZ RA-# CMP 'N' JRNZ 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? JRZ CSRLI-# LD HL,IOPUF LDIR CSRLI: IN P1AD AND 9FH OUT P1AD JMP 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 P1AD OR 60H ;MOTOR/LED ON OUT P1AD 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 LD A,ZKKA1 ; VORTON 1 OUT CTC1 EI LD D,A KARA1: CALL AUS1 ; VORTON AUSGEBEN CPI JPPE 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 M LD (IX+1),A INC HL DJNZ KARA2-# CALL KAUBT LD A,D CALL DYNST LD A,3 OUT CTC1 RET ; ; SCHREIBEN EINES BYTES ; ; ; KAUBT: PUSH BC LD C,A LD B,8 KAUB1: RRC C PUSH AF CAC AUS1 POP AF CANC 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 JRNZ DY1-# LD D,E RET ; ; INTERRUPTROUTINE ZUM SCHREIBEN ; IKACT: PUSH AF LD A,3 OUT CTC1 LD A,87H OUT CTC1 LD A,(IX) OUT CTC1 XOR A LD (IX),A POP AF EI RETI ; CSRLX: LD (IX+2),0FEH CALL SRLX IN P1AD AND 9FH ;LED/MOTOR OFF OUT P1AD 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 P1AD OR 40H ;MOTOR ON AND 0DFH ;LED OFF OUT P1AD EI SRLI1: EQU # SRLIN: LD A,5 OUT CTC2 LD A,83H OUT P1AC ;INT ENABLE PUSH HL PUSH DE LD A,IKEZK OUT CTC2 EI MA1: LD B,22 ; 22 VORTOENE SUCHEN XOR A LD (IX+1),A MA2: CALL LSTOP JRC MA1-# CMP IKEG1 CALL LED JRC MA1-# DJNZ MA2-# MA5: LD B,2 MA3: XOR A LD C,A LD (IX),A CALL LS1 CMP IKEGN JRNC MA5-# DJNZ MA3-# CALL IBYTE CAC 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 CAC LED LD M,A LD A,(IX+1) ADD M LD (IX+1),A INC HL DJNZ MA4-# CALL IBYTE CAC LED LD B,A LD A,(IX+1) CMP B POP DE POP HL LD A,3 OUT P1AC ;INT DISABLE JRZ LED-# SCF LED: PUSH AF IN P1AD SET 5,A JRNC LED1-# RES 5,A LED1: OUT P1AD POP AF RET ; INTERUPTROUTINE LESEN ; IKEP: PUSH AF IN CTC2 LD (IX),A LD A,7 OUT CTC2 LD A,IKEZK OUT CTC2 POP AF EI RETI ; LSTOP: XOR A LD (IX),A LS0: LD A,(IX) OR A JRZ LS0-# LD C,A XOR A LD (IX),A LS1: LD A,(IX) OR A JRZ LS1-# ADD C RET ; ; EIGABE EINES BYTES ; ; IBYTE: LD D,8 XOR A LD E,A IB1: CALL LSTOP CCF JRNC IB2-# CMP IKEG1 RC SCF IB2: RR E DEC D JRNZ IB1-# CALL LSTOP LD A,E RET ;################################## END 8ʙQc#^#Vʏ