; this code was fetched from the "C-control Hardware-Erweiterungen" book CDROM. ;I fixed some few bugs in assembler. port .equ $02 ; Port C portdir .equ $06 ; Datenrichtungsregister ds18s .equ 7 ; bit 7 ds18smask .equ $80 bas_1 .equ $b7 ; erste Basic Variable => Fehlerrückgabe bas_2 .equ $b8 ; zweite Basic Variable => Daten Rein&Raus .ORG $101 reset sei ;mask any intr, as they inject heavy jitter bclr ds18s,port ; port low bset ds18s,portdir; Port als Ausgang lda #$4b ; 4b 75 * 10 µsec => ~750 µsec jsr delay ; in Warteschleife springen bclr ds18s,portdir; Port high Z lda #$08 ; 8 * 10 µsec => ~80 µsec jsr delay ; warten auf PRESENCE-PULSE-DS1820 lda port and #ds18smask ; nur bit1, alle anderen maskieren bne error ; Fehler-Flag setzen lda #$2d ; erneut 45 * ~10 µsec => ~450 µsec jsr delay byte_send lda #$08 ; 08 Bits sta bas_1 bset ds18s,port bset ds18s,portdir byte_send_b bclr ds18s,port; Write 1 Slot ~5 µsec Port 1 Low clc ; clear Carry bit ror bas_2 ; in Carry schieben bcc write0 bcs write1 write0 bclr ds18s,port bra weiter write1 bset ds18s,port weiter lda #$07 ; 7 * ~10 => 70 µsec delay jsr delay bset ds18s,port dec bas_1 bne byte_send_b cli ;vor jedem rts ein cli nicht vergessen rts byte_read lda #$08 ; 08 Bits sta bas_1 lda #$00 sta bas_2 byte_read_b bset ds18s,port; first set value, then drive, not vice versa bset ds18s,portdir bclr ds18s,port bclr ds18s,portdir nop ; 14 µsec abwarten nop ; wenn ein hochkapazitives oder langes Kabel verwendet wird, haben die Dallas Probleme nop ; von 0 auf highZ in 14us zu kommen. Event muessesn dann mehr nops eingebaut werden. nop nop nop nop nop brset ds18s,port,rot ; Bit in C lesen rot ror bas_2 lda #$07 ; Gesamtzykluszeit abwarten (~60 µsec) jsr delay dec bas_1 bne byte_read_b bset ds18s,port bset ds18s,portdir cli rts delay ldx #$02 ; ca. 10 µsec delay inloop decx bne inloop deca bne delay rts error lda #$ff ; Ein Fehler => 255 speichern sta bas_1 cli rts .end