ext sek,min,stdn,jahr,monat,tag ; ; ***** DATUM.MAC ***** CP/M Plus-Utility ; Version fuer korr. TURBO-INLINER (c't 2/86) ; Start: ld c,105 ; Datum von ld de,dayc ; CP/M + call 0005 ; abholen ; ! ; Erst mal die Zeit ! ; ! ld hl,(sek) ; Sekunden in A () ! call BCD ; ! ld de,time ; ! ld a,(de) ; Stunden nach A ! ld hl,(stdn) ; () ! call BCD ; ! inc de ; ! ld a,(de) ; Minuten nach A ! ld hl,(min) ; () ! call BCD ; ! ; ; und jetzt das Datum. ; ld de,(dayc) ; DE=Tage ab 1.1.78 ld a,77 ld hl,(jahr) ; JAHR-78-1 () ld (hl),a ld b,00 ; B loeschen ld a,01 ; Schaltjahrzaehler=1 ; wenn 0, dann Schaltj. ; ; Schleife fuer jedes neue Jahr ; nxtj: ld hl,(jahr) ; Jahr=Jahr+1 () inc (hl) inc a ; Schaltjahrzaehler: and 3 ; A=(A+1) MOD 4 ld hl,montab ; ; Schleife fuer jeden neuen Monat ; nxtm: ld c,(hl) ; Wert aus Tabelle inc hl inc c ; wenn 0FFH, dann jr z,nxtj ; Ende des Jahres dec c ; wenn 00H, dann jr nz,subtr ; Februar (!) ld c,28 ; entweder 28 or a ; oder 29 Tage jr nz,subtr inc c subtr: ex de,hl ; Probehalber abziehen or a ; wenn kleiner/gleich 0 sbc hl,bc ; dann Monat gefunden ex de,hl ; und Rest=Tag jr z,fertig jr nc,nxtm ; sonst naechster Monat fertig: ex de,hl add hl,bc ; wieder addieren ld a,l ld hl,(tag) ; und in TAG () ld (hl),a ex de,hl ld de,montab ; aus HL und dem or a ; Anfang der Tabelle sbc hl,de ; MONTAB kann der ld a,l ; Monat errechnet ld hl,(monat) ; werden () ld (hl),a ret dayc: dw 0 ; CP/M-Datum time: dw 0 ; CP/M-Stdn,Min montab: db 31,00,31,30 db 31,30,31,31 db 30,31,30,31 db 0ffh BCD: ld (hl),a ; BCD nach binaer ! xor a ; Akku loeschen ! rrd ; Nibble trennen ! ld c,a ; C=Einer, (HL)=Zehner ! ld a,(hl) ; Zehner im Akku ! sla (hl) ; (HL)=(HL)*2 ! sla (hl) ; *4 ! add a,(hl) ; *5 ! sla a ; *10 ! add a,c ; +Einer ! ld (hl),a ; ! ret ; ! end