PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE .1 stz DNS.CACHE-1,x dex bne .1 clc rts *-------------------------------------- * DNS.QUERY * In: * PULLW = hostname PTR to PSTR * PULLW = PTR to IP to fill with cached data * Out: * CC: hit: IP filled with address * CS: missed *-------------------------------------- DNS.QUERY >PULLYA Get host string jsr PSTR2DNSHostName >PULLW ZPPtrIP Get IP address to fill ldx #0 .1 lda DNS.CACHE,x beq .6 empty DNS cache entry? phx lda DNS.CACHE+S.DNSCACHE.hNAME,x >SYSCALL SYS.GetMemPtrA >STYA ZPPtrDNS plx ldy #0 .2 lda DNSHostname,y bne .21 lda (ZPPtrDNS),y beq .22 .21 cmp (ZPPtrDNS),y bne .6 iny bne .2 .22 lda DNS.CACHE,x get back status... bpl .4 Pending... ldy #0 .3 lda DNS.CACHE+S.DNSCACHE.RDATA,x sta (ZPPtrIP),y inx iny cpy #4 bne .3 clc rts .4 sec rts .6 txa clc adc #S.DNSCACHE tax cmp #K.DNSCACHE.SIZE*S.DNSCACHE bne .1 DNS.REQUEST jsr NEW.UDP.FRAME bcc .1 bra * rts .1 phx ldy #S.UDP.SRCPORT lda /UDP.PORT.DNS sta (ZPFrameBase1),y iny lda #UDP.PORT.DNS sta (ZPFrameBase1),y ldy #S.UDP.DSTPORT lda /UDP.PORT.DNS sta (ZPFrameBase1),y iny lda #UDP.PORT.DNS sta (ZPFrameBase1),y ldy #S.DNS.ID lda A2osX.RANDOM16 sta (ZPFrameBase1),y sta DNSMessageID iny lda A2osX.RANDOM16+1 sta (ZPFrameBase1),y sta DNSMessageID+1 * ldy #S.DNS.F * lda /S.DNS.F.RD * sta (ZPFrameBase1),y * iny * lda #S.DNS.F.RD * sta (ZPFrameBase1),y ldy #S.DNS.QDCOUNT lda /1 sta (ZPFrameBase1),y iny lda #1 sta (ZPFrameBase1),y lda #S.DNS clc adc ZPFrameBase1 sta ZPFramePtr1 lda /S.DNS adc ZPFrameBase1+1 sta ZPFramePtr1+1 ldy #0 .2 lda DNSHostname,y sta (ZPFramePtr1),y beq .3 iny bne .2 .3 iny lda /S.DNS.QTYPE.A sta (ZPFramePtr1),y iny lda #S.DNS.QTYPE.A sta (ZPFramePtr1),y iny lda /S.DNS.QCLASS.IN sta (ZPFramePtr1),y iny lda #S.DNS.QCLASS.IN sta (ZPFramePtr1),y lda DNSHostnameLen Get hostname len again (QNAME) clc adc #6 (len+1) + Ending 0 + QTYPE + QCLASS adc #S.DNS sta ZPFrameLen1 lda #0 adc /S.DNS sta ZPFrameLen1+1 ldx #S.IPCFG.DNS ldy #S.IP.DST lda IPCFG,x beq .5 .4 lda IPCFG,x sta (ZPFrameBase1),y iny inx cpx #S.IPCFG.DNS+4 bne .4 jsr SEND.UDP.FRAME.I bcs .8 .5 ldx #S.IPCFG.DNS+4 ldy #S.IP.DST lda IPCFG,x beq .7 .6 lda IPCFG,x sta (ZPFrameBase1),y iny inx cpx #S.IPCFG.DNS+8 bne .6 jsr SEND.UDP.FRAME.I bcs .8 .7 jsr DNS.ADD.PENDING.I .8 pla >SYSCALL SYS.FreeMemA sec rts *-------------------------------------- * DNS.ADD * In: * PULLW = hostname PSTR to Add * PULLW = PTR to IP *-------------------------------------- DNS.ADD >PULLYA Get host string jsr PSTR2DNSHostName >PULLW ZPPtrIP Get host IP address lda #$80 sta DNSHostTTL+3 stz DNSHostTTL+2 stz DNSHostTTL+1 stz DNSHostTTL lda #S.DNSCACHE.STATUS.RESOLVED bra DNS.ADD.I DNS.ADD.PENDING.I lda #S.DNSCACHE.STATUS.PENDING DNS.ADD.I sta Status ldx #0 .1 lda DNS.CACHE,x beq DNS.ADD.ENTRY free ? lda DNS.CACHE+S.DNSCACHE.hNAME,x phx >SYSCALL SYS.GetMemPtrA >STYA ZPPtrDNS plx ldy #0 .2 lda DNSHostname,y cmp (ZPPtrDNS),y bne .4 and #$FF End Of String? beq DNS.UPD.ENTRY iny bne .2 .4 txa clc adc #S.DNSCACHE tax cmp #K.DNSCACHE.SIZE*S.DNSCACHE bne .1 lda DNS.CACHE+S.DNSCACHE.hNAME discard oldest entry hNAME >SYSCALL SYS.FreeMemA ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE .6 lda DNS.CACHE+S.DNSCACHE-1,x sta DNS.CACHE-1,x dex bne .6 ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE DNS.ADD.ENTRY phx ldy DNSHostnameLen iny add 1 for Ending 00 lda #0 >PUSHYA push PSTR len >PUSHBI 0 no option >SYSCALL SYS.GetMem bcc .10 plx rts .10 >STYA ZPPtrDNS txa plx sta DNS.CACHE+S.DNSCACHE.hNAME,x ldy #0 .1 lda DNSHostname,y sta (ZPPtrDNS),y iny cpy DNSHostnameLen bne .1 lda #0 sta (ZPPtrDNS),y DNS.UPD.ENTRY lda Status sta DNS.CACHE+S.DNSCACHE.STATUS,x bmi .1 pending? lda DNSMessageID sta DNS.CACHE+S.DNSCACHE.ID,x lda DNSMessageID+1 sta DNS.CACHE+S.DNSCACHE.ID+1,x bra .9 .1 lda DNSHostTTL sta DNS.CACHE+S.DNSCACHE.TTL,x lda DNSHostTTL+1 sta DNS.CACHE+S.DNSCACHE.TTL+1,x lda DNSHostTTL+2 sta DNS.CACHE+S.DNSCACHE.TTL+2,x lda DNSHostTTL+3 sta DNS.CACHE+S.DNSCACHE.TTL+3,x ldy #0 .2 lda (ZPPtrIP),y sta DNS.CACHE+S.DNSCACHE.RDATA,x inx iny cpy #4 bne .2 clc rts .9 sec rts *-------------------------------------- DNS.GETCACHE >LDYA L.DNS.CACHE clc rts *-------------------------------------- * PRIVATE *-------------------------------------- PSTR2DNSHostName >STYA ZPTmpPtr1 lda (ZPTmpPtr1) beq .9 cmp #K.DNS.MAXLEN-1 bcs .9 tay inc sta DNSHostNameLen lda #0 Ending 0 sta DNSHostName+1,y ldx #0 .1 lda (ZPTmpPtr1),y and #$7f cmp #'.' beq .2 cmp #'A' bcc .10 cmp #'Z'+1 bcs .10 adc #$20 .10 inx bra .3 .2 txa ldx #0 .3 sta DNSHostName,y dey bne .1 stx DNSHostName clc rts .9 sec rts *-------------------------------------- MAN SAVE LIB/LIBTCPIP.S.DNS LOAD LIB/LIBTCPIP.S ASM