PROGRAM DatumTest; VAR Tag,Monat,Jahr,Stdn,Min,Sek : Byte; PROCEDURE Datime (VAR Tag,Monat,Jahr,Stdn,Min,Sek : Byte); BEGIN INLINE ( (* ***** DATUM.MAC ***** CP/M Plus-Utility *) (* Version fuer korr. TURBO-INLINER (c't 2/86) *) (* *) $0E/$69/ (* START: LD C,105 ; Datum von *) $11/*+96/ (* LD DE,DAYC ; CP/M + *) $CD/$05/$00/ (* CALL 0005 ; abholen *) (* ! *) (* Erst mal die Zeit ! *) (* ! *) $2A/SEK/ (* LD HL,(SEK) ; Sekunden in A () ! *) $CD/*+104/ (* CALL BCD ! *) $11/*+86/ (* LD DE,TIME ! *) $1A/ (* LD A,(DE) ; Stunden nach A ! *) $2A/STDN/ (* LD HL(STDN) () ! *) $CD/*+94/ (* CALL BCD ! *) $13/ (* INC DE ! *) $1A/ (* LD A,(DE) ; Minuten nach A ! *) $2A/MIN/ (* LD HL,(MIN) () ! *) $CD/*+86/ (* CALL BCD ! *) (* ! *) (* und jetzt das Datum. *) (* *) $ED/$5B/*+65/ (* LD DE,(DAYC) ; DE=Tage ab 1.1.78 *) $3E/$4D/ (* LD A,77 *) $2A/JAHR/ (* LD HL,(JAHR) ; JAHR-78-1 () *) $77/ (* LD (HL),A *) $06/$00/ (* LD B,00 ; B loeschen *) $3E/$01/ (* LD A,01 ; Schaltjahrzaehler=1 *) (* ; wenn 0, dann Schaltj. *) (* Schleife fuer jedes neue Jahr *) (* *) $2A/JAHR/ (* NXTJ: LD HL,(JAHR) ; Jahr=Jahr+1 () *) $34/ (* INC (HL) *) $3C/ (* INC A ; Schaltjahrzaehler: *) $E6/$03/ (* AND 3 ; A=(A+1) MOD 4 *) $21/*+49/ (* LD HL,MONTAB *) (* *) (* Schleife fuer jeden neuen Monat *) (* *) $4E/ (* NXTM: LD C,(HL) ; Wert aus Tabelle *) $23/ (* INC HL *) $0C/ (* INC C ; wenn 0FFH, dann *) $28/$F1/ (* JR Z,NXTJ ; Ende des Jahres *) $0D/ (* DEC C ; wenn 00H, dann *) $20/$06/ (* JR NZ,SUBTR ; Februar (!) *) $0E/$1C/ (* LD C,28 ; entweder 28 *) $B7/ (* OR A ; oder 29 Tage *) $20/$01/ (* JR NZ,SUBTR *) $0C/ (* INC C *) $EB/ (* SUBTR: EX DE,HL ; Probehalber abziehen *) $B7/ (* OR A ; wenn kleiner/gleich 0 *) $ED/$42/ (* SBC HL,BC ; dann Nonat gefunden *) $EB/ (* EX DE,HL ; und Rest=Tag *) $28/$02/ (* JR Z,FERTIG *) $30/$E9/ (* JR NC,NXTM ; sonst naechster Monat *) $EB/ (* FERTIG: EX DE,HL *) $09/ (* ADD HL,BC ; wieder addieren *) $7D/ (* LD A,L *) $2A/TAG/ (* LD HL,(TAG) ; und in TAG () *) $77/ (* LD (HL),A *) $EB/ (* EX DE,HL *) $11/*+15/ (* LD DE,MONTAB ; aus HL und dem *) $B7/ (* OR A ; Anfang der Tabelle *) $ED/$52/ (* SBC HL,DE ; MONTAB kann der *) $7D/ (* LD A,L ; Monat errechnet *) $2A/MONAT/ (* LD HL,(MONAT) ; werden () *) $77/ (* LD (HL),A *) $C9/ (* RET *) $00/$00/ (* DAYC: DW 0 ; CP/M-Datum *) $00/$00/ (* TIME: DW 0 ; CP/M-Stdn,Min *) $1F/$00/$1F/$1E/ (* MONTAB: DB 31,00,31,30 *) $1F/$1E/$1F/$1F/ (* DB 31,30,31,31 *) $1E/$1F/$1E/$1F/ (* DB 30,31,30,31 *) $FF/ (* DB 0FFH *) (* *) $77/ (* BCD: LD (HL),A ; BCD nach binaer ! *) $AF/ (* XOR A ; Akku loeschen ! *) $ED/$67/ (* RRD ; Nibble trennen ! *) $4F/ (* LD C,A ; C=Einer, (HL)=Zehner ! *) $7E/ (* LD A,(HL) ; Zehner im Akku ! *) $CB/$26/ (* SLA (HL) ; (HL)=(HL)*2 ! *) $CB/$26/ (* SLA (HL) ; *4 ! *) $86/ (* ADD A,(HL) ; *5 ! *) $CB/$27/ (* SLA A ; *10 ! *) $81/ (* ADD A,C ; +Einer ! *) $77/ (* LD (HL),A ! *) $C9/ (* RET ! *) $00) END; BEGIN (* Testprogramm *) Datime(Tag,Monat,Jahr,Stdn,Min,Sek); (* --- Korrektur ab 2000 --- *) if Jahr>100 then Jahr:=Jahr-100; (* ------------------------- *) writeln('Datum: ',Tag,'.',Monat,'.',Jahr); writeln('Zeit : ',Stdn,'.',Min,'.',Sek); END.