Original from S53MV to DSP3MV@SVN Path: !S50BOX! From: S53MV @ S50BOX.SVN.EU (Matjaz) To: DSP3MV @ SVN X-Info: No login password X-BID: 898S50BOX00R ;*** S53MV - SuperVozelj V81 - 3*SCC+DMASCC - 02/09/1998 *** ;*** Tabela izjem na zacetku *** org $00000000 $00031000000001000000012000000100 $00000132000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 $00000100000001000000010000000100 ;*** Zacetni program na $100 *** nastart equ $31000 ;zacetni naslov v RAMu cputip equ $3fff0 ;vrsta mikroprocesorja dmatip equ $3fff8 ;vrsta DMA vezja ori #$0700,sr ;prioriteta proc. 7 prepreci prekinitve moveq #0,d0 ;postavi VBR na tabelo izjem v EPROMu movec d0,vbr clr.l (#dmatip) ;nicla: ni DMA vezja! tst.b (#dsccac) ;poglej, ce je DMA ploscica v vodilu? move.l #68450,(#dmatip) hex120 moveq #1,d0 ;vkljuci cache MC68020 / illegal MC68010 movec d0,cacr move.l #68020,(#cputip) bra.b ksklad hex132 move.l #68010,(#cputip) ksklad movea.l #nastart,a7 ;stack pointer reset ;resetira vse vhodno/izhodne enote move.w #$17ff,d0 ;prepisi 24kbytni EPROM v RAM movea.l #$0,a0 movea.l #nastart,a1 naklada move.l (a0)+,(a1)+ dbf d0,naklada movea.l #zacetek,a0 ;preskok na program v RAMu adda.l #nastart,a0 jmp (a0) zacetek nop ;*** Inicializacija programa - osnovni naslov programa v A6 *** org $00000000 ori #$0700,sr ;prioriteta proc. 7 prepreci prekinitve!! lea #$fffa(pc),a6 ;osnovni naslov v A6 movea.l #nastart,a7 ;stack pointer reset ;resetira vse vhodno/izhodne enote movea.l #nastart,a0 ;ocisti tabelo izjem v RAMu moveq #$3f,d0 taizjem move.l #$100,(a0)+ dbf d0,taizjem movea.l #nastart,a0 ;postavi vbr v RAM movec a0,vbr move.l a6,d0 ;postavi autovector 1,2,3 naslov add.l #int1sub,d0 move.l d0,#$0064(a0) ;AV INT1 move.l a6,d0 add.l #int2sub,d0 move.l d0,#$0068(a0) ;AV INT2 move.l a6,d0 add.l #int3sub,d0 move.l d0,#$006c(a0) ;AV INT3 bsr.w iniblok ;inicializacija spomina bsr.w iniscc ;inicializacija SCCja bsr.w inistev ;inicializacija urnega stevca tst.l (#dmatip) ;DMA na vodilu? beq.b nimadma bsr.w inidma ;inicializacija DMA-SCC kartice nimadma bsr.w inivv ;inicializacija vzporednega vmesnika andi #$f8ff,sr ;prioriteta procesorja 0 bra.w gzanka ;skoci na glavni program ;*** PODPROGRAMI ZA SCC 8530 BREZ DMAC ************************ ;*** Naslovi SCCjev 8530 1,2,3 in konstante za hitrosti *** kanalbc equ $e0009 ;SCC#1 naslov B command kanalbd equ $e000b ;SCC#1 naslov B data kanalac equ $e000d ;SCC#1 naslov A command kanalad equ $e000f ;SCC#1 naslov A data kanaldc equ $e0011 ;SCC#2 naslov B command kanaldd equ $e0013 ;SCC#2 naslov B data kanalcc equ $e0015 ;SCC#2 naslov A command kanalcd equ $e0017 ;SCC#2 naslov A data kanalfc equ $e0019 ;SCC#3 naslov B command kanalfd equ $e001b ;SCC#3 naslov B data kanalec equ $e001d ;SCC#3 naslov A command kanaled equ $e001f ;SCC#3 nalsov A data aoffset equ 4 ;naslov A minis naslov B doffset equ 2 ;naslov data minus naslov cmd clock equ 4915200 ;takt RTxC v Hz msekmin equ 60002 ;popravek zaradi celostevilcnega deljenja ms bitra equ 38400 ;hitrosti kanalov v bps bitrb equ 38400 bitrc equ 1200 bitrd equ 38400 bitre equ 2400 bitrf equ 1200 txglaa equ 20 ;dolzine glave paketa okvirjev - txdelay v ms txglab equ 20 txglac equ 400 txglad equ 20 txglae equ 200 txglaf equ 400 txrepa equ 3 ;dolzine repov okvirjev - txtail v ms txrepb equ 3 txrepc equ 50 txrepd equ 3 txrepe equ 25 txrepf equ 50 kponava equ 1000 ;cakanje na ponovitev - FRACK (T1) v ms kponavb equ 1000 kponavc equ 8000 kponavd equ 1000 kponave equ 4000 kponavf equ 8000 kponavs equ 3000 ;cakanje na ponovitev - FRACK pri SABM v ms kpodga equ 100 ;cakanje za potrdilni odgovor (T2) kpodgb equ 100 kpodgc equ 2000 kpodgd equ 100 kpodge equ 1000 kpodgf equ 2000 tecnoa equ 16384 ;tecnoba TXa (p-persistance modulo 65536) tecnob equ 16384 tecnoc equ 16384 tecnod equ 16384 tecnoe equ 16384 tecnof equ 16384 cakafak equ 10 ;mnogokratnik kponav cakanja na RNR digcaka equ 3000 ;cakanje pred podiranjem posredovalnih zvez ms mponovi equ 30 ;najvec ponovitev - RETRY (N2), v vseh slucajih mejacas equ 2160000 ;casovna omejitev neaktivne zveze 36 minut! kokocas equ 300000 ;kokodakanje vsakih 5 minut kokoca1 equ 10000 ;prvo kokodakanje po 10 sekundah poticas equ 420000 ;oddaja tabele poti vsakih 7 minut potica1 equ 60000 ;prva oddaja poti po 1 minuti mejapot equ 15 ;starostna meja odziva za oddajo poti (minute) geslo $62723174736132637A693373386C6B7A31613878 ;S5-95 geslo $63686530637678667A6179723470753764663963 $6E617A733269656D777275736735716631726D32 $636D626B6f6368313274356A36646C6237786D76 mojznak $a66a728882b2a4828caaa840 ;'S59DAY':'RAFUT ', ASCII*2 ;*** Reset in inicializacija SCCjev 8530 *** iniscc movea.l #kanalbc,a0 ;popolni reset SCC#1 bsr.w iniscc1 movea.l #kanaldc,a0 ;popolni reset SCC#2 bsr.w iniscc1 movea.l #kanalfc,a0 ;popolni reset SCC#3 bsr.w iniscc1 move.l #kponavs,#kponav(a5) ;SABM frack move.w #kparam,d7 ;inicializacija kanala 1 move.l #bitra,d0 movea.l #kanalac,a0 move.l #txglaa,#txglava(a5,d7.w) move.l #txrepa,#txrep(a5,d7.w) move.l #kponava,#kponav(a5,d7.w) move.l #kpodga,#kpodg(a5,d7.w) move.w #tecnoa,#tecnoba(a5,d7.w) bsr.w iniscc2 addi.w #kparam,d7 ;inicializacija kanala 2 move.l #bitrb,d0 movea.l #kanalbc,a0 move.l #txglab,#txglava(a5,d7.w) move.l #txrepb,#txrep(a5,d7.w) move.l #kponavb,#kponav(a5,d7.w) move.l #kpodgb,#kpodg(a5,d7.w) move.w #tecnob,#tecnoba(a5,d7.w) bsr.w iniscc2 addi.w #kparam,d7 ;inicializacija kanala 3 move.l #bitrc,d0 movea.l #kanalcc,a0 move.l #txglac,#txglava(a5,d7.w) move.l #txrepc,#txrep(a5,d7.w) move.l #kponavc,#kponav(a5,d7.w) move.l #kpodgc,#kpodg(a5,d7.w) move.w #tecnoc,#tecnoba(a5,d7.w) bsr.w iniscc2 addi.w #kparam,d7 ;inicializacija kanala 4 move.l #bitrd,d0 movea.l #kanaldc,a0 move.l #txglad,#txglava(a5,d7.w) move.l #txrepd,#txrep(a5,d7.w) move.l #kponavd,#kponav(a5,d7.w) move.l #kpodgd,#kpodg(a5,d7.w) move.w #tecnod,#tecnoba(a5,d7.w) bsr.w iniscc2 addi.w #kparam,d7 ;inicializacija kanala 5 move.l #bitre,d0 movea.l #kanalec,a0 move.l #txglae,#txglava(a5,d7.w) move.l #txrepe,#txrep(a5,d7.w) move.l #kponave,#kponav(a5,d7.w) move.l #kpodge,#kpodg(a5,d7.w) move.w #tecnoe,#tecnoba(a5,d7.w) bsr.w iniscc2 addi.w #kparam,d7 ;inicializacija kanala 6 move.l #bitrf,d0 movea.l #kanalfc,a0 move.l #txglaf,#txglava(a5,d7.w) move.l #txrepf,#txrep(a5,d7.w) move.l #kponavf,#kponav(a5,d7.w) move.l #kpodgf,#kpodg(a5,d7.w) move.w #tecnof,#tecnoba(a5,d7.w) bsr.w iniscc2 rts ;*** Inicializacija SCC kanala (A0) *** iniscc2 move.l #clock,d1 ;izracunaj modulo stevca v D1.W lsr.l #8,d1 ;deli takt z 256 lsr.l #2,d0 ;deli bitrate s 4 divu d0,d1 subq.w #2,d1 movea.l #iniscc5,a1 adda.l a6,a1 move.b d1,#17(a1) lsr.w #8,d1 move.b d1,#19(a1) moveq #35,d0 iniscc6 move.b (a1)+,(a0) ;zanka prepisovanja podatkov tst.l (a5) dbf d0,iniscc6 rts iniscc5 $04e0 ;WR4 SDLC mode $0100 ;WR1 INT disable $0aa0 ;WR10 CRC preset 1, NRZI, flag idle $077e ;WR7 flag $03c8 ;WR3 RX 8bits/character $0561 ;WR5 TX 8bits/character, SDLC CRC $0e60 ;WR14 disable DPLL & BRG $0b7f ;WR11 NOXTAL, RXclk=TXclk=TRxC=DPLL $0c00 ;WR12 BRG lower byte $0d00 ;WR13 BRG upper byte $0ee0 ;WR14 set NRZI mode $0e80 ;WR14 set source = BR generator, RTxC $0e20 ;WR14 enter search mode $0e01 ;WR14 enable BRG $03c9 ;WR3 RX enable $0569 ;WR5 TX enable, brez RTS!!! $0f50 ;WR15 TX Underrun/EOM IE, sync/hunt IE $0113 ;WR1 RX INT all chr, TX int & spec cond. ;*** Popolni reset SCCja cmd=(A0) *** iniscc1 move.b (a0),d0 ;precita RR0, resetira kazalec movea.l #iniscc3,a1 adda.l a6,a1 moveq #5,d0 iniscc4 move.b (a1)+,(a0) ;zanka prepisovanja podatkov tst.l (a5) tst.l (a5) dbf d0,iniscc4 rts iniscc3 $09c0 ;WR9 popolni reset SCCja $0200 ;WR2 INT vector #0 $0908 ;WR9 MIE, status low ;*** Prekinitveni podprogrami za SCCje 8530 *** int1sub movem.l #$f0c0,-(a7) ;INT1 za SCC 8530 #3 movea.l #kanalfc,a1 ;kanal 6 move.w #efparam,d3 bra.b intsub int2sub movem.l #$f0c0,-(a7) ;INT2 za SCC 8530 #2 movea.l #kanaldc,a1 ;kanal 4 move.w #cdparam,d3 bra.b intsub int3sub movem.l #$f0c0,-(a7) ;INT3 za SCC 8530 #1 movea.l #kanalbc,a1 ;kanal 2 move.w #abparam,d3 intsub move.b #2,(a1) ;RR2 - poisci kanal A ali B? tst.l (a5) btst #3,(a1) beq.w intsub1 addq.l #aoffset,a1 subi.l #kparam,d3 intsub1 move.b (a1),d2 ;RR0 v D2.high_word swap d2 tst.l (a5) move.b #1,(a1) ;RR1 v D2.low_word tst.l (a5) move.b (a1),d2 cmpi.w #4,#txstat(a5,d3.w) ;oddaja bloka? beq.b intsub6 move.b #$28,(a1) ;reset txint pending bra.b intsub7 intsub6 btst #18,d2 ;TX buffer empty? beq.b intsub7 subi.w #1,#txkazal(a5,d3.w) ;znizaj stevec znakov bmi.b intsub8 ;konec okvirja movea.l #bltxnas(a5,d3.w),a0 ;znak v oddajnik move.b (a0)+,#doffset(a1) move.l a0,#bltxnas(a5,d3.w) bra.b intsub7 intsub8 move.b #$e8,(a1) ;res txint pending, underrun/eom latch move.l #milisek(a5),#txstev(a5,d3.w) move.w #5,#txstat(a5,d3.w) ;stanje caka konec CRCja intsub7 btst #16,d2 ;nov znak iz sprejemnika? beq.b intsub2 movea.l #bloknas(a5,d3.w),a0 ;naslov sprejemnega bloka move.w #blokkaz(a5,d3.w),d0 ;kazalec sprejetih znakov move.b #doffset(a1),d1 ;precita sprejeti znak v D1 cmpi.w #dolblok,d0 ;prevec sprejetih znakov v okvirju? bcc.b intsub2 move.b d1,#0(a0,d0.w) ;precitani znak v blok addq.w #1,#blokkaz(a5,d3.w) ;shrani kazalec bra.b intsu11 intsub2 move.b #$10,(a1) ;reset ext/status interrupt intsu11 move.l d2,d0 ;konec okvirja: abort? sync/hunt? andi.l #$00900000,d0 bne.w intsub3 ;pokvarjen okvir! btst #7,d2 ;konec okvirja: zastavica? beq.w intsub4 ;ni se konec okvirja.... eori.b #$07,d2 ;okvir sprejet v redu? andi.b #$6e,d2 bne.b intsub3 ;pokvarjen okvir! move.w #blokkaz(a5,d3.w),d0 ;izracun dolzine okvirja subq.w #2,d0 ;odsteje dva CRC znaka subi.w #bokvir,d0 ;odsteje offset zacetnega znaka cmpi.w #mindol,d0 ;premajhen okvir? bcs.b intsub3 cmpi.w #maxdol,d0 ;prevelik okvir? bcc.b intsub3 movea.l #bloknas(a5,d3.w),a0 ;shrani izracunano dolzino move.w d0,(a0) move.w #bloknrx(a5,d3.w),d0 ;stevilka sprejetega bloka cmp.w #bloknrx(a5),d0 ;blok za v smeti? beq.b intsub5 movea.l #bvmesni(a5),a0 ;naslov vmesnika ori #$0700,sr ;prepreci vse prekinitve!!!!!!!!!!!!!!!!! move.w (a0),d1 ;pisalni kazalec v vmesniku move.w d1,d2 addq.w #2,d1 ;povecaj kazalec cmpi.w #dolvmes,d1 ;kontrola polozaja kazalca bcs.w intsub9 clr.w d1 intsub9 cmp.w #2(a0),d1 ;kontrola prostora v vmesniku beq.b intsub3 ;vmesnik poln, zavrze okvir! move.w d0,#4(a0,d2.w) ;blok v vmesnik move.w d1,(a0) ;novi kazalec intsub5 move.w #bloknov(a5,d3.w),d1 ;daj nov blok sprejemniku addi.w #2,d1 andi.w #$000e,d1 move.w d1,#bloknov(a5,d3.w) add.w d3,d1 move.w #0(a5,d1.w),d0 ;vzemi nov blok bne.b intsu10 ;blok ne obstaja? move.w #bloknrx(a5),d0 ;ni prostora - blok za v smeti! intsu10 clr.w #0(a5,d1.w) move.w d0,#bloknrx(a5,d3.w) ;stevilka bloka bsr.w naslov move.l a0,#bloknas(a5,d3.w) ;naslov bloka intsub3 move.w #bokvir,#blokkaz(a5,d3.w) ;resetira slab okvir move.b #$30,(a1) ;error reset command intsub4 movem.l (a7)+,#$030f rte ;*** Preklop sprejem/oddaja in nazaj, precita stanje DCD *** preklop move.w #kparam,d7 ;kanal 1 movea.l #kanalac,a2 movea.l #kanalad,a1 bsr.w preklo1 addi.w #kparam,d7 ;kanal 2 movea.l #kanalbc,a2 movea.l #kanalbd,a1 bsr.w preklo1 addi.w #kparam,d7 ;kanal 3 movea.l #kanalcc,a2 movea.l #kanalcd,a1 bsr.w preklo1 addi.w #kparam,d7 ;kanal 4 movea.l #kanaldc,a2 movea.l #kanaldd,a1 bsr.w preklo1 addi.w #kparam,d7 ;kanal 5 movea.l #kanalec,a2 movea.l #kanaled,a1 bsr.w preklo1 addi.w #kparam,d7 ;kanal 6 movea.l #kanalfc,a2 movea.l #kanalfd,a1 bsr.w preklo1 rts preklo1 move.b (a2),#statdcd(a5,d7.w) ;precita status DCD move.w #txstat(a5,d7.w),d0 ;status sprejem/oddaja bne.b preklo2 rts ;ostane na sprejemu preklo2 cmpi.w #1,d0 ;zahteva za oddajo? bne.b preklo3 move.l #milisek(a5),d0 ;kuzapazi DCD/nakljucno? sub.l #txstev(a5,d7.w),d0 cmp.l #kponav(a5,d7.w),d0 bcc.b preklo4 move.l #milisek(a5),d0 ;nakljucno cakanje za oddajo? sub.l #txstevp(a5,d7.w),d0 cmp.l #txglava(a5,d7.w),d0 bcc.b prekl12 rts prekl12 move.l #milisek(a5),#txstevp(a5,d7.w) ;resetira stevec btst #3,#statdcd(a5,d7.w) ;pogleda in caka na DCD? beq.b prekl13 rts prekl13 bsr.w psevnak ;tecnoba se primerja s psevdonak. stev. cmp.w #tecnoba(a5,d7.w),d0 bcs.b preklo4 rts preklo4 ori #$0700,sr ;prepreci prekinitve move.b #5,(a2) ;WR5 vkljuci RTS!!! tst.l (a5) move.b #$6b,(a2) andi #$f8ff,sr ;omogoci prekinitve move.l #milisek(a5),#txstev(a5,d7.w) ;resetira stevce move.l #milisek(a5),#txstevp(a5,d7.w) move.w #2,#txstat(a5,d7.w) ;stanje oddaja sinhroniz. rts preklo3 cmpi.w #2,d0 ;oddaja sinhronizacijske glave? bne.b preklo5 move.l #milisek(a5),d0 ;kontrola casa? sub.l #txstev(a5,d7.w),d0 cmp.l #txglava(a5,d7.w),d0 bcc.b preklo6 rts ;cas se se ni iztekel preklo6 move.w #3,#txstat(a5,d7.w) ;stanje pripravljena oddaja rts preklo5 cmpi.w #3,d0 ;zacni oddajo bloka podatkov? bne.b preklo7 move.w #blokntx(a5,d7.w),d0 ;sprosti prejsnji blok bsr.w sprosti move.w d7,d0 ;offset kanala v D0.W bsr.w izokvir move.w d0,#blokntx(a5,d7.w) ;stevilka okvirja beq.b preklo9 ;konec okvirjev za oddajo? bsr.w naslov move.w (a0),#txkazal(a5,d7.w) ;stevilo znakov (.W) adda.l #bokvir,a0 ;zacetek okvirja v bloku move.l a0,#bltxnas(a5,d7.w) ;naslov okvirja move.b #$80,(a2) ;reset TX CRC generator subi.w #1,#txkazal(a5,d7.w) ;odstej prvi znak addi.l #1,#bltxnas(a5,d7.w) move.l #milisek(a5),#txstev(a5,d7.w) ;kuzapazi za TX move.w #4,#txstat(a5,d7.w) ;stanje oddaja okvirja move.b (a0),(a1) ;oddaj prvi znak okvirja rts preklo7 cmpi.w #4,d0 ;oddaja okvirja? bne.b preklo8 move.l #milisek(a5),d0 sub.l #txstev(a5,d7.w),d0 cmp.l #kponav(a5,d7.w),d0 bcc.b prekl11 rts ;caka oddajo okvirja prekl11 move.w #3,#txstat(a5,d7.w) ;napaka > stanje pripravljen rts preklo8 move.l #milisek(a5),d0 ;stanje >=5 ...oddaja CRCjev rep sub.l #txstev(a5,d7.w),d0 cmp.l #txrep(a5,d7.w),d0 bcc.b prekl10 rts ;caka konec CRCjevega repa prekl10 move.w #3,#txstat(a5,d7.w) ;stanje pripravljena oddaja rts preklo9 move.w #0,#txstat(a5,d7.w) ;stanje sprejem ori #$0700,sr ;prepreci prekinitve move.b #5,(a2) ;WR5 izkljuci RTS!!! tst.l (a5) move.b #$69,(a2) andi #$f8ff,sr ;omogoci prekinitve rts ;*** PODPROGRAMI ZA DMA-SCC PLOSCICO ************************** ;*** Naslovi DMA MC68450 in SCC Z8530 dmatxb equ $1c0000 ;DMA naslov registrov kanala #0 dmarxb equ $1c0040 ;DMA naslov registrov kanala #1 dmatxa equ $1c0080 ;DMA naslov registrov kanala #2 dmarxa equ $1c00c0 ;DMA naslov registrov kanala #3 dmagcr equ $1c00ff ;DMA naslov GCR dsccbc equ $1e0001 ;SCC naslov B command dsccbd equ $1e0003 ;SCC naslov B data dsccac equ $1e0005 ;SCC naslov A command dsccad equ $1e0007 ;SCC naslov A data pclock equ 6144000 ;takt PCLK v Hz bitrg equ 19200 ;hitrosti taktov CLKOUT (TRxC) bitrh equ 19200 txglag equ 5 ;dolzine glave paketa okvirjev - txdelay v ms txglah equ 5 txrepg equ 1 ;dolzine repov okvirjev - txtail v ms txreph equ 1 kponavg equ 70 ;cakanje na ponovitev - FRACK (T1) v ms kponavh equ 70 kpodgg equ 10 ;cakanje za potrdilni odgovor (T2) kpodgh equ 10 tecnog equ 16384 ;tecnoba TXa (p-persistance modulo 65536) tecnoh equ 16384 ;*** Inicializacija za 4 kanale DMA vezja *** inidma move.w #kparam7,d7 ;inicializacija konstant kanala 7 move.l #txglag,#txglava(a5,d7.w) move.l #txrepg,#txrep(a5,d7.w) move.l #kponavg,#kponav(a5,d7.w) move.l #kpodgg,#kpodg(a5,d7.w) move.w #tecnog,#tecnoba(a5,d7.w) move.w #kparam8,d7 ;inicializacija konstant kanala 8 move.l #txglah,#txglava(a5,d7.w) move.l #txreph,#txrep(a5,d7.w) move.l #kponavh,#kponav(a5,d7.w) move.l #kpodgh,#kpodg(a5,d7.w) move.w #tecnoh,#tecnoba(a5,d7.w) tst.l (a5) move.b #0,(#dmagcr) ;inicializacija DMA vezja tst.l (a5) movea.l #dmarxa,a0 move.w #kparam7,d3 movea.l #dsccad,a1 bsr.b inidma1 movea.l #dmarxb,a0 move.w #kparam8,d3 movea.l #dsccbd,a1 bsr.b inidma1 bsr.w inidscc rts inidma1 move.b #$10,#7(a0) ;CCR: SAB=00010000 ;ini RX DMA tst.w (a5) move.b #$80,#4(a0) ;DCR: XRM=10 DTYP=00 DPS=0 PCL=00 tst.w (a5) move.b #$82,#5(a0) ;OCR: DIR=1 SIZE=00 CHAIN=00 REQG=10 tst.w (a5) move.b #$04,#6(a0) ;SCR: MAC=01 DAC=00 tst.w (a5) move.w #maxdol,#10(a0) ;MTC=maxdol move.l #bloknas(a5,d3.w),d0 addi.l #bokvir,d0 move.w d0,#14(a0) ;MAR.low tst.w (a5) swap d0 move.w d0,#12(a0) ;MAR.high tst.w (a5) move.l a1,d0 move.w d0,#22(a0) ;DAR.low tst.w (a5) swap d0 move.w d0,#20(a0) ;DAR.high tst.w (a5) move.b #5,#41(a0) ;MFC=5 tst.w (a5) move.b #0,#45(a0) ;CPR=0 tst.w (a5) move.b #5,#49(a0) ;DFC=5 tst.w (a5) move.b #$ff,(a0) ;CSR: reset=$ff tst.w (a5) move.b #$80,#7(a0) ;CCR: STR=10000000 rts ;*** Inicializacija SCCja za kanale 7 in 8 *** inidscc movea.l #dsccac,a0 move.b (a0),d0 ;precita RR0, resetira kazalce movea.l #inidsc4,a1 adda.l a6,a1 moveq #5,d0 inidsc5 move.b (a1)+,(a0) tst.l (a5) tst.l (a5) dbf d0,inidsc5 move.l #bitrg,d0 ;kanal 7 bsr.b inidsc1 movea.l #dsccbc,a0 ;kanal 8 move.l #bitrh,d0 bsr.b inidsc1 rts inidsc1 move.l #pclock,d1 ;izracunaj modulo stevca v D1.W lsr.l #8,d1 ;deli takt z 256 lsr.l #2,d0 ;deli hitrost s 4 divu d0,d1 subq.w #2,d1 movea.l #inidsc2,a1 adda.l a6,a1 move.b d1,#17(a1) lsr.w #8,d1 move.b d1,#19(a1) moveq #35,d0 ;zanka prepisovanja podatkov inidsc3 move.b (a1)+,(a0) tst.l (a5) dbf d0,inidsc3 rts inidsc2 $04e0 ;WR4 SDLC mode $0100 ;WR1 INT disable $0aa0 ;WR10 CRC preset 1, NRZI, flag idle $077e ;WR7 flag $03c8 ;WR3 RX 8bits/character $0561 ;WR5 TX 8bits/character, SDLC CRC $0e66 ;WR14 disable DPLL & BRG, REQ, PCLK>BRG $0b07 ;WR11 NOXTAL, RTxC>RXclk=TXclk, DPLL>TRxC $0c00 ;WR12 BRG lower byte $0d00 ;WR13 BRG upper byte $0ee6 ;WR14 set NRZI mode, REQ $0e86 ;WR14 set source = BR generator (PCLK), REQ $0e26 ;WR14 enter search mode, REQ $0e07 ;WR14 enable BRG, REQ $03c9 ;WR3 RX enable $0569 ;WR5 TX enable, brez RTS!!! $0f80 ;WR15 break/abort IE $01f9 ;WR1 DMA RX, RX INT on special condition, EXT INT inidsc4 $09c0 ;WR9 popolni reset SCCja $0200 ;WR2 INT vector #0 $0900 ;WR9 status low, izkljucen MIE ;*** Zanka za obdelavo DMA-SCC RX in TX okvirjev *** dmazank movea.l #dsccac,a2 ;RR3 preglej stanje SCC RX move.b #3,(a2) tst.l (a5) moveq #0,d0 move.b (a2),d0 move.w #kparam8,d3 ;oddaja kanala 8 prepreci sprejem? cmpi.w #4,#txstat(a5,d3.w) bne.b dmazan1 moveq #0,d0 dmazan1 move.w #kparam7,d3 ;oddaja kanala 7 prepreci sprejem? cmpi.w #4,#txstat(a5,d3.w) bne.b dmazan2 moveq #0,d0 dmazan2 move.w d0,-(a7) ;dmazanka za kanal 7 lsr.w #3,d0 movea.l #dmarxa,a3 bsr.w rxdma movea.l #dmatxa,a3 bsr.w txdma move.w (a7)+,d0 ;dmazanka za kanal 8 cmpi.w #4,#txstat(a5,d3.w) ;preklop na oddajo kanala 7? bne.b dmazan3 moveq #0,d0 dmazan3 movea.l #dsccbc,a2 movea.l #dmarxb,a3 move.w #kparam8,d3 bsr.w rxdma movea.l #dmatxb,a3 bsr.w txdma rts ;*** Obdelava DMA-SCC sprejetih okvirjev *** rxdma andi.b #$05,d0 ;SCC RXIP & EXTSTATIP? bne.b rxdma6 rts rxdma6 move.b #3,(a2) ;WR3 RX disable tst.l (a5) move.b #$c8,(a2) moveq #0,d1 ;pobrisi dolzino okvirja andi.b #$01,d0 ;break/abort IP? bne.b rxdma1 move.b #1,(a2) ;RR1 - kontrola sprejetega okvirja? tst.l (a5) move.b (a2),d0 andi.b #$ee,d0 cmpi.b #$86,d0 bne.b rxdma1 sub.w #10(a3),d1 ;dolzina okvirja iz MTC v D1.W tst.w (a5) move.b #1,(a2) ;WR1 preklop na WAIT dodatni DREQ impulz tst.l (a5) move.b #$b9,(a2) tst.l (a5) move.b #1,(a2) ;WR1 preklop nazaj na DMA tst.l (a5) move.b #$f9,(a2) tst.w (a5) sub.w #10(a3),d1 ;popravljena dolzina v D1.W asr.w #1,d1 addi.w #maxdol,d1 subq.w #2,d1 ;odsteje CRC znaka viska bpl.b rxdma1 moveq #0,d1 rxdma1 move.b #$30,(a2) ;WR0 error reset command tst.l (a5) move.b #$10,(a2) ;WR0 reset ext/status interrupt cmpi.w #mindol,d1 ;sprejet dovolj dolg nov okvir? bcs.b rxdma2 movea.l #bloknas(a5,d3.w),a0 ;shrani izracunano dolzino move.w d1,(a0) move.w #bloknrx(a5,d3.w),d0 ;stevilka sprejetega bloka cmp.w #bloknrx(a5),d0 ;blok za v smeti? beq.b rxdma3 ori #$0700,sr ;zascita pred prekinitvami! movea.l #bvmesni(a5),a0 ;naslov vmesnika move.w (a0),d1 ;pisalni kazalec v vmesniku move.w d1,d2 addq.w #2,d1 ;povecaj kazalec cmpi.w #dolvmes,d1 ;kontrola polozaja kazalca bcs.w rxdma4 clr.w d1 rxdma4 cmp.w #2(a0),d1 ;kontrola prostora v vmesniku bne.b rxdma7 ;vmesnik poln, ponovno uporabi zavrzeni! andi #$f8ff,sr ;ponovno omogoci prekinitve bra.b rxdma2 rxdma7 move.w d0,#4(a0,d2.w) ;blok v vmesnik move.w d1,(a0) ;novi kazalec andi #$f8ff,sr ;ponovno omogoci prekinitve rxdma3 move.w #bloknov(a5,d3.w),d1 ;daj nov blok sprejemniku addi.w #2,d1 andi.w #$000e,d1 move.w d1,#bloknov(a5,d3.w) add.w d3,d1 move.w #0(a5,d1.w),d0 ;vzemi nov blok bne.b rxdma5 ;blok ne obstaja? move.w #bloknrx(a5),d0 ;ni prostora - blok za v smeti! rxdma5 clr.w #0(a5,d1.w) move.w d0,#bloknrx(a5,d3.w) ;stevilka novega bloka bsr.w naslov move.l a0,#bloknas(a5,d3.w) ;naslov novega bloka rxdma2 tst.w (a5) move.b #$10,#7(a3) ;CCR: SAB=00010000 ;ini RX DMA tst.w (a5) move.b #$80,#4(a3) ;DCR: XRM=10 DTYP=00 DPS=0 PCL=00 tst.w (a5) move.b #$82,#5(a3) ;OCR: DIR=1 SIZE=00 CHAIN=00 REQG=10 tst.w (a5) move.b #$04,#6(a3) ;SCR: MAC=01 DAC=00 tst.w (a5) move.w #maxdol,#10(a3) ;MTC=maxdol move.l #bloknas(a5,d3.w),d0 addi.l #bokvir,d0 move.w d0,#14(a3) ;MAR.low tst.w (a5) swap d0 move.w d0,#12(a3) ;MAR.high move.l a2,d0 addi.l #doffset,d0 move.w d0,#22(a3) ;DAR.low tst.w (a5) swap d0 move.w d0,#20(a3) ;DAR.high tst.w (a5) move.b #5,#41(a3) ;MFC=5 tst.w (a5) move.b #0,#45(a3) ;CPR=0 tst.w (a5) move.b #5,#49(a3) ;DFC=5 tst.w (a5) move.b #$ff,(a3) ;CSR: reset=$ff tst.w (a5) move.b #$80,#7(a3) ;CCR: STR=10000000 tst.w (a5) move.b #3,(a2) ;WR3 RX enable tst.l (a5) move.b #$c9,(a2) rts ;*** DMA preklop sprejem/oddaja, cita stanje DCD *** txdma move.b (a2),#statdcd(a5,d3.w) ;precita status DCD move.w #txstat(a5,d3.w),d0 ;status sprejem/oddaja bne.b txdma1 rts ;ostane na sprejemu txdma1 cmpi.w #1,d0 ;zahteva za oddajo? bne.b txdma2 move.l #milisek(a5),d0 ;kuzapazi DCD/nakljucno? sub.l #txstev(a5,d3.w),d0 cmp.l #kponav(a5,d3.w),d0 bcc.b txdma3 move.l #milisek(a5),d0 ;nakljucno cakanje za oddajo? sub.l #txstevp(a5,d3.w),d0 cmp.l #txglava(a5,d3.w),d0 bcc.b txdma4 rts txdma4 move.l #milisek(a5),#txstevp(a5,d3.w) ;resetira stevec btst #3,#statdcd(a5,d3.w) ;pogleda in caka na DCD? beq.b txdma5 rts txdma5 bsr.w psevnak ;tecnoba se primerja s psevdonak. stev. cmp.w #tecnoba(a5,d3.w),d0 bcs.b txdma3 rts txdma3 move.b #5,(a2) ;WR5 vkljuci RTS!!! tst.l (a5) move.b #$6b,(a2) move.l #milisek(a5),#txstev(a5,d3.w) ;resetira stevce move.l #milisek(a5),#txstevp(a5,d3.w) move.w #2,#txstat(a5,d3.w) ;stanje oddaja sinhroniz. rts txdma2 cmpi.w #2,d0 ;oddaja sinhronizacijske glave? bne.b txdma6 move.l #milisek(a5),d0 ;kontrola casa? sub.l #txstev(a5,d3.w),d0 cmp.l #txglava(a5,d3.w),d0 bcc.b txdma7 rts ;cas se se ni iztekel txdma7 move.w #3,#txstat(a5,d3.w) ;stanje pripravljena oddaja rts txdma6 cmpi.w #3,d0 ;zacni oddajo bloka podatkov? bne.w txdma8 move.w #blokntx(a5,d3.w),d0 ;sprosti prejsnji blok bsr.w sprosti move.w d3,d0 ;offset kanala v D0.W bsr.w izokvir move.w d0,#blokntx(a5,d3.w) ;stevilka okvirja beq.w txdma11 ;konec okvirjev za oddajo? bsr.w naslov move.b #$10,#7(a3) ;CCR: SAB=00010000 ;ini TX DMA tst.w (a5) move.b #$80,#4(a3) ;DCR: XRM=10 DTYP=00 DPS=0 PCL=00 tst.w (a5) move.b #$03,#5(a3) ;OCR: DIR=0 SIZE=00 CHAIN=00 REQG=11 tst.w (a5) move.b #$04,#6(a3) ;SRC: MAC=01 DAC=00 move.l a2,d0 addi.l #doffset,d0 move.w d0,#22(a3) ;DAR.low tst.w (a5) swap d0 move.w d0,#20(a3) ;DAR.high tst.w (a5) move.b #5,#41(a3) ;MFC=5 tst.w (a5) move.b #0,#45(a3) ;CPR=0 tst.w (a5) move.b #5,#49(a3) ;DFC=5 tst.w (a5) move.w (a0),#10(a3) ;MTC: stevilo znakov (.W) tst.w (a5) adda.l #bokvir,a0 ;zacetek okvirja v bloku move.l a0,d0 move.w d0,#14(a3) ;MAR.low tst.w (a5) swap d0 move.w d0,#12(a3) ;MAR.high: naslov okvirja tst.w (a5) move.b #$80,(a2) ;reset TX CRC generator tst.w (a5) move.b #$ff,(a3) ;CSR: reset=$ff tst.w (a5) ori #$0700,sr ;zascita pred prekinitvami! move.b #$80,#7(a3) ;CCR STR 10000000 move.l #milisek(a5),#txstev(a5,d3.w) ;kuzapazi za TX move.w #4,#txstat(a5,d3.w) ;stanje oddaja okvirja move.b #$c0,(a2) ;reset TX underrun/eom latch andi #$f8ff,sr ;ponovno omogoci prekinitve rts txdma8 cmpi.w #4,d0 ;oddaja okvirja? bne.b txdma9 move.l #milisek(a5),d0 sub.l #txstev(a5,d3.w),d0 cmp.l #kponav(a5,d3.w),d0 bcc.b txdma10 move.b (a3),d0 ;CSR: konec delovanja DMA vezja? andi.b #$80,d0 bne.b txdma13 rts ;caka oddajo okvirja txdma13 move.w #5,#txstat(a5,d3.w) ;konec DMA > oddaja repa move.l #milisek(a5),#txstev(a5,d3.w) rts txdma10 move.w #3,#txstat(a5,d3.w) ;napaka > stanje pripravljen rts txdma9 move.l #milisek(a5),d0 ;stanje >=5 ...oddaja CRCjev rep sub.l #txstev(a5,d3.w),d0 cmp.l #txrep(a5,d3.w),d0 bcc.b txdma12 rts ;caka konec CRCjevega repa txdma12 move.w #3,#txstat(a5,d3.w) ;stanje pripravljena oddaja rts txdma11 move.w #0,#txstat(a5,d3.w) ;stanje sprejem move.b #5,(a2) ;WR5 izkljuci RTS!!! tst.l (a5) move.b #$69,(a2) rts ;*** Naslovi urnega stevca *** stevec1 equ $e0003 ;naslov stevca 1 stevec2 equ $e0005 ;naslov stevca 2 stevcmd equ $e0007 ;naslov komandnega registra stevcev ;*** Inicializacija urnega stevca *** inistev move.b #$50,(#stevcmd) ;stevec 1 /256 move.b #$ff,(#stevec1) move.l #clock,d0 ;izracunaj modulo stevca 2 za 1ms divu #1000,d0 move.b #$b6,(#stevcmd) ;nastavi stevec 2 move.b d0,(#stevec2) lsr.w #8,d0 move.b d0,(#stevec2) rts ;*** Precitaj urni stevec v #milisek(a5), steje #minute(a5) *** urastev addq.l #1,#hitstev(a5) ;stevec hitrosti glavne zanke clr.l d0 move.b (#stevec1),d0 ;precitaj stevec move.b (#stevec1),d1 ;preveri citanje cmp.b d0,d1 beq.b uraste1 ;napaka pri citanju? rts uraste1 not.b d0 ;stetje nazaj >>> naprej move.l #milisek(a5),d1 sub.b d1,d0 add.l d0,#milisek(a5) ;urni stevec milisekund (.L) moveq #nkanal,d1 ;pristevanje DCD/PTT statistike moveq #0,d2 bra.b uraste6 uraste4 btst #3,#statdcd(a5,d2.w) beq.b uraste5 add.w d0,#povpdcd(a5,d2.w) uraste5 btst #5,#statdcd(a5,d2.w) beq.b uraste6 add.w d0,#povpptt(a5,d2.w) uraste6 addi.w #kparam,d2 dbf d1,uraste4 move.l #milisek(a5),d0 ;merjenje hitrosti glavne zanke sub.l #hitura(a5),d0 bpl.b uraste3 rts uraste3 move.l #hitstev(a5),#hitrost(a5) clr.l #hitstev(a5) move.l #milisek(a5),#hitura(a5) addi.l #1000,#hitura(a5) move.l #milisek(a5),d0 ;stetje minut (.L) sub.l #minref(a5),d0 cmpi.l #msekmin,d0 bcc.b uraste2 rts uraste2 addi.l #msekmin,#minref(a5) addq.l #1,#minute(a5) moveq #nkanal,d1 ;minutna DCD/PTT statistika moveq #0,d2 move.l #msekmin,d3 divu #100,d3 bra.b uraste8 uraste7 clr.l d0 move.w #povpdcd(a5,d2.w),d0 divu d3,d0 move.w d0,#procdcd(a5,d2.w) clr.w #povpdcd(a5,d2.w) clr.l d0 move.w #povpptt(a5,d2.w),d0 divu d3,d0 move.w d0,#procptt(a5,d2.w) clr.w #povpptt(a5,d2.w) uraste8 addi.w #kparam,d2 dbf d1,uraste7 rts ;*** Klici podprogram na izbranem naslovu, 0=izkljuceno *** ppklic tst.l #podprog(a5) ;klicanje podprograma? bne.b ppklic1 rts ppklic1 movea.l #podprog(a5),a0 ;naslov podprograma v A0 tst.l #podperi(a5) ;enkratno klicanje? bne.b ppklic2 clr.l #podprog(a5) bra.b ppklic3 ppklic2 subq.l #1,#podstev(a5) ;stevec iztekel? beq.b ppklic3 rts ppklic3 move.l #podperi(a5),#podstev(a5) ;resetira stevec move.l a6,-(a7) ;klice podprogram na naslovu A0 move.l a5,-(a7) jsr (a0) movea.l (a7)+,a5 movea.l (a7)+,a6 rts ;*** Inicializacija vzporednega vmesnika uPD71055 *** vvpa equ $10001 vvpb equ $10003 vvpc equ $10005 vvcmd equ $10007 inivv move.b #$98,(#vvcmd) ;A=vhod, B=izhod, C=mesano move.b #0,(#vvpb) move.b #0,(#vvpc) rts ;*** Izpis/nastavitev datuma in ure uPD4990 *** uradat bsr.w beseda ;poisci naslednjo besedo v ukazu cmpi.w #13,d1 ;zadosti znakov za nastavitev? bcs.w uradat1 tst.w #sysopst(a2) ;ni Sysop? bpl.w uradat1 moveq #11,d2 ;vhod podatkov za uro uradat3 move.b (a0)+,d0 lsl.l #1,d3 roxl.l #1,d4 lsl.l #1,d3 roxl.l #1,d4 lsl.l #1,d3 roxl.l #1,d4 lsl.l #1,d3 roxl.l #1,d4 andi.w #15,d0 add.b d0,d3 dbf d2,uradat3 move.b d4,d0 ;pretvorba mesecev andi.b #16,d0 beq.b uradat4 addi.b #10,d4 uradat4 lsl.b #4,d4 moveq #1,d0 ;"Register Shift Mode" bsr.w uraukaz movea.l #vvcmd,a0 ;podatki v pomikalni register ure moveq #47,d2 uradat5 roxr.l #1,d4 roxr.l #1,d3 bcs.b uradat6 move.b #2,(a0) bra.b uradat7 uradat6 move.b #3,(a0) uradat7 move.b #1,(a0) ;"CLK" move.b #0,(a0) dbf d2,uradat5 moveq #2,d0 ;"Time Set and Counter Hold Mode" bsr.b uraukaz moveq #0,d0 ;"Register Hold Mode" bsr.b uraukaz moveq #1,d0 ;"Register Shift Mode" bsr.b uraukaz moveq #3,d0 ;"Time Read Mode" bsr.b uraukaz uradat1 movea.l a2,a0 ;dodeli blok za odgovor bsr.w odgblok tst.w d0 bne.b uradat8 rts uradat8 movea.l #uradat2,a0 bsr.w odgtxt move.w d0,-(a7) bsr.w naslov movea.l a0,a1 adda.w #zactxt(a0),a1 adda.w #doltxt(a0),a1 addi.w #19,#doltxt(a0) bsr.w uratxt ;precitaj tekst ure, 20 ASCII znakov (A1)+ move.w (a7)+,d0 ;prompt po uri bsr.w prompt rts uradat2 '*** Datum in ura (UTC): ' ;*** Izdaja 4-bitnega ukaza iz D0 za uPD4990 *** uraukaz movea.l #vvcmd,a0 moveq #3,d2 urauka1 lsr.b #1,d0 ;podatki bcs.b urauka2 move.b #2,(a0) bra.b urauka3 urauka2 move.b #3,(a0) urauka3 move.b #1,(a0) ;"CLK" move.b #0,(a0) dbf d2,urauka1 move.b #5,(a0) ;"STB" move.b #4,(a0) moveq #16,d0 ;zakasnitev najmanj 30 uS urauka4 tst.l (a5) dbf d0,urauka4 rts ;*** Tekst ure, 20 ASCII znakov, v (A1)+ *** uratxt moveq #3,d0 ;"Time Read Mode" bsr.b uraukaz moveq #1,d0 ;"Register Shift Mode" bsr.b uraukaz movea.l #vvcmd,a0 ;pomikaj podatke iz ure v D3,D4 moveq #47,d2 uratxt1 move.b (#vvpc),d0 ;podatek = PC7 roxl.b #1,d0 roxr.l #1,d4 roxr.l #1,d3 move.b #1,(a0) ;"CLK" move.b #0,(a0) dbf d2,uratxt1 moveq #1,d2 ;izpis leta uratxt2 rol.l #4,d4 move.b d4,d0 andi.b #15,d0 ori.b #48,d0 move.b d0,(a1)+ dbf d2,uratxt2 move.b #45,(a1)+ rol.l #4,d4 ;izpis meseca move.b d4,d0 andi.l #15,d0 divu #10,d0 ori.b #48,d0 move.b d0,(a1)+ swap d0 ori.b #48,d0 move.b d0,(a1)+ move.b #45,(a1)+ rol.l #4,d4 ;preskoci dan v tednu moveq #1,d2 ;izpis dneva v mesecu uratxt3 rol.l #4,d4 move.b d4,d0 andi.b #15,d0 ori.b #48,d0 move.b d0,(a1)+ dbf d2,uratxt3 move.b #32,(a1)+ moveq #1,d2 ;izpis ure uratxt4 rol.l #4,d4 move.b d4,d0 andi.b #15,d0 ori.b #48,d0 move.b d0,(a1)+ dbf d2,uratxt4 move.b #58,(a1)+ moveq #1,d2 ;izpis minut uratxt5 rol.l #4,d3 move.b d3,d0 andi.b #15,d0 ori.b #48,d0 move.b d0,(a1)+ dbf d2,uratxt5 move.b #58,(a1)+ moveq #1,d2 ;izpis sekund uratxt6 rol.l #4,d3 move.b d3,d0 andi.b #15,d0 ori.b #48,d0 move.b d0,(a1)+ dbf d2,uratxt6 move.b #32,(a1)+ move.b #32,(a1)+ clr.b (a1)+ rts ;*** PARAMETRI PROGRAMA *************************************** ramzac equ $220000 ;zacetek podatkovnega RAMa ramdol equ $60000 ;dolzina podatkovnega RAMa glejzac equ $200000 ;zacetek RAMa za Glej tabelo glejdol equ $1c000 ;dolzina RAMa za Glej tabelo jpegzac equ $21c000 ;zacetek RAMa za JPEG pretvorbo vvvzac equ $21e000 ;zacetek RAMa za Vozelj tabelo vvvdol equ $2000 ;dolzina RAMa za Vozelj tabelo infzac equ $3d000 ;zacetek RAMa za infotekst infdol equ $7fe ;dolzina RAMa za infotekst (+2!!!!) helpzac equ $3d800 ;zacetek RAMa za helptekst helpdol equ $7fe ;dolziva RAMa za helptekst (+2!!!!) novzac equ $3e000 ;zacetek RAMa za novice novdol equ $ffe ;dolzina RAMa za novice (+2!!!!) avtzac equ $3f000 ;zacetek tabele avtomata avtdol equ $6fe ;dolzina tabele avtomata (+2!!!!) adtzac equ $3f700 ;zacetek konstant za A/D preracun. (192*.W) potzac equ $3f900 ;zacetek tabele poti potdol equ $fe ;dolzina tabele poti (+2!!!) txtzac equ $3fa00 ;zacetek RAMa za ctext txtdol equ $1fe ;dolzina RAMa za ctext (+2!!!!) fujzac equ $3fc00 ;zacetek tabele fujznakov fujdol equ $fe ;dolzina tabele fujznakov (+2!!!!) vozzac equ $3fd00 ;zacetek tabele supervozljev vozdol equ $fe ;dolzina tabele supevozljev (+2!!!!) kokozac equ $3fe00 ;zacetek RAMa kokodakanja, dolzina ddokvir+2 nakljuc equ $3ff80 ;sprem. psevdo-nakljucnega generatorja (.L) ndomet equ $3ff91 ;najvecji dopustni domet (.B) tdomet equ $3ff92 ;casovna enota dometa (ms) (.W) paramet equ 1070 ;dolzina posebnega bloka parametrov dolblok equ 350 ;dolzina enega bloka dolvmes equ 300 ;dolzina vmesnika v bajtih (max: dolblok-4) maxzvez equ 150 ;najvecje stevilo zvez (max: (dolblok-2)/2) maxpost equ 20 ;dolzina seznama postaj (max: dolblok/16) maxodzi equ 20 ;dolzina seznama odzivov (max: dolblok/16) maxoddz equ 23 ;najvec oddanih klicnih znakov (stevec+1) maxdigi equ 33 ;najvecji domet pri posredovanju digijev digidol equ 280 ;najvecja dolzina 1-digi-okv.+1 (21+2+256+1) ;organizacija spomina v (A5): ;posebni blok paramterov ;zastavice blokov (celo stevilo wordov) ;bloki spomina (celostevilski mnogokratnik 32) ;offseti v posebnem bloku parametrov kparam equ 96 ;prostor za parametre kanala abparam equ 192 ; 2*kparam cdparam equ 384 ; 4*kparam efparam equ 576 ; 6*kparam kparam7 equ 672 ; 7*kparam kparam8 equ 768 ; 8*kparam ikanal equ 6 ;stevilo IRQ kanalov (samo IRQ) nkanal equ 8 ;stevilo vseh kanalov (IRQ+DMA) ;posebni blok: skupni parametri zastave equ 900 ;offset parametra dolzine zastavic (.W) milisek equ 902 ;32-bitni 1ms timer (.L) naszvez equ 906 ;naslov bloka s seznamom zvez (.L) prokaz equ 910 ;kazalec na naslednji prost blok (.W) zvezkaz equ 912 ;kazalec na naslednjo zvezo (.W) kokoura equ 914 ;offset ure kokodakanja (.L) naspost equ 918 ;naslov bloka s seznamom postaj (.L) podprog equ 922 ;naslov klicanega podprograma (.L) podperi equ 926 ;perioda klicanja podprograma (.L) podstev equ 930 ;stevec klicanja podprograma (.L) hitrost equ 934 ;izmerjena hitrost glavne zanke (.L) hitstev equ 938 ;stevec hitrosti glavne zanke (.L) hitura equ 942 ;ura meritve hitrosti (.L) minute equ 946 ;32-bitni stevec minut (.L) minref equ 950 ;referenca za stetje minut (.L) mojsabm equ 954 ;moj SuperVozeljski SABM INFO blok (.W) potiura equ 956 ;offset ure oddaje poti (.L) nasodzi equ 960 ;naslov bloka s seznamom odzivov (.L) jpgstat equ 964 ;zastavica JPEG zanke (.W) njavise equ 966 ;stevec javljanj (.L) nodzivi equ 970 ;stevec odzivov (.L) nbslike equ 974 ;stevec binarnih slik (.L) njslike equ 978 ;stevec JPEG slik (.L) nsysop equ 982 ;stevec sysop gesel (.L) ;bvmesni za sprejemnik isti kot za kanalne parametre ;kponav za SABM=kanal0 isti kot za kanale ;posebni blok: kanalni parametri ;0,2,4,6,8,10,12,14 = 8 stevilk sprejemnih blokov bloknrx equ 16 ;stevilka sprejemnega bloka (.W) bloknas equ 18 ;naslov sprejemnega bloka (.L) bloknov equ 22 ;kazalec po 8 sprejenih blokih (.W) bvmesni equ 24 ;naslov za sprejemno/oddajne vrste blokov (.L) txstat equ 28 ;0=spr., 1=zahteva, 2=glava, 3=data, 4=rep (.W) txstev equ 30 ;stevec oddanih znakov/casa (.L) txstevp equ 34 ;pomozni casovni stevec oddajnika (.L) blokntx equ 38 ;stevilka oddajnega bloka (.W) bltxnas equ 40 ;naslov oddajnega bloka (.L) txglava equ 44 ;dolzina sinhronizacijske glave (.L) txrep equ 48 ;dolzina repa (.L) txkazal equ 52 ;stevec oddanih znakov (.W) kponav equ 54 ;casovna konstanta ponavljanja T1 (.L) blokkaz equ 58 ;pisalni kazalec v sprejemnem bloku (.W) vstzvez equ 60 ;stevilo vstopnih uporabniskih zvez (.L) izszvez equ 64 ;stevilo izstopnih uporabniskih zvez (.L) kpodg equ 68 ;cakanje za odgovor T2 (.L) statdcd equ 72 ;status SCCja, DCD bit #3 (.B) tecnoba equ 74 ;tecnoba prehoda na oddajo (p-persistance) (.W) povpdcd equ 76 ;povprecenje aktivnosti DCDja (.W) povpptt equ 78 ;povprecenje aktivnosti PTTja (.W) procdcd equ 80 ;procent aktivnosti DCDja (.W) procptt equ 82 ;procent aktivnosti PTTja (.W) ;offseti v blokih z vrstami blokov ;0 pisalni kazalec (.W) ;2 bralni kazalec (.W) ;ostalo: stevilke blokov velikosti (.W) ;konstante in offseti v blokih z AX.25 okvirji bokvir equ 16 ;zacetek znakov okvirja v bloku mindol equ 15 ;minimalna dolzina okvirja maxdol equ 330 ;maksimalna dolzina okvirja maxznak equ 10 ;maksimalno klicnih znakov maxfram equ 7 ;najvecje stevilo okvirjev v paketu (k) ;0 kazalec (.W) (protokol,glejzas) rxkanal equ 2 ;stevilka sprejemnega kanala (.W) nznakov equ 4 ;stevilo klicnih znakov v okvirju (.W) crdigi equ 6 ;Command/Response in Digi biti (.W) control equ 8 ;kontrolni byte okvirja (.W) zactxt equ 10 ;zacetek teksta v okvirju (.W) doltxt equ 12 ;dolzina teksta v okvirju (.W) ;dodatne konstante in offseti v blokih za zveze izvznak equ 10 ;izvorni klicni znak (6*.B) (zactxt, doltxt) rpromet equ 90 ;promet sprejemnika (.L) tpromet equ 94 ;promet oddajnika (.L) mokvir equ 98 ;najvec nepotrjenih okvirjev (.W) G stevec zvez txtblok equ 100 ;stevilka bloka s tekstom (.W) (glejura tekst) nponovi equ 102 ;stevilka ponovitve (.W) (retry) tponovi equ 104 ;izracunani cas ponovitve (.L) (t+frack) txprkaz equ 108 ;protokolni kazalec oddajnika (.W) rxprkaz equ 110 ;protokolni kazalec sprejemnika (.W) potrjen equ 112 ;stevilo potrjenih okvirjev (.W) zahteva equ 114 ;zahteva za kanal/koncanje zveze (.W) podgovo equ 116 ;zahteva za potrdilni odgovor (.W) todgovo equ 118 ;izracunani cas potrdilnega odgovora (.L) provmes equ 122 ;0 stevilo blokov v vmesniku, ostalo bloki (.W) maxvmes equ 20 ;dolzina vmesnika za protokol maxposr equ 3 ;najvecje stevilo-1 posredovanih okvirjev za SABM sysopst equ 166 ;sysop stanje (.W + 6bajtov) povezav equ 174 ;offset parametrov povezave (downlink-a) ddokvir equ 256 ;najvec znakov v okvirju, odgovor v upravnem n. drokvir equ 150 ;najvec znakov v okvirju z rezervo... dolsabm equ 6 ;dolzina SuperVozeljskega SABM INFO polja glejblo equ 128 ;dolzina Glej bloka zveze glejblm equ -128 ;negativna dolzina Glej bloka zveze glejzas equ $aa55 ;zastavica v Glej seznamu glejura equ 100 ;tekst ure v Glej (18*.B) ;blok s seznamom zvez ;0 stevilo zivih zvez v bloku (maxzvez!!!) ;ostalo: stevilke blokov zvez ;*** IZDELANI PODPROGRAMI ************************************* ;*** Razrezi spomin v bloke, naredi tabelo zastavic, dodeli *** iniblok movea.l #ramzac,a5 ;zacetni naslov RAMa v A5 ;pocisti posebni blok parametrov move.w #paramet,d0 movea.l a5,a0 bra.b iniblo1 iniblo2 clr.b (a0)+ iniblo1 dbf d0,iniblo2 ;razrezi spomin v bloke, postavi zastavice blokov move.w #dolblok,d1 mulu #32,d1 ;dolzina 32 blokov addq.l #4,d1 ;dodaj prostor za zastavice move.l #ramdol,d0 ;dolzina RAMa sub.l #paramet,d0 ;odstej blok parametrov divu d1,d0 ;izracunaj stevilo blokov /32 v D0.W mulu #4,d0 ;stevilo bajtov tabele zastavic move.w d0,#zastave(a5) movea.l a5,a0 ;inicializiraj - postavi zastavice blokov adda.l #paramet,a0 bra.b iniblo3 iniblo4 move.b #$ff,(a0)+ iniblo3 dbf d0,iniblo4 ;dodeli zacetne bloke in za v smeti za vsak sprejemnik moveq #-1,d1 iniblo6 addq.w #1,d1 ;zanka po kanalih, 0=smeti move.w d1,-(a7) bsr.w dodeli move.w d0,-(a7) bsr.w naslov move.w (a7)+,d0 move.w (a7)+,d1 move.w d1,d2 mulu #kparam,d2 move.w d0,#bloknrx(a5,d2.w) ;zacetni blok move.l a0,#bloknas(a5,d2.w) ;zacetni naslov move.w #bokvir,#blokkaz(a5,d2.w) ;zacetni kazalec move.w d1,#rxkanal(a0) ;sprejemni kanal cmpi.w #nkanal,d1 bcs.b iniblo6 ;dodeli dopolnilne bloke po 8 za vsak sprejemnik bsr.w dopolni ;dopolni sprejemne spominske bloke ;dodeli bloke za sprejemno/oddajne vrste blokov moveq #-1,d0 iniblo5 addq.w #1,d0 ;zanka po kanalih, 0=sprejemnik move.w d0,-(a7) bsr.w dodeli ;dodeli blok bsr.w naslov ;izracunaj naslov move.w (a7)+,d0 move.w d0,d1 mulu #kparam,d1 move.l a0,#bvmesni(a5,d1.w) ;postavi naslov clr.l (a0) ;pocisti kazalce cmpi.w #nkanal,d0 bcs.b iniblo5 ;dodeli naslov bloka za seznam zvez bsr.w dodeli bsr.w naslov move.l a0,#naszvez(a5) clr.w (a0) ;postavi stevilo zvez na 0 ;dodeli naslov bloka za seznam poslusanih postaj bsr.w dodeli bsr.w naslov move.l a0,#naspost(a5) move.w #dolblok,d0 ;pobrisi seznam poslusanih postaj subq.w #1,d0 iniblo7 clr.b (a0)+ dbf d0,iniblo7 ;dodeli naslov bloka za seznam odzivov bsr.w dodeli bsr.w naslov move.l a0,#nasodzi(a5) move.w #dolblok,d0 ;pobrisi seznam odzivov subq.w #1,d0 iniblo9 clr.b (a0)+ dbf d0,iniblo9 bsr.w dodeli ;dodeli blok za SuperVozeljski SABM INFO move.w d0,#mojsabm(a5) bsr.w naslov move.w #bokvir,#zactxt(a0) move.w #dolsabm,#doltxt(a0) adda.w #bokvir,a0 ;prepisi moj klicni znak v ASCII movea.l #mojznak,a1 adda.l a6,a1 moveq #11,d0 iniblo8 move.b (a1)+,d1 lsr.b #1,d1 move.b d1,(a0)+ dbf d0,iniblo8 move.l #kokoca1,#kokoura(a5) ;cas prvega kokodakanja move.l #potica1,#potiura(a5) ;cas prve oddaje poti rts ;*** Dopolni sprejemne spominske bloke *** dopolni moveq #0,d2 ;stevec po kanalih dopoln1 addq.l #1,d2 movea.l a5,a0 ;izracunaj naslov parametrov move.l d2,d1 mulu #kparam,d1 adda.l d1,a0 moveq #7,d1 ;stevec po 8 sprejemnih blokih dopoln2 tst.w (a0)+ bne.b dopoln3 movem.l #$6080,-(a7) bsr.w dodeli ;dodeli blok spomina move.w d0,-(a7) bsr.w naslov move.w (a7)+,d0 movea.l a0,a1 movem.l (a7)+,#$0106 move.w d0,#-2(a0) ;stevilka dodeljenega bloka beq.b dopoln3 move.w #bokvir,(a1) ;kazalec v bloku move.w d2,#rxkanal(a1) ;sprejemni kanal bloka dopoln3 dbf d1,dopoln2 cmpi.l #nkanal,d2 bcs.b dopoln1 rts ;*** Izracunaj naslov bloka stevilka D0.W v A0 *** naslov movea.l #0,a0 ;napacna stevilka bloka? subq.w #1,d0 move.w #zastave(a5),d1 lsl.w #3,d1 cmp.w d1,d0 bcc.b naslov1 move.w #zastave(a5),d1 ;izracunaj naslov bloka movea.l a5,a0 adda.l #paramet,a0 adda.w d1,a0 mulu #dolblok,d0 adda.l d0,a0 naslov1 rts ;*** Sprosti blok stevilka D0.W v spominu *** sprosti move.w #zastave(a5),d1 lsl.w #3,d1 subq.w #1,d0 cmp.w d1,d0 bcc.b sprost1 ;nepravilna stevilka bloka movea.l a5,a0 adda.l #paramet,a0 move.w d0,d1 lsr.w #3,d1 adda.w d1,a0 andi.w #$0007,d0 moveq #$80,d1 ror.b d0,d1 or.b d1,(a0) sprost1 rts ;*** Dodeli prost blok spomina, vrni stevilko bloka v D0.L *** dodeli move.w #zastave(a5),d1 move.w d1,d3 lsr.w #2,d1 movea.l a5,a0 adda.l #paramet,a0 move.w #prokaz(a5),d2 clr.l d0 ;nicla pomeni, da ni prostega bloka.... bra.b dodeli2 ;zanka isce nenicelno skupino zastavic dodeli1 addq.w #4,d2 dodeli2 andi.w #$fffc,d2 cmp.w d3,d2 bcs.b dodeli3 clr.w d2 dodeli3 move.l #0(a0,d2.w),d4 dbne d1,dodeli1 beq.b dodeli4 ;ni prostega bloka move.w d2,d0 lsl.l #3,d0 moveq #31,d1 ;poisce prosti blok v skupini 32 zastvic dodeli5 addq.l #1,d0 lsl.l #1,d4 dbcs d1,dodeli5 rol.l d1,d4 ;zavrti d4 nazaj v prvotni polozaj move.l d4,#0(a0,d2.w) dodeli4 move.w d2,#prokaz(a5) rts ;*** Izracunaj stevilo prostih blokov v D0.L *** nprost move.w #zastave(a5),d1 lsr.w #2,d1 movea.l a5,a0 adda.l #paramet,a0 clr.l d0 bra.b nprost3 nprost1 move.l (a0)+,d2 moveq #31,d3 moveq #0,d4 nprost2 add.l d2,d2 addx.l d4,d0 dbf d3,nprost2 nprost3 dbf d1,nprost1 rts ;*** Izpis stevila D0.L v decimalni obliki v (A0)+ *** stevilo moveq #1,d1 moveq #-1,d2 ;stevilo decimalnih mest moveq #9,d3 stevil1 move.l d1,d4 asl.l #2,d1 add.l d4,d1 asl.l #1,d1 addq.w #1,d2 cmp.l d1,d0 dbcs d3,stevil1 stevil2 moveq #1,d1 ;izracuna mestno vrednost move.w d2,d3 bra.b stevil4 stevil3 move.l d1,d4 asl.l #2,d1 add.l d4,d1 asl.l #1,d1 stevil4 dbf d3,stevil3 moveq #9,d3 ;izracuna stevilko na mestu moveq #47,d4 stevil5 addq.b #1,d4 sub.l d1,d0 dbcs d3,stevil5 add.l d1,d0 move.b d4,(a0)+ dbf d2,stevil2 ;zanka po decimalnih mestih rts ;*** Stevilka okvirja D0.W v vmesnik, kanal D1.W *** okvirv subq.w #1,d1 ;kontrola stevilke oddajnega kanala tst.l (#dmatip) ;DMA na vodilu? bne.b okvirv3 cmpi.w #ikanal,d1 bcc.w sprosti ;sprosti okvir za DMA kanal okvirv3 cmpi.w #nkanal,d1 bcc.w sprosti ;sprosti okvir za napacni kanal addq.w #1,d1 ;izracunaj offset kanala mulu #kparam,d1 tst.w #txstat(a5,d1.w) ;zahteva za oddajo? bne.b okvirv4 move.w #1,#txstat(a5,d1.w) ;zahteva za oddajo move.l #milisek(a5),#txstev(a5,d1.w) ;kuzapazi za DCD! okvirv4 movea.l #bvmesni(a5,d1.w),a3 ;naslov vmesnika move.w (a3),d2 ;kazalec v vmesniku move.w d2,d3 addq.w #2,d2 ;povecaj kazalec cmpi.w #dolvmes,d2 ;kontrola kazalca bcs.w okvirv1 clr.w d2 okvirv1 move.w #2(a3),d1 ;kontrola prostora v vmesniku cmp.w d2,d1 bne.b okvirv2 ;vmesnik poln, zavrze okvir! bsr.w sprosti rts okvirv2 move.w d0,#4(a3,d3.w) ;blok v vmesnik move.w d2,(a3) ;novi kazalec rts ;*** Stevilka okvirja v D0.W iz vmesnika za offset D0.W *** izokvir movea.l #bvmesni(a5,d0.w),a0 ;naslov vmesnika move.w (a0),d1 ;pisalni kazalec move.w #2(a0),d2 ;bralni kazalec cmp.w d1,d2 ;nov okvir na razpolago? bne.b izokvi1 clr.l d0 ;0 ni novega okvirja rts izokvi1 move.w #4(a0,d2.w),d0 ;stevilka okvirja addq.w #2,d2 ;povecaj kazalec cmpi.w #dolvmes,d2 ;kontrola kazalca bcs.w izokvi2 clr.w d2 izokvi2 move.w d2,#2(a0) ;novi kazalec rts ;*** Obdelava sprejetega okvirja v bloku D0.W *** obdelav move.w d0,d7 ;shrani stevilko okvirja bsr.w naslov move.w (a0),d0 ;dolzina okvirja move.w #bokvir,d1 ;kazalec na byte okvirja clr.w #nznakov(a0) clr.w #crdigi(a0) obdela1 cmpi.w #maxznak,#nznakov(a0) ;zanka po klicnih znakih bcc.b obdela3 ;konec klicnih znakov subq.w #7,d0 addq.w #7,d1 addq.w #1,#nznakov(a0) ori.b #$60,#-1(a0,d1.w) ;postavi nedolocene bite!!!!!!! asl.w #crdigi(a0) btst #7,#-1(a0,d1.w) ;precitaj CR/digi bit beq.b obdela2 addq.w #1,#crdigi(a0) obdela2 bclr #7,#-1(a0,d1.w) ;pobrise CR/digi bit!!!!!!!!!!!!!! btst #0,#-1(a0,d1.w) ;zadnji klicni znak? beq.b obdela1 obdela3 bclr #0,#-1(a0,d1.w) ;pobrise konec znakov!!!!!!!!!!!!! move.w #crdigi(a0),d2 ;okvir za digi-repetitor? move.w #nznakov(a0),d3 cmpi.w #3,d3 bcs.b obdela4 btst #0,d2 bne.b obdela4 move.w d7,d0 ;okvir za digi-repetitor>>>>>>>>>>>>>>>>>> bsr.w digirep clr.w d0 rts obdela4 subq.w #2,d3 ;odstrani digi bite lsr.w d3,d2 move.w d2,#crdigi(a0) move.b #0(a0,d1.w),#control(a0) addq.w #2,d1 ;izracuna zacetek info teksta move.w d1,#zactxt(a0) subq.w #2,d0 ;izracuna in preveri dolzino info teksta bpl.b obdela5 ;neobstojeci info (kontrolni okvir?) clr.w d0 obdela5 move.w d0,#doltxt(a0) ;dolzina teksta move.w d7,d0 ;stevilka okvirja nazaj v D0.W rts ;*** Digi-repetitor okvirjev D0.W, zamenjava kanala in SSID *** digirep move.w d0,-(a7) bsr.w naslov move.w #bokvir,d1 ;kazalec na byte okvirja move.w #crdigi(a0),d2 move.w #nznakov(a0),d3 ror.w d3,d2 tst.w d2 ;postavi nazaj CR bite bpl.b digire1 bset #7,#6(a0,d1.w) digire1 addq.w #7,d1 add.w d2,d2 bpl.b digire2 bset #7,#6(a0,d1.w) digire2 addq.w #7,d1 bset #7,#6(a0,d1.w) ;postavi nazaj digi bite add.w d2,d2 bmi.b digire2 mulu #7,d3 ;postavi nazaj konec znakov add.w #bokvir,d3 bset #0,#-1(a0,d3.w) movea.l #mojznak,a1 ;primerjaj 6 crk znaka, brez SSID adda.l a6,a1 movea.l a0,a2 adda.w d1,a2 moveq #5,d0 digire3 cmpm.b (a1)+,(a2)+ dbne d0,digire3 beq.b digire4 move.w (a7)+,d0 ;zavrze drugam naslovljeni okvir bsr.w sprosti rts digire4 move.l a2,-(a7) ;primerja izvor s tabelo fujznakov bsr.w fujznak movea.l (a7)+,a2 tst.w d0 beq.b digire6 move.w (a7)+,d0 ;sprosti okvir s fujznakom bsr.w sprosti rts digire6 move.w #rxkanal(a0),d1 ;zamenjava SSID in kanala? move.b (a2),d0 lsr.b #1,d0 andi.w #$000f,d0 bne.b digire5 ;SSID=0 >>> digi okvir v predelavo!!!!!!! move.w (a7)+,d0 bra.w diginot digire5 exg d0,d1 asl.b #1,d0 andi.b #$e1,(a2) or.b d0,(a2) move.w (a7)+,d0 ;okvir v oddajo bsr.w okvirv rts ;*** Primerja znak (A0) s tabelo vozljev, rezultat v D0 *** vozznak movea.l #vozzac,a1 ;podatki o tabeli znakov vozljev move.w (a1)+,d1 cmpi.w #vozdol,d1 bcs.b vozzna1 move.w #vozdol,d1 vozzna1 bra.w tabznak ;*** Primerja znak (A0) s tabelo fujznakov, rezultat v D0 *** fujznak movea.l #mojznak,a1 ;primerjava z znakom SuperVozlja adda.l a6,a1 movea.l a0,a2 adda.w #bokvir,a2 addq.l #7,a2 moveq #5,d2 fujzna2 cmpm.b (a1)+,(a2)+ dbne d2,fujzna2 bne.b fujzna3 ;SuperVozelj ni nikoli fujznak!!!!!!!!!!! clr.l d0 rts fujzna3 movea.l #fujzac,a1 ;podatki o tabeli fujznakov move.w (a1)+,d1 cmpi.w #fujdol,d1 bcs.b fujzna1 move.w #fujdol,d1 fujzna1 bra.w tabznak ;*** Primerja znak (A0) s tabelo (A1)+,D1, rezultat v D0 *** tabznak movea.l a0,a2 ;primerjava znaka adda.w #bokvir,a2 addq.l #7,a2 moveq #5,d2 ;najvec 6 crk znaka tabzna1 move.b (a1)+,d3 subq.w #1,d1 bmi.b tabzna3 ;konec tabele cmpi.b #33,d3 ;presledek v tabeli? bcc.b tabzna4 cmpi.b #64,(a2) ;hkrati konec primerjanega znaka? beq.b tabzna2 bra.b tabzna5 ;poisci naslednji znak v tabeli tabzna4 cmpi.b #42,d3 beq.b tabzna2 ;vse crke do "*" enake! move.b (a2)+,d0 lsr.b #1,d0 cmp.b d3,d0 ;primerjava crk? dbne d2,tabzna1 bne.b tabzna6 ;vseh 6 crk enakih? tabzna2 moveq #-1,d0 ;klicni znak je v tabeli! rts tabzna6 cmpi.b #33,(a1) ;poisci presledek med znaki bcs.b tabzna5 addq.l #1,a1 subq.w #1,d1 bpl.b tabzna6 bra.b tabzna3 tabzna5 cmpi.b #33,(a1) ;poisci naslednji znak v tabeli bcc.b tabznak addq.l #1,a1 subq.w #1,d1 bpl.b tabzna5 tabzna3 clr.l d0 ;klicnega znaka ni v tabeli! rts ;*** Vzpostavi novo zvezo?: uporabi ali sprosti okvir D0.W *** vzpost move.w d0,-(a7) bsr.w naslov movea.l #mojznak,a1 ;primerjaj 6 crk znaka, brez SSID adda.l a6,a1 movea.l #bokvir,a2 adda.l a0,a2 moveq #5,d0 vzpost2 cmpm.b (a1)+,(a2)+ dbne d0,vzpost2 beq.b vzpost3 movea.l #mojznak,a1 ;primerjaj 6 crk IDja, brez SSID adda.w #6,a1 adda.l a6,a1 movea.l #bokvir,a2 adda.l a0,a2 moveq #5,d0 vzpost1 cmpm.b (a1)+,(a2)+ dbne d0,vzpost1 beq.b vzpost3 move.w (a7)+,d0 ;sprosti drugam naslovljeni okvir bsr.w sprosti rts vzpost3 bsr.w fujznak ;primerja izvor s tabelo fujznakov tst.w d0 beq.b vzpos11 move.w (a7)+,d0 ;sprosti okvir s fujznakom bsr.w sprosti rts vzpos11 move.b #control(a0),d0 ;odgovori v skladu s kontr.byte bclr #4,d0 ;pocisti poll bit cmpi.b #$43,d0 ;okvir DISC? bne.b vzpost4 vzpost5 andi.b #$10,#control(a0) ;sestavi DM odgovor (BUSY) ori.b #$0f,#control(a0) clr.w #crdigi(a0) bsr.w sestavi move.w (a7)+,d0 bsr.w sprosti rts vzpost4 cmpi.b #$2f,d0 ;okvir SABM? beq.b vzpost7 move.w (a7)+,d0 ;sprosti okvir z nesmiselnim control bsr.w sprosti rts vzpost7 movea.l #naszvez(a5),a1 ;poglej stevilo zvez? cmpi.w #maxzvez,(a1) ;ni prostora, zato DM odgovor? bcc.b vzpost5 movea.l a0,a3 ;preveri obstoj zveze z enakim SV-SSID? move.w (a1),d2 vzpos14 tst.w d2 ;konec seznama zvez? beq.b vzpos13 move.w d2,d1 subq.w #1,d2 asl.w #1,d1 move.w #0(a1,d1.w),d0 ;blok in naslov zveze bsr.w naslov adda.w #bokvir,a0 movea.l a3,a2 adda.w #bokvir,a2 moveq #12,d0 ;preveri 13 bajtov: oba znaka ter SV-SSID? vzpos15 cmpm.b (a0)+,(a2)+ dbne d0,vzpos15 movea.l a3,a0 beq.b vzpost5 ;enaki znaki in SV-SSID >>> odgovor DM!!! bra.b vzpos14 vzpos13 andi.b #$10,#control(a0) ;sestavi UA odgovor ori.b #$63,#control(a0) clr.w #crdigi(a0) bsr.w sestavi movea.l #naszvez(a5),a1 ;nova zveza v seznam zvez move.w (a1),d0 asl.w #1,d0 move.w (a7)+,#2(a1,d0.w) addq.w #1,(a1) move.w #rxkanal(a0),d0 ;statistika vstopnih zvez mulu #kparam,d0 addq.l #1,#vstzvez(a5,d0.w) cmpi.w #6,#doltxt(a0) ;izvorni klicni znak v SABM info? bcc.b vzpost8 clr.w (a0) clr.b #izvznak(a0) bra.b vzpost9 vzpost8 move.w #$8000,(a0) ;zastavica protokola move.w #zactxt(a0),d1 ;prepisi izvorni klicni znak clr.w d2 moveq #5,d0 vzpos10 move.b #0(a0,d1.w),#izvznak(a0,d2.w) addq.w #1,d1 addq.w #1,d2 dbf d0,vzpos10 move.w #bokvir,d1 ;primerjaj izvorni znak z zvezo? clr.w d2 moveq #5,d0 vzpos12 move.b #7(a0,d1.w),d3 lsr.b #1,d3 cmp.b #izvznak(a0,d2.w),d3 bne.b vzpost9 addq.w #1,d1 addq.w #1,d2 dbf d0,vzpos12 moveq #izvznak,d1 ;prepisi (!) v izvznak move.l #$21202020,#0(a0,d1.w) move.w #$2020,#4(a0,d1.w) vzpost9 moveq #1,d0 ;pocisti vse spremenljivke protokola vzpost6 clr.w #txtblok(a0) clr.w #nponovi(a0) move.l #milisek(a5),#tponovi(a0) clr.l #rpromet(a0) clr.l #tpromet(a0) clr.w #txprkaz(a0) clr.w #rxprkaz(a0) clr.w #potrjen(a0) clr.w #zahteva(a0) move.w #maxfram,#mokvir(a0) clr.w #podgovo(a0) clr.w #provmes(a0) clr.w #sysopst(a0) adda.l #povezav,a0 ;ponovi za parametre povezave! dbf d0,vzpost6 suba.l #povezav,a0 clr.w #rxkanal(a0) ;rxkanal=0 > nima se povezave clr.w #nznakov(a0) ;nznakov=0 > komandni nacin vozlja suba.l #povezav,a0 movea.l a0,a2 ;odgovori s ctext-om Tekst clr.w d1 ;ni ukaz za "bervpis" movea.l #txtzac,a1 move.w #txtdol,d2 bsr.w bervpis rts ;*** Sestavi okvir - znaki, crdigi, control, txtblok v (A0) *** sestavi clr.w #txtblok(a0) ;okvirji brez PID in brez INFO!!! sestavs movea.l a0,a2 ;shrani osnovni naslov iz A0 bsr.w dodeli ;dodeli nov blok za sestavljanje tst.w d0 bne.b sestav1 ;ni vec prostora? movea.l a2,a0 rts sestav1 move.w d0,-(a7) ;shrani stevilko bloka bsr.w naslov movea.l a0,a1 moveq #6,d0 ;zamenjaj znake izvora in ponora move.w #bokvir,d1 sestav2 move.b #7(a2,d1.w),#0(a1,d1.w) move.b #0(a2,d1.w),#7(a1,d1.w) addq.w #1,d1 dbf d0,sestav2 cmpi.w #2,#crdigi(a2) ;postavi C/R bite beq.b sestav3 addq.w #7,d1 sestav3 bset #7,#-1(a1,d1.w) move.w #bokvir,d1 addi.w #14,d1 move.w #nznakov(a2),d0 ;obrni vrstni red digijev subq.w #3,d0 bcs.b sestav4 move.w d0,d2 mulu #7,d2 add.w d1,d2 sestav5 moveq #6,d3 sestav6 move.b #0(a2,d1.w),#0(a1,d2.w) addq.w #1,d1 addq.w #1,d2 dbf d3,sestav6 subi.w #14,d2 dbf d0,sestav5 sestav4 bset #0,#-1(a1,d1.w) ;postavi bit za konec znakov move.b #control(a2),#0(a1,d1.w) ;kontrolni byte addq.w #1,d1 move.w #txtblok(a2),d0 ;poisce in prepise tekst beq.b sestav9 ;ni teksta? move.b #$f0,#0(a1,d1.w) ;postavi PID $F0 addq.w #1,d1 move.w d1,-(a7) ;poisci zacetek in dolzino teksta bsr.w naslov move.w (a7)+,d1 move.w #zactxt(a0),d0 move.w #doltxt(a0),d2 adda.w d0,a0 move.w d1,d0 ;preveri dolzino sestavljenega okvirja add.w d2,d1 cmpi.w #dolblok,d1 bcs.b sesta10 move.w #dolblok,d1 sesta10 move.w d1,d2 sub.w d0,d2 move.l a1,-(a7) ;prepisi tekst okvirja adda.w d0,a1 bra.b sestav8 sestav7 move.b (a0)+,(a1)+ sestav8 dbf d2,sestav7 movea.l (a7)+,a1 sestav9 subi.w #bokvir,d1 ;dolzina sestavljenega okvirja move.w d1,(a1) move.w (a7)+,d0 ;stevilka bloka move.w #rxkanal(a2),d1 ;stevilka kanala bsr.w okvirv movea.l a2,a0 ;vrne osnovni naslov v A0 rts ;*** Razvrsti sprejeti okvir D0.W po seznamu zvez *** razvrst tst.w d0 ;okvir obstaja? bne.b razvrs0 rts ;ni okvirja razvrs0 move.w d0,-(a7) bsr.w naslov cmpi.b #$03,#control(a0) ;UI okvir > seznam poslusanih! beq.w poslusa cmpi.b #$13,#control(a0) ;UI okvir s poll? beq.w poslusa movea.l a0,a1 ;naslov okvirja v A1 movea.l #naszvez(a5),a2 ;naslov seznama v A2 clr.w d7 ;stevec po seznamu zvez D7 razvrs1 cmp.w (a2),d7 ;konec zanke po seznamu zvez? bcs.b razvrs2 move.w (a7)+,d0 bra.w vzpost ;konec seznama > vzpostavi novo zvezo? razvrs2 move.w d7,d1 ;poisci blok naslednje zveze asl.w #1,d1 move.w #2(a2,d1.w),d0 bsr.w naslov ;naslov vhodne zveze bsr.b razvrs3 ;ziva vhodna zveza > primerjaj znake beq.b razvrs8 ;nasel zvezo! adda.w #povezav,a0 ;naslov povezave bsr.b razvrs3 ;ziva povezava > primerjaj znake beq.b razvrs8 ;nasel zvezo! addq.w #1,d7 ;nova stevilka zveze v D7 bra.b razvrs1 razvrs3 move.w #rxkanal(a0),d0 ;primerjava stevilke kanala beq.b razvrs9 ;kanal se nedolocen cmp.w #rxkanal(a1),d0 beq.b razvrs9 ;enaki kanali rts ;neenaki kanali > izhod razvrs9 move.w #nznakov(a0),d0 ;primerjava stev. klicnih znakov bne.b razvrs6 moveq #1,d0 ;mrtva zveza > izhod rts razvrs6 cmp.w #nznakov(a1),d0 beq.b razvrs4 rts ;neenako stevilo znakov > izhod razvrs4 movea.l a0,a3 ;primerjava klicnih znakov adda.w #bokvir,a3 movea.l a1,a4 adda.w #bokvir,a4 mulu #7,d0 ;stevilo bajtov primerjave znakov subq.w #1,d0 razvrs5 cmpm.b (a3)+,(a4)+ dbne d0,razvrs5 rts razvrs8 move.w (a7)+,d0 ;isti kanal, ziva zveza z enakimi znaki bra.w izvedi ;postavljeni D0,D1,A0,A1 ;*** Izvedi vsebino razvrscenega okvirja (D0,D1,A0,A1) *** izvedi clr.w #nponovi(a0) ;resetiraj stevec ponavljanj move.b #control(a1),d2 ;kontrolni byte v D2 move.b d2,#control(a0) andi.b #$10,#control(a0) ;ostane poll-bit clr.w #crdigi(a0) ;pripravi CR bite za odgovor bclr #4,d2 ;pocisti poll-bit v D2 move.b d2,d3 ;kontrolni okvir? andi.w #3,d3 cmpi.w #3,d3 beq.w izvedi5 tst.w #rxkanal(a0) ;zveza vzpostavljena? beq.w izvedi5 move.b d2,d3 ;potrdilo oddanih okvirjev lsr.b #5,d3 move.b d3,d4 sub.w #txprkaz(a0),d3 andi.w #7,d3 add.w d3,#potrjen(a0) ;stevilo potrjenih okvirjev andi.w #7,d4 move.w d4,#txprkaz(a0) ;novi txprkaz btst #0,d2 ;potrdilni okvir RR, RNR ali REJ? beq.b izvedi2 btst #3,d2 ;REJ okvir? >>> znizaj mokvir beq.b izved12 subq.w #1,#mokvir(a0) bne.b izved12 move.w #1,#mokvir(a0) izved12 btst #2,d2 ;RNR okvir? >>> max 1 okvir, cakanje cakafak beq.b izved13 move.w #1,#mokvir(a0) move.w #rxkanal(a0),d3 ;cakanje cakafak*kponav(rxkanal) mulu #kparam,d3 move.l #kponav(a5,d3.w),d4 lsr.l #4,d4 mulu #cakafak,d4 lsl.l #4,d4 add.l d4,#tponovi(a0) izved13 tst.b #control(a0) ;odgovori na poll-bit? AX.25 V2!!!!! beq.b izvedi1 cmpi.w #2,#crdigi(a1) bne.b izvedi1 moveq #1,d2 ;koda za RR cmpi.w #maxvmes,#provmes(a0) ;prostor na razpolago? bcs.b izved11 moveq #5,d2 ;koda za RNR izved11 or.b #control(a0),d2 move.w d2,#podgovo(a0) izvedi1 bsr.w sprosti rts izvedi2 cmpi.w #maxvmes,#provmes(a0) ;prostor na razpolago? bcs.b izvedi3 moveq #5,d2 ;koda za RNR or.b #control(a0),d2 move.w d2,#podgovo(a0) bsr.w sprosti rts izvedi3 lsr.b #1,d2 ;pravilen vrstni red okvirjev? andi.w #7,d2 cmp.w #rxprkaz(a0),d2 beq.b izvedi4 moveq #9,d2 ;koda za REJ or.b #control(a0),d2 move.w d2,#podgovo(a0) bsr.w sprosti rts izvedi4 addq.w #1,#provmes(a0) ;okvir v vmesni pomnilnik move.w #provmes(a0),d3 lsl.w #1,d3 move.w d0,#provmes(a0,d3.w) clr.l d0 ;obracunaj promet sprejemnika move.w #doltxt(a1),d0 add.l d0,#rpromet(a0) move.w #rxprkaz(a0),d2 ;povecaj kazalec addq.w #1,d2 andi.w #7,d2 move.w d2,#rxprkaz(a0) moveq #1,d2 ;koda za RR or.b #control(a0),d2 move.w d2,#podgovo(a0) rts izvedi5 cmpi.b #$2f,d2 ;okvir SABM? bne.b izvedi7 cmpi.w #6,#doltxt(a1) ;izvorni znak v SABM? bcs.b izved22 cmpi.b #33,#izvznak(a0) ;izvznak (!)? beq.b izved22 move.w #zactxt(a1),d4 ;primerjaj izvorne klicne znake! clr.w d3 izved23 move.b #izvznak(a0,d3.w),d2 cmp.b #0(a1,d4.w),d2 bne.b izved21 addq.w #1,d4 addq.w #1,d3 cmpi.w #6,d3 bcs.b izved23 izved22 clr.w #txprkaz(a0) ;pocisti kazalce protokola clr.w #rxprkaz(a0) move.w d0,-(a7) ;sestavi UA odgovor ori.b #$63,#control(a0) bsr.w sestavi move.w (a7)+,d0 izved21 bsr.w sprosti ;sprosti blok rts izvedi7 cmpi.b #$87,d2 ;okvir FRMR? bne.b izved15 clr.w #txprkaz(a0) ;pocisti kazalce protokola clr.w #rxprkaz(a0) move.w d0,-(a7) ;sestavi SABM ukaz in sprosti blok move.b #$3f,#control(a0) move.w #2,#crdigi(a0) bsr.w sestavi move.w (a7)+,d0 bsr.w sprosti rts izved15 cmpi.b #$43,d2 ;okvir DISC? bne.b izvedi8 move.w d0,-(a7) ;sestavi UA odgovor, ubij in sprosti ori.b #$63,#control(a0) bsr.w sestavi ori.w #$c000,#nponovi(a0) ;zahteva za ubijanje zveze suba.w #povezav,a0 ;sestavi sporocilo za odgovor bsr.w odgblok movea.l #izved16,a0 bsr.w odgtxt bsr.w prompt move.w (a7)+,d0 bsr.w sprosti rts izved16 '*** Zveza podrta !!! ***^M' izvedi8 cmpi.b #$63,d2 ;okvir UA? bne.b izvedi9 move.w d0,-(a7) tst.w #rxkanal(a0) ;zveza ze vzpostavljena? beq.b izvedi6 cmpi.w #-1,#zahteva(a0) ;podiranje zveze? bne.b izved14 clr.w #nznakov(a0) ;ubije zvezo bsr.b izved18 ;meritev casa odziva? izved14 move.w (a7)+,d0 bsr.w sprosti rts izved18 cmpi.w #$2120,#izvznak(a0) ;meritev casa odziva? bne.b izved19 move.w #$2121,#izvznak(a0) izved19 rts izvedi6 move.w #rxkanal(a1),#rxkanal(a0) ;postavi kanal! bsr.w odgvzpo ;odgovori vzpostavljena povezava move.w (a7)+,d0 bsr.w sprosti rts izvedi9 cmpi.b #$0f,d2 ;okvir DM? bne.b izved10 move.w d0,-(a7) ori.w #$c000,#nponovi(a0) ;zahteva za ubijanje zveze bsr.b izved18 ;meritev casa odziva? suba.w #povezav,a0 ;sestavi sporocilo za odgovor bsr.w odgblok movea.l #izved17,a0 bsr.w odgtxt bsr.w prompt move.w (a7)+,d0 bsr.w sprosti rts izved17 '*** Postaja zasedena !!! ***^M' izved10 bsr.w sprosti ;sprosti neumne kontrolne okvirje rts ;*** Odzivi klicanih SuperVozljev *** svodziv movea.l #nasodzi(a5),a1 ;naslov seznama odzivov moveq #maxodzi,d7 move.w d0,-(a7) ;shrani stevilko bloka bsr.w naslov movea.l a0,a2 adda.w #povezav,a0 move.l #milisek(a5),d0 ;izracunaj milisekunde odziva sub.l #tponovi(a2),d0 moveq #bokvir,d1 move.l d0,#18(a0,d1.w) moveq #0,d0 tst.l #bokvir(a2) ;prazna vstopna zveza? bne.w opsezna cmpi.w #$2121,#izvznak(a0) ;dva klicaja v izvznak? bne.w opsezna move.w #rxkanal(a0),d0 ;prepisi stevilko kanala ori.b #$f0,d0 bra.w opsezna ;*** Poslusa UI - beacon okvirje v seznam postaj *** poslusa movea.l #naspost(a5),a1 ;naslov seznama poslusanih moveq #maxpost,d7 moveq #bokvir,d0 move.l #1,#18(a0,d0.w) ;zacetno stevilo poslusanih na 1 moveq #0,d0 cmpi.w #2,#nznakov(a0) ;izloci digi okvirje! bne.w opsezna move.w #rxkanal(a0),d0 ;prepisi stevilko kanala bra.w opsezna ;*** Odzivi in poslusani v seznam, stevilka kanala v D0.B *** opsezna adda.w #bokvir,a0 addq.l #6,a0 move.l #minute(a5),#8(a0) ;prepisi cas okvirja move.b d0,(a0) ;veljaven vpis v seznam? beq.b opsezn3 movea.l a1,a2 ;a2 se pomika po seznamu clr.w d3 ;stevec v seznamu opsezn1 moveq #3,d0 ;zamenjaj 16 bajtov (a0) z (a2) clr.w d1 opsezn2 move.l #0(a0,d1.w),d2 move.l #0(a2,d1.w),#0(a0,d1.w) move.l d2,#0(a2,d1.w) addq.w #4,d1 dbf d0,opsezn2 move.l (a1),d0 ;primerjaj 8 bajtov (a0) z (a1) cmp.l (a0),d0 bne.b opsezn4 move.l #4(a1),d0 cmp.l #4(a0),d0 bne.b opsezn4 tst.b (a0) ;tabela odzivov >> koncaj bmi.b opsezn3 move.l #12(a0),d0 add.l d0,#12(a1) ;poslusa >> pristej stevilo poslusanih bra.b opsezn3 opsezn4 adda.w #16,a2 addq.w #1,d3 cmp.w d7,d3 ;konec seznama? bcs.b opsezn1 opsezn3 move.w (a7)+,d0 ;sprosti izkoriscen UI okvir bsr.w sprosti rts ;*** Odgovori 73 ob koncanju zveze *** odg73 bsr.w odgblok movea.l #odg731,a0 bsr.w odgtxt bsr.w odgmojz movea.l #odg732,a0 bsr.w odgtxt rts odg731 '*** 73 de SuperVozelj ' odg732 ' ***^M' ;*** Odgovori na nepoznan ukaz *** neznan movea.l a2,a0 bsr.w odgblok movea.l #neznan1,a0 bsr.w odgtxt movea.l #neznan2,a0 bsr.w odgtxt bsr.w prompt rts neznan1 'Neznan ukaz! Connect Glej Info Novice Quit Poslusa' neznan2 ' Sporoci Uporabniki Vozlji^M' ;*** Odgovori za vzpostavljeno povezavo *** odgvzpo move.w #rxkanal(a0),-(a7) suba.l #povezav,a0 bsr.w odgblok ;dodeli blok movea.l #odgvzp1,a0 bsr.w odgtxt clr.l d1 move.w (a7),d1 bsr.w odgstev movea.l #odgvzp2,a0 bsr.w odgtxt move.w (a7)+,d1 ;statistika izstopnih zvez - povezav mulu #kparam,d1 addq.l #1,#izszvez(a5,d1.w) rts odgvzp1 '*** Povezava vzpostavljena na kanalu ' odgvzp2 ' ***^M' ;*** Odgovori s seznamom uporabnikov vozlja *** uporab bsr.w decvhod ;stevilka kanala? move.l d0,d7 movea.l a2,a3 movea.l a3,a0 bsr.w odgblok ;dodeli blok movea.l #upora10,a0 bsr.w odgtxt movea.l #naszvez(a5),a0 ;poisci stevilo uporabnikov clr.l d1 move.w (a0),d1 bsr.w odgstev movea.l #uporab1,a0 bsr.w odgtxt bsr.w odgmojz ;izpisi klicni znak vozlja movea.l #uporab2,a0 bsr.w odgtxt move.w d0,-(a7) bsr.w nprost ;poisci stevilo prostih blokov move.l d0,d1 move.w (a7)+,d0 bsr.w odgstev movea.l #uporab3,a0 bsr.w odgtxt clr.w d1 ;zanka za izpis uporabniskih zvez uporab4 movea.l #naszvez(a5),a0 ;zanka po uporabniskih zvezah cmp.w (a0),d1 bcs.b uporab5 bsr.w prompt rts uporab5 move.w d1,-(a7) asl.w #1,d1 move.w d0,-(a7) move.w #2(a0,d1.w),d0 ;naslov bloka zveze v A0 bsr.w naslov move.w (a7)+,d0 tst.w d7 ;izpis uporabnikov na vseh/enem kanalu? beq.b upora11 cmp.w #rxkanal(a0),d7 beq.b upora11 upora12 move.w (a7)+,d1 addq.w #1,d1 bra.b uporab4 upora11 bsr.w uzveza ;izpisi vhodno zvezo move.l a0,-(a7) movea.l #uporab6,a0 ;cakajoci okvirji v obeh smereh bsr.w odgtxt movea.l (a7),a0 adda.w #povezav,a0 clr.l d1 move.w #provmes(a0),d1 bsr.w odgstev movea.l (a7),a0 ;stanje uporabnika (razen sysopa)? move.w #sysopst(a0),d1 movea.l #upora14,a0 addq.w #2,d1 cmpi.w #3,d1 bcc.b upora13 movea.l #uporab8,a0 upora13 bsr.w odgtxt movea.l (a7),a0 clr.l d1 move.w #provmes(a0),d1 bsr.w odgstev movea.l #uporab9,a0 bsr.w odgtxt movea.l (a7)+,a0 adda.w #povezav,a0 bsr.w uzveza ;izpisi povezavo movea.l #uporab7,a0 bsr.w odgtxt bra.b upora12 upora10 '*** ' uporab1 ' uporabnikov ' uporab2 ' *** ' uporab3 ' prostih blokov spomina ***^M' uporab6 ' <' uporab8 '!' upora14 '#' uporab9 '> ' uporab7 '^M' ;*** Izpis seznama A1, dolzine D7, napis D6.L *** iseznam tst.w #sysopst(a2) ;samo SYSOP brise seznam? bpl.b isezn10 bsr.w decvhod tst.l d2 ;zahteva po brisanju seznama? bpl.b isezn10 asl.l #4,d0 ;pomnozi D0 s 16 isezn11 cmp.l #dolblok,d0 ;stevilo vecje od dolzine seznama? bcc.b isezn10 clr.b #0(a1,d0.w) addq.l #1,d0 bra.b isezn11 isezn10 movea.l a2,a3 ;dodeli blok za odgovor, naslov v A3 movea.l a3,a0 move.l a1,-(a7) bsr.w odgblok movea.l d6,a0 bsr.w odgtxt movea.l (a7)+,a2 ;naslov seznama v A2 bra.b isezna9 isezna1 move.l #isezna3,d6 ;":" move.b (a2)+,d1 ;preveri in izpisi stevilko kanala beq.b isezna2 bpl.b isezn12 move.l #isezn13,d6 ;"!" isezn12 move.l a2,-(a7) andi.l #15,d1 bsr.w odgstev movea.l d6,a0 bsr.w odgtxt movea.l (a7)+,a2 ;izpisi klicni znak s SSIDjem bsr.w odgznak move.l a2,-(a7) movea.l #isezna4,a0 ;izracunaj preteceni cas v minutah bsr.w odgtxt movea.l (a7)+,a2 bsr.b isezna5 move.l a2,-(a7) sub.l #minute(a5),d1 neg.l d1 bsr.w odgstev movea.l #isezna7,a0 ;izpis stevila poslus./milisekund bsr.w odgtxt movea.l (a7)+,a2 bsr.b isezna5 move.l a2,-(a7) bsr.w odgstev movea.l #isezna8,a0 bsr.w odgtxt move.l (a7)+,a2 isezna9 dbf d7,isezna1 isezna2 bsr.w prompt ;prompt na koncu rts isezna5 moveq #3,d2 ;precitaj .L iz (A2)+ tudi na lihem naslovu isezna6 lsl.l #8,d1 move.b (a2)+,d1 dbf d2,isezna6 rts isezna3 ': ' isezna4 ' (' isezna7 ',' isezna8 ')^M' isezn13 '! ' ;*** Izpis uporabniske zveze *** uzveza tst.w #nznakov(a0) ;stevilo znakov...obstojeca zveza? bne.b uzveza1 move.l a0,-(a7) movea.l #uzveza6,a0 bsr.w odgtxt bsr.w odgmojz movea.l (a7)+,a0 rts uzveza1 clr.l d1 ;izpisi stevilko sprejemnega kanala move.l a0,-(a7) move.w #rxkanal(a0),d1 movea.l #uzveza9,a0 beq.b uzveza7 ;kanal 0 - klice! bsr.w odgstev movea.l #uzveza2,a0 bsr.w odgtxt movea.l (a7),a0 ;izpisi max stevilo okvirjev clr.l d1 move.w #mokvir(a0),d1 bsr.w odgstev movea.l #uzvez10,a0 uzveza7 bsr.w odgtxt movea.l (a7),a0 ;izpisi izvorni klicni znak tst.b #izvznak(a0) beq.b uzvez14 movea.l #uzvez15,a0 bsr.w odgtxt tst.w d0 beq.b uzvez17 movea.l (a7),a2 adda.w #izvznak,a2 move.w d0,-(a7) bsr.w naslov movea.l a0,a1 adda.w #zactxt(a0),a1 adda.w #doltxt(a0),a1 moveq #5,d0 uzvez18 cmpi.b #33,(a2) bcs.b uzvez19 move.b (a2)+,(a1)+ addq.w #1,#doltxt(a0) dbf d0,uzvez18 uzvez19 move.w (a7)+,d0 uzvez17 movea.l #uzvez16,a0 bsr.w odgtxt uzvez14 movea.l (a7),a0 ;izpisi znak izvora in digije move.w #nznakov(a0),d6 subi.w #2,d6 bpl.b uzveza3 clr.w d6 uzveza3 movea.l a0,a2 adda.l #bokvir,a2 adda.w #7,a2 uzveza4 bsr.w odgznak dbf d6,uzveza4 movea.l (a7),a0 ;izpisi znak ponora movea.l a0,a2 adda.l #bokvir,a2 bsr.w odgznak movea.l (a7)+,a0 tst.w #rxkanal(a0) ;nevzpostvljena zveza? bne.b uzveza8 move.w #zahteva(a0),d1 ;izpisi kanale klicanja andi.l #$7fff,d1 bne.b uzvez13 move.l a0,-(a7) movea.l #uzvez11,a0 ;"na vseh kanalih" bsr.w odgtxt movea.l (a7)+,a0 rts uzvez13 move.l a0,-(a7) move.l d1,-(a7) movea.l #uzvez12,a0 ;"na kanalu" bsr.w odgtxt move.l (a7)+,d1 bsr.w odgstev movea.l #uzvez10,a0 bsr.w odgtxt movea.l (a7)+,a0 rts uzveza8 move.l a0,-(a7) ;izpisi sprejemni promet move.l #rpromet(a0),d1 bsr.w odgstev movea.l #uzveza5,a0 bsr.w odgtxt movea.l (a7),a0 ;izpisi oddajni promet move.l #tpromet(a0),d1 bsr.w odgstev movea.l (a7)+,a0 rts uzvez10 ' ' uzveza2 ':' uzveza5 '/' uzveza6 'Upravlja ' uzveza9 'Klice ' uzvez11 'na vseh kanalih ' uzvez12 'na kanalu ' uzvez15 '(' uzvez16 ') ' ;*** Prompt s klicnim znakom vozlja, za zvezo (A0) *** prompt bsr.w odgmojz movea.l #prompt1,a0 bsr.w odgtxt rts prompt1 '>^M' ;*** Dodeli blok za odgovor za zvezo (A0), pokvari A0 *** odgblok clr.w d0 movea.l a0,a2 adda.w #povezav,a2 adda.w #provmes,a2 cmpi.w #maxvmes,(a2) ;je se kaj prostora? bcs.b odgblo1 rts odgblo1 bsr.w dodeli tst.w d0 ;je se blok na razpolago? bne.b odgblo2 rts odgblo2 addq.w #1,(a2) ;okvir v vmesnik move.w (a2),d1 asl.w #1,d1 move.w d0,#0(a2,d1.w) move.w d0,-(a7) ;pobrisi ves tekst v okvirju bsr.w naslov move.w #bokvir,#zactxt(a0) clr.w #doltxt(a0) move.w (a7)+,d0 rts ;*** Tekst z labelo A0 v blok D0, brez kontrole dolzine!!! *** odgtxt movea.l a6,a2 adda.l a0,a2 tst.w d0 bne.b odgtxt1 rts odgtxt1 move.w d0,-(a7) bsr.w naslov movea.l a0,a1 adda.w #zactxt(a0),a1 adda.w #doltxt(a0),a1 odgtxt2 move.b (a2)+,d1 beq.b odgtxt3 move.b d1,(a1)+ addq.w #1,#doltxt(a0) bra.b odgtxt2 odgtxt3 move.w (a7)+,d0 rts ;*** Mojznak v blok D0, brez kontrole dolzine!!! *** odgmojz tst.w d0 bne.b odgmoj1 rts odgmoj1 move.w d0,-(a7) bsr.w naslov movea.l a0,a1 adda.w #zactxt(a0),a1 adda.w #doltxt(a0),a1 movea.l #mojznak,a2 adda.l a6,a2 adda.w #6,a2 ;prepisi ID moveq #5,d0 odgmoj4 move.b (a2)+,d1 lsr.b #1,d1 cmpi.b #32,d1 beq.b odgmoj5 move.b d1,(a1)+ addq.w #1,#doltxt(a0) odgmoj5 dbf d0,odgmoj4 suba.w #12,a2 ;prepisi znak move.b #58,(a1)+ addq.w #1,#doltxt(a0) moveq #5,d0 odgmoj2 move.b (a2)+,d1 lsr.b #1,d1 cmpi.b #32,d1 beq.b odgmoj3 move.b d1,(a1)+ addq.w #1,#doltxt(a0) odgmoj3 dbf d0,odgmoj2 move.w (a7)+,d0 rts ;*** Klicni znak s SSIDjem iz (A2)+, s kontrolo dolzine A3! *** odgznak tst.w d0 bne.b odgzna1 rts odgzna1 move.w d0,-(a7) bsr.w naslov movea.l a0,a1 adda.w #zactxt(a0),a1 adda.w #doltxt(a0),a1 moveq #5,d0 ;izpisi znak odgzna2 move.b (a2)+,d1 lsr.b #1,d1 cmpi.b #32,d1 beq.b odgzna3 move.b d1,(a1)+ addq.w #1,#doltxt(a0) odgzna3 dbf d0,odgzna2 move.b (a2)+,d1 ;izpisi SSID lsr.b #1,d1 andi.w #15,d1 beq.b odgzna4 ;SSID 0? move.b #45,(a1)+ addi.b #48,d1 cmpi.b #58,d1 bcs.b odgzna5 move.b #49,(a1)+ addq.w #1,#doltxt(a0) subi.b #10,d1 odgzna5 move.b d1,(a1)+ addq.w #2,#doltxt(a0) odgzna4 move.b #32,(a1)+ ;presledek na koncu! addq.w #1,#doltxt(a0) move.w (a7)+,d0 cmpi.w #drokvir,#doltxt(a0) ;kontrola dolzine bloka! bcs.b odgzna6 movea.l a3,a0 move.l a2,-(a7) bsr.w odgblok ;dodeli nov blok... movea.l (a7)+,a2 odgzna6 rts ;*** Heksadecimalno D1.L v tekst v bloku D0, brez kontrole! *** odghexl swap d1 bsr.w odghex swap d1 bsr.w odghex rts ;*** Heksadecimalno D1.W v tekst v bloku D0, brez kontrole! *** odghex tst.w d0 bne.b odghex1 rts odghex1 move.w d0,-(a7) move.l d1,-(a7) bsr.w naslov movea.l a0,a1 adda.w #zactxt(a1),a0 adda.w #doltxt(a1),a0 move.l (a7)+,d1 bsr.b odghex2 bsr.b odghex2 bsr.b odghex2 bsr.b odghex2 move.w (a7)+,d0 rts odghex2 rol.w #4,d1 ;heksadecimalna stevilka move.w d1,d0 andi.w #15,d0 addi.w #48,d0 cmpi.w #58,d0 bcs.b odghex3 addq.w #7,d0 odghex3 move.b d0,(a0)+ addq.w #1,#doltxt(a1) rts ;*** Stevilo v D1.L v tekst v bloku D0, brez kontrole !!! *** odgstev tst.w d0 bne.b odgste1 rts odgste1 move.w d0,-(a7) move.l d1,-(a7) bsr.w naslov movea.l a0,a1 adda.w #zactxt(a1),a0 adda.w #doltxt(a1),a0 move.l (a7)+,d0 move.l a0,-(a7) bsr.w stevilo ;decimalno stevilo v ASCII v (A0)+ move.l a0,d0 sub.l (a7)+,d0 add.w d0,#doltxt(a1) move.w (a7)+,d0 rts ;*** Casovna omejitev neaktivne zveze *** casmeja move.l #milisek(a5),d0 ;izracunaj cas primerjave subi.l #mejacas,d0 cmp.l #tponovi(a1),d0 ;aktivnost vhodne zveze? bpl.b casmej1 rts casmej1 cmp.l #tponovi(a2),d0 ;aktivnost povezave? bpl.b casmej2 rts casmej2 movea.l a1,a0 bsr.b casmej4 ;odgovori vhodni zvezi tst.w #nznakov(a2) ;upravni nacin? beq.b casmej3 tst.w #rxkanal(a2) beq.b casmej3 movea.l a1,a0 suba.l #povezav,a0 bsr.b casmej4 ;odgovori povezavi casmej3 bsr.w glejsez ori.w #$8000,#zahteva(a1) ;zahteva podiranje obeh zvez ori.w #$8000,#zahteva(a2) rts casmej4 move.l a1,-(a7) ;odgovori za casovno omejitev move.l a2,-(a7) bsr.w odgblok movea.l #casmej5,a0 bsr.w odgtxt bsr.w odgmojz movea.l #casmej6,a0 bsr.w odgtxt movea.l (a7)+,a2 movea.l (a7)+,a1 rts casmej5 '*** Casovna omejitev de ' casmej6 ' ***^M' ;*** Zanka po zivih zvezah *** zvezank move.w #zvezkaz(a5),d7 ;kazalec na zvezo v D7.W movea.l #naszvez(a5),a0 cmp.w (a0),d7 bcs.b zvezan1 clr.w #zvezkaz(a5) ;konec znake po zvezah moveq #0,d7 ;kokodakanje SuperVozlja na vseh kanalih bsr.w kokodak bsr.w tabpoti rts zvezan1 addq.w #1,#zvezkaz(a5) ;poveca kazalec na zvezo move.w d7,d1 asl.w #1,d1 move.w #2(a0,d1.w),d0 bsr.w naslov ;naslov bloka zveze v A0 movea.l a0,a2 adda.l #povezav,a2 ;naslov povezave v A2 tst.w #nznakov(a0) ;vhodna zveza podrta? bne.b zvezan8 tst.w #nznakov(a2) ;povezava podrta? beq.b zveza15 ori.w #$8000,#zahteva(a2) ;podri prej povezavo! bra.b zvezan8 zveza15 tst.w #provmes(a0) ;podiranje: vmesniki prazni? bne.b zvezan8 tst.w #provmes(a2) bne.b zvezan8 move.w #sysopst(a0),d0 ;stanje uporabnika, brez sysopa? addq.w #2,d0 cmpi.w #3,d0 bcc.b zvezan8 movea.l #naszvez(a5),a1 move.w d7,d1 asl.w #1,d1 move.w #2(a1,d1.w),d0 ;stevilka bloka podrte zveze subq.w #1,(a1) ;zmanjsa stevilo zvez za 1 zveza16 cmp.w (a1),d7 ;zanka pomakne stevilke blokov navzdol bcc.b zveza17 addq.w #2,d1 move.w #2(a1,d1.w),#0(a1,d1.w) addq.w #1,d7 bra.b zveza16 zveza17 bsr.w svodziv ;blok podrte zveze v svodziv rts zvezan8 movea.l a0,a1 bsr.w casmeja ;casovna omejitev neaktivne zveze? bsr.w potrdi bsr.w odgovor bsr.w ponovi tst.w #nznakov(a1) ;sprosti okvirje podrte vstop.zveze? bne.b zveza12 move.w #provmes(a2),d2 clr.w d3 bra.b zveza13 zveza14 addq.w #2,d3 move.w #provmes(a2,d3.w),d0 bsr.w sprosti zveza13 dbf d2,zveza14 clr.w #provmes(a2) zveza12 exg a1,a2 bsr.w oddzap bsr.w potrdi bsr.w odgovor bsr.w ponovi tst.w #nznakov(a1) ;upravni nacin vozlja? beq.b zvezan2 tst.w #rxkanal(a1) ;upravni nacin vozlja? beq.b zvezan2 rts zvezan2 tst.w #provmes(a2) ;nov okvir z ukazom? bne.b zvezan6 rts zvezan6 tst.w #nznakov(a1) ;vzpostavljanje zveze? beq.b zvezan3 tst.w #nznakov(a2) ;podrta vstopna zveza? bne.b zveza18 rts zveza18 cmpi.w #maxposr,#provmes(a2) ;prevec posredovanih? bcc.b zveza10 rts zveza11 '*** Klicanje prekinjeno !!! ***^M' zveza10 moveq #maxposr,d2 ;sprosti posredovane in javi!!!!!!!!! subq.w #1,d2 bsr.w spposr move.l a2,-(a7) ;sestavi sporocilo za odgovor move.l a1,-(a7) movea.l a2,a0 bsr.w odgblok movea.l #zveza11,a0 bsr.w odgtxt bsr.w prompt movea.l (a7)+,a1 movea.l (a7)+,a2 zvezan3 subq.w #1,#provmes(a2) ;blok okvirja iz vrste v D0 moveq #provmes,d1 move.w #2(a2,d1.w),d0 clr.w d2 zvezan4 cmp.w #provmes(a2),d2 ;zanka pomakne vrsto navzdol bcc.b zvezan5 move.w #4(a2,d1.w),#2(a2,d1.w) addq.w #2,d1 addq.w #1,d2 bra.b zvezan4 zvezan5 move.w d0,-(a7) ;naslov in dolzina teksta ukaza bsr.w naslov move.w #zactxt(a0),d0 move.w #doltxt(a0),d1 adda.w d0,a0 move.w #sysopst(a2),d0 ;obicajni uporabniski ukaz? beq.b zvezan7 cmpi.w #-1,d0 ;izvrsi sysop ukaz? beq.b zvezan7 cmpi.w #-2,d0 ;vzpostavljanje sysopa? bne.b zvezan9 bsr.w sysvzp bra.b zvezan9 zvezan7 bsr.w izvukaz ;obicajno izvrsi tekst ukaza zvezan9 move.w (a7)+,d0 bsr.w sprosti ;sprosti blok z ukazom rts ;*** Oddaja zaporedja blokov (#sysopst(a2)) *** oddzap tst.w #sysopst(a2) ;se kaksen blok v zaporedju? beq.b oddzap1 bmi.b oddzap1 bra.b oddzap2 oddzap1 rts oddzap2 cmpi.w #maxvmes,#provmes(a1) ;prostor v vmesniku? bcs.b oddzap3 rts oddzap3 addq.w #1,#provmes(a1) ;blok v vmesnik move.w #provmes(a1),d0 asl.w #1,d0 addi.w #provmes,d0 move.w #sysopst(a2),#0(a1,d0.w) move.w #sysopst(a2),d0 ;naslednji blok v #sysopst(a2)! bsr.w naslov move.w (a0),#sysopst(a2) rts ;*** Vzpostavljanje sysopa - preverjanje odgovora (A0),D1 *** sysvzp subq.w #5,d1 ;dolzina odgovora? bcs.b sysvzp5 sysvzp6 movea.l a2,a1 ;primerjaj 5 znakov odgovora adda.w #sysopst,a1 addq.l #2,a1 movea.l a0,a3 moveq #4,d0 sysvzp1 cmpm.b (a3)+,(a1)+ dbne d0,sysvzp1 beq.b sysvzp2 ;pravilen odgovor? addq.l #1,a0 dbf d1,sysvzp6 sysvzp5 clr.w #sysopst(a2) ;napacen odgovor! movea.l a2,a0 bsr.w odgblok movea.l #sysvzp4,a0 bsr.w odgtxt bsr.w prompt rts sysvzp2 move.w #-1,#sysopst(a2) ;sysop vzpostavljen! addq.l #1,#nsysop(a5) ;stevec pravilnih odgovorov movea.l a2,a0 bsr.w odgblok movea.l #sysvzp3,a0 bsr.w odgtxt bsr.w prompt rts sysvzp3 '*** Pravilen odgovor ... ' sysvzp4 '*** Napacen odgovor ... ' ;*** Odgovor na zahtevo po sysopu, za zvezo A2 *** sysodg move.w #-2,#sysopst(a2) ;caka odgovor, naslednji okvir movea.l a2,a3 adda.w #sysopst,a3 addq.l #2,a3 movea.l a2,a0 bsr.w odgblok ;blok za odgovor s klicnim znakom bsr.w odgmojz movea.l #sysodg2,a0 bsr.w odgtxt moveq #4,d1 ;zanka za 5 nakljucnih stevil sysodg1 move.w d1,-(a7) movea.l #sysodg3,a0 ;presledek bsr.w odgtxt move.w d0,-(a7) bsr.w psevnak ;doloci psevdonakljucno stevilo v D0.L bsr.w psevnak bsr.w psevnak bsr.w psevnak bsr.w psevnak clr.l d1 ;nakljucno stevilo v predpisane meje v D1.L move.w d0,d1 divu #80,d1 ;stevilo znakov v tabeli PW clr.w d1 swap d1 addi.w #1,d1 movea.l #geslo,a0 ;poisci znake v geslu adda.l a6,a0 move.b #-1(a0,d1.w),(a3)+ ;nakljucni znak v spomin move.w (a7)+,d0 bsr.w odgstev ;psevdonakljucno stevilo v odgovor move.w (a7)+,d1 dbf d1,sysodg1 movea.l #sysodg4,a0 bsr.w odgtxt rts sysodg2 '> ' sysodg3 ' ' sysodg4 '^M' ;*** Izvrsi ukaz, tekst dolzine D1.W v (A0) *** izvukaz tst.w d1 ;poisci prvo besedo v ukazu beq.b izvuka2 cmpi.b #33,(a0) bcc.b izvuka3 addq.l #1,a0 subq.w #1,d1 bra.b izvukaz izvuka2 movea.l a2,a0 ;prazen ukaz: odgovori s prompt-om bsr.w odgblok bsr.w prompt rts izvuka3 cmpi.b #96,(a0) ;male crke pretvori v velike bcs.b izvuka1 subi.b #32,(a0) izvuka1 cmpi.b #85,(a0) ;ukaz U(porabniki)? beq.w uporab cmpi.b #73,(a0) ;ukaz I(nfotekst)? bne.b izvuka4 movea.l #infzac,a1 move.w #infdol,d2 bra.w bervpis izvuka4 cmpi.b #81,(a0) ;ukaz Q(uit/zapusti) bne.b izvuka5 exg a1,a2 bsr.w glejsez ;podatki o zvezi (A1,A2) v Glej seznam ori.w #$8000,#zahteva(a1) ;zahteva za koncanje zveze ori.w #$8000,#zahteva(a2) movea.l a1,a0 bsr.w odg73 rts izvuka5 cmpi.b #67,(a0) ;ukaz C(onnect) beq.w klici cmpi.b #83,(a0) ;ukaz S(poroci) beq.w sporoci cmpi.b #80,(a0) ;ukaz P(oslusa) bne.b izvuka7 movea.l #naspost(a5),a1 moveq #maxpost,d7 move.l #izvuka6,d6 bra.w iseznam izvuka6 '*** Poslusani (minute,stevilo) ***^M' izvuka7 cmpi.b #82,(a0) ;ukaz R(eset, run, cas delovanja) beq.w reset cmpi.b #75,(a0) ;ukaz K(omandni sysop nacin) beq.w sysodg cmpi.b #76,(a0) ;ukaz L(istaj 256 bajtov spomina) bne.b izvuka8 tst.w #sysopst(a2) ;samo SYSOP! bmi.w listaj izvuka8 cmpi.b #77,(a0) ;ukaz M(emorijska lokacija) bne.b izvuka9 tst.w #sysopst(a2) ;samo SYSOP! bmi.w memlok izvuka9 cmpi.b #78,(a0) ;ukaz N(ovice) bne.b izvuk10 movea.l #novzac,a1 move.w #novdol,d2 bra.w bervpis izvuk10 cmpi.b #68,(a0) ;ukaz D(atum/ura) beq.w uradat cmpi.b #65,(a0) ;ukaz A(vtomat) bne.b izvuk11 movea.l #avtzac,a1 move.w #avtdol,d2 bra.w bervpis izvuk11 cmpi.b #66,(a0) ;ukaz B(eacontekst) bne.b izvuk12 movea.l #kokozac,a1 move.w #ddokvir,d2 bra.w bervpis izvuk12 cmpi.b #84,(a0) ;ukaz T(ekst) bne.b izvuk13 movea.l #txtzac,a1 move.w #txtdol,d2 bra.w bervpis izvuk13 cmpi.b #87,(a0) ;ukaz W(SuperVozelj vozlji) bne.b izvuk14 movea.l #vozzac,a1 move.w #vozdol,d2 bra.w bervpis izvuk14 cmpi.b #70,(a0) ;ukaz F(ujznak) bne.b izvuk15 tst.w #sysopst(a2) ;samo SYSOP! bpl.b izvuk15 movea.l #fujzac,a1 move.w #fujdol,d2 bra.w bervpis izvuk15 cmpi.b #74,(a0) ;ukaz J(avi se s kokodakanjem) beq.w javise cmpi.b #71,(a0) ;ukaz G(lej klicni znak) beq.w glejzna cmpi.b #88,(a0) ;ukaz X(menjaj RRpoll/Info ponavljanje) beq.w xmenjaj cmpi.b #90,(a0) ;ukaz Z(veze za oddajo poti po tabeli) bne.b izvuk17 movea.l #potzac,a1 move.w #potdol,d2 bra.w bervpis izvuk17 cmpi.b #86,(a0) ;ukaz V(ozlji) beq.w voztab cmpi.b #72,(a0) ;ukaz H(elp) bne.b izvuk18 movea.l #helpzac,a1 move.w #helpdol,d2 bra.w bervpis izvuk18 cmpi.b #33,(a0) ;ukaz !(vozlji samo od vozljev/SYSOPa) bne.b izvuk19 tst.w #sysopst(a2) ;samo SYSOP? bmi.w vozlji cmpi.b #33,#izvznak(a2) ;izvorni klicni znak (!)? bne.b izvuk19 movem.l #$40e0,-(a7) ;resi D1,A0,A1,A2 ... SuperVozelj? movea.l a2,a0 bsr.w vozznak movem.l (a7)+,#$0702 ;povrni A2,A1,A0,D1 tst.l d0 bmi.w vozlji izvuk19 cmpi.b #79,(a0) ;ukaz O(dzivi klicanih SuperVozljev) bne.b izvuk20 movea.l #nasodzi(a5),a1 moveq #maxodzi,d7 move.l #izvuk21,d6 bra.w iseznam izvuk21 '*** Odzivi (minute,milisekunde) ***^M' izvuk20 cmpi.b #89,(a0) ;ukaz Y(oddaja CCD slike) beq.w slikar cmpi.b #69,(a0) ;ukaz E(branje A/D vhodov) beq.w advhod cmpi.b #35,(a0) ;ukaz #(digi okvir ven) beq.w digiven bra.w neznan ;nepoznan/nedovoljen ukaz? ;*** Poisci naslednjo besedo v ukazu (A0)+,D1.W *** beseda tst.w d1 ;poisci presledek med besedama beq.b beseda1 cmpi.b #33,(a0) bcs.b beseda1 addq.l #1,a0 subq.w #1,d1 bra.b beseda beseda1 tst.w d1 ;poisci zacetek naslednje besede beq.b beseda2 cmpi.b #33,(a0) bcc.b beseda2 addq.l #1,a0 subq.w #1,d1 bra.b beseda1 beseda2 rts ;*** Beri/vpisi tekst v (A1)+, najvecja dolzina D2.W *** bervpis bsr.w beseda ;poisci naslednjo besedo tst.w d1 ;sledi se kaksen znak? beq.w bervpi6 tst.w #sysopst(a2) ;samo Sysop vpise nov tekst? bpl.w bervpi6 cmpi.b #95,(a0) ;'_' >>> brisanje celotnega teksta!!!!! bne.b bervp12 clr.w (a1) movea.l a2,a0 bsr.w odgblok movea.l #bervp13,a0 bsr.w odgtxt bsr.w prompt rts bervp13 '*** Brisana celotna vsebina !!! ***^M' bervp12 move.w (a1),d0 ;vpisi - dodaj novi tekst v spomin cmp.w d2,d0 bcs.b bervpi3 move.w d2,d0 bervpi3 sub.w d0,d2 ;izracunaj preostali prostor cmp.w d2,d1 bcs.b bervp15 move.w d2,d1 bervp15 add.w d1,d0 ;nova dolzina teksta v spomin move.w d0,(a1)+ move.w d1,-(a7) adda.w d0,a1 ;prepisi tekst suba.w d1,a1 bra.b bervpi4 bervpi5 move.b (a0)+,(a1)+ bervpi4 dbf d1,bervpi5 movea.l a2,a0 bsr.w odgblok movea.l #bervp14,a0 bsr.w odgtxt clr.l d1 move.w (a7)+,d1 ;stevilo vpisanih crk/znakov bsr.w odgstev movea.l #bervp16,a0 bsr.w odgtxt bsr.w prompt rts bervp14 '*** Vpisano ' bervp16 ' znakov ... ' bervpi6 movea.l a2,a3 ;odgovori - beri tekst v vmesnik move.w (a1)+,d1 cmp.w d2,d1 ;predolg tekst? bcs.b bervp10 move.w d2,d1 bervp10 tst.w d1 ;konec teksta? bne.b bervpi9 movea.l a3,a0 ;prompt na koncu teksta bsr.w odgblok bsr.w prompt rts bervpi9 move.w #ddokvir,d2 ;izracunaj dolzino okvirja sub.w d2,d1 bcc.b bervp11 add.w d1,d2 clr.w d1 bervp11 move.w d1,-(a7) ;dodeli blok in prepisi tekst move.w d2,-(a7) move.l a1,-(a7) movea.l a3,a0 bsr.w odgblok move.w d0,-(a7) bsr.w naslov move.w (a7)+,d0 movea.l (a7)+,a1 move.w (a7)+,d2 move.w (a7)+,d1 tst.w d0 beq.b bervp10 ;ni prostora! move.w d2,#doltxt(a0) move.w #zactxt(a0),d0 adda.w d0,a0 bra.b bervpi7 bervpi8 move.b (a1)+,(a0)+ bervpi7 dbf d2,bervpi8 bra.b bervp10 ;*** Prepisi izvor A1, dolzina D7.L, cilj D0.L>>>A0 *** prepis movea.l d0,a0 move.l a0,-(a7) ;prepisovanje iz izvora v cilj move.l d7,-(a7) move.l a1,-(a7) ori #$0700,sr ;prepreci vse prekinitve bra.b prepis1 prepis2 swap d7 prepis3 move.b (a1)+,(a0)+ prepis1 dbf d7,prepis3 swap d7 dbf d7,prepis2 andi #$f8ff,sr ;omogoci vse prekinitve movea.l a2,a0 ;odgovori s stevilkami bsr.w odgblok movea.l #prepis4,a0 ;izpisi naslov izvora bsr.w odgtxt move.l (a7)+,d1 bsr.w odghexl movea.l #prepis5,a0 ;izpisi dolzino bsr.w odgtxt move.l (a7)+,d1 bsr.w odghexl movea.l #prepis6,a0 ;izpisi naslov cilja bsr.w odgtxt move.l (a7)+,d1 bsr.w odghexl movea.l #prepis7,a0 bsr.w odgtxt bsr.w prompt rts prepis4 'Izvor: ' prepis5 ' Dolzina: ' prepis6 ' Cilj: ' prepis7 ' ' ;*** Beri/pisi eno ali vec besed v spomin *** memlok bsr.w hexvhod ;precitaj naslov memorijske lokacije andi.l #-2,d0 ;sodi naslov! movea.l d0,a3 bsr.w hexvhod ;precitaj vsebino za vpisovanje move.w d2,-(a7) ;zastavica move.w d0,-(a7) ;vsebina bsr.w hexvhod ;tretje stevilo? bmi.b memlok5 ;nakladanje vec besed >>>>>>>>>>>>>>>>>>> movea.l a2,a0 bsr.w odgblok move.l a3,d1 ;izpisi naslov bsr.w odghexl movea.l #memlok2,a0 bsr.w odgtxt move.w (a3),d1 ;izpisi staro vsebino bsr.w odghex move.w (a7)+,d1 ;vpisi novo vsebino? move.w (a7)+,d2 bpl.b memlok1 move.w d1,(a3) ;vpise novi word movea.l #memlok3,a0 bsr.w odgtxt move.w (a3),d1 bsr.w odghex memlok1 movea.l #memlok8,a0 bsr.w odgtxt bsr.w prompt rts memlok2 ':' memlok3 '>' memlok5 move.w (a7)+,d2 ;vpisi vec besed, izpisi samo naslove! move.w (a7)+,d3 move.l a3,-(a7) move.w d2,(a3)+ ;prva beseda v spomin move.w d0,(a3)+ ;druga beseda v spomin memlok6 bsr.w hexvhod ;naslednje besede v spomin tst.w d2 bpl.b memlok7 move.w d0,(a3)+ bra.b memlok6 memlok7 movea.l a2,a0 ;odgovori z naslovoma bsr.w odgblok move.l (a7)+,d1 ;zacetni naslov bsr.w odghexl movea.l #memlok3,a0 bsr.w odgtxt move.l a3,d1 ;koncni naslov, naslednja beseda bsr.w odghexl movea.l #memlok8,a0 bsr.w odgtxt bsr.w prompt rts memlok8 ' ... ' ;*** Listaj 256 bajtov spomina - samo SYSOP! *** listaj bsr.w hexvhod ;precitaj zacetni naslov v A1 movea.l d0,a1 bsr.w hexvhod ;dolzina bin izpisa / prepisovanja? tst.l d2 bmi.w binizp ;!!!!! binarni izpis / prepisovanje >>>>>> move.l a1,d0 ;sodi naslov! andi.l #-2,d0 movea.l d0,a1 movea.l a2,a3 moveq #3,d1 ;odgovor iz stirih blokov listaj7 move.w d1,-(a7) move.l a1,-(a7) movea.l a3,a0 bsr.w odgblok movea.l (a7)+,a1 moveq #3,d1 ;po stiri vrstice v blok listaj6 move.w d1,-(a7) bsr.b listaj1 move.w (a7)+,d1 dbf d1,listaj6 move.w (a7)+,d1 dbf d1,listaj7 bsr.w prompt rts listaj1 move.l a1,-(a7) ;vrstica: naslov in 8 wordov (a1)+ move.l a1,d1 ;izpis naslova bsr.w odghexl movea.l #listaj2,a0 bsr.w odgtxt movea.l (a7)+,a1 moveq #7,d1 ;izpisi 8 wordov listaj3 move.w d1,-(a7) move.w (a1)+,d1 move.l a1,-(a7) bsr.w odghex movea.l #listaj4,a0 bsr.w odgtxt movea.l (a7)+,a1 move.w (a7)+,d1 dbf d1,listaj3 move.l a1,-(a7) movea.l #listaj5,a0 bsr.w odgtxt movea.l (a7)+,a1 rts listaj2 ':' listaj4 ',' listaj5 '^M' ;*** Binarni izpis vsebine pomnilnika (A1,D0.L) *** binizp move.l d0,d7 ;stevec bajtov D7.L bsr.w hexvhod ;naslov cilja prepisovanja? tst.l d2 bmi.w prepis ;prepisovanje iz/v pomnilnik >>>>>>>>>>>>> adda.w #sysopst,a2 ;A2 kaze na stevilko bloka binizp1 tst.l d7 ;konec zanke prepisovanja pomnilnik v okvir? bne.b binizp2 rts binizp2 move.l #ddokvir,d5 ;izracunaj dolzino okvirja v D5.L cmp.l d7,d5 bcs.b binizp3 move.l d7,d5 binizp3 sub.l d5,d7 bsr.w dodeli ;dodeli okvir za vmesnik move.w d0,(a2) bne.b binizp4 ;nic vec prostora v pomnilniku? rts binizp4 bsr.w naslov clr.w (a0) move.w #bokvir,#zactxt(a0) move.w d5,#doltxt(a0) movea.l a0,a2 ;A2 kaze na stevilko bloka adda.w #bokvir,a0 bra.b binizp6 binizp5 move.b (a1)+,(a0)+ ;prepisi en bajt iz pomnilnika binizp6 dbf d5,binizp5 bra.b binizp1 ;*** Javi se s kokodakanjem na enem/vseh kanalih, n-krat *** javise bsr.w decvhod ;zahteva stevilko kanala? cmpi.l #nkanal,d0 bcs.b javise7 beq.b javise7 moveq #0,d0 javise7 move.l d0,d7 ;stevilka kanala kokodakanja moveq #0,d0 tst.w #sysopst(a2) ;sysop lahko veckrat? bpl.b javise1 bsr.w decvhod javise1 move.w #dolvmes,d1 ;najvecje stevilo kokodakanj lsr.w #1,d1 cmp.w d1,d0 bcs.b javise2 move.w d1,d0 javise2 subq.w #1,d0 ;vsaj enkrat bpl.b javise3 moveq #0,d0 javise3 move.w d0,-(a7) ;odgovori s stevilom javljanj movea.l a2,a0 bsr.w odgblok movea.l #javise4,a0 bsr.w odgtxt moveq #0,d1 move.w (a7),d1 addq.w #1,d1 bsr.w odgstev movea.l #javise5,a0 bsr.w odgtxt tst.l d7 bne.b javise8 movea.l #javis10,a0 bsr.w odgtxt bra.b javise9 javise8 movea.l #javis11,a0 bsr.w odgtxt move.l d7,d1 bsr.w odgstev javise9 movea.l #javis12,a0 bsr.w odgtxt bsr.w prompt move.w (a7)+,d0 javise6 move.w d0,-(a7) ;javljaj se s kokodakanjem move.l #milisek(a5),#kokoura(a5) bsr.w kokodak move.w (a7)+,d0 dbf d0,javise6 rts javise4 '*** Javlja se ' javise5 ' krat na ' javis10 'vseh kanalih' javis11 'kanalu ' javis12 ' ... ' ;*** Xmenjaj RRpoll/Info ponavljanje *** xmenjaj bsr.w decvhod ;zahteva za menjavo ponavljanja? tst.l d2 beq.b xmenja1 lsl.w #8,d0 lsl.w #6,d0 move.w d0,(a2) xmenja1 move.w (a2),d7 ;izpis vrste ponavljanja... movea.l a2,a0 bsr.w odgblok movea.l #xmenja2,a0 bsr.w odgtxt clr.l d1 move.w d7,d1 lsl.l #2,d1 clr.w d1 swap d1 bsr.w odgstev movea.l #xmenja3,a0 bsr.w odgtxt bsr.w prompt rts xmenja2 '*** RRpoll/Info ponavljanje ' xmenja3 ' ... ' ;*** Decimalno stevilo iz ukaza v D0.L, zastavica D2 *** decvhod clr.l d0 clr.l d2 bsr.w beseda ;poisci naslednjo besedo v ukazu decvho1 tst.w d1 ;se en znak iz ukaza? beq.b decvho2 cmpi.b #33,(a0) bcc.b decvho3 decvho2 rts decvho3 lsl.l #1,d0 ;pomnozi prejsnje stevilo z 10 move.l d0,d2 lsl.l #2,d0 add.l d2,d0 move.b (a0)+,d2 ;precita in pretvori znak iz ukaza subq.w #1,d1 andi.l #15,d2 add.l d2,d0 ;pristeje nov znak moveq #-1,d2 ;zastavica bra.b decvho1 ;*** Hexadecimalno stevilo iz ukaza v D0.L, zastavica D2 *** hexvhod clr.l d0 clr.l d2 bsr.w beseda ;poisci naslednjo besedo v ukazu hexvho2 tst.w d1 ;pretvarja hex stevilo v D0.L beq.b hexvho3 cmpi.b #33,(a0) bcs.b hexvho3 move.b (a0)+,d2 subq.w #1,d1 cmpi.b #64,d2 bcs.b hexvho4 subq.b #7,d2 hexvho4 andi.w #15,d2 lsl.l #4,d0 add.b d2,d0 moveq #-1,d2 bra.b hexvho2 hexvho3 rts ;konec stevila ;*** Cas delovanja, zveze, naslovi in reset/run SuperVozlja *** reset tst.w #sysopst(a2) bpl.b reset1 ;ce ni sysop? bsr.w hexvhod ;precitaj naslov podprograma tst.w d2 bpl.b reset1 ;ni novega naslova? andi.l #-2,d0 move.l d0,#podprog(a5) bsr.w decvhod ;precitaj periodo klicanja tst.w d2 bpl.b reset1 move.l d0,#podperi(a5) move.l d0,#podstev(a5) reset1 movea.l a2,a0 ;cas delovanja, stevilo zvez in naslovi move.w #sysopst(a2),-(a7) ;sysop stanje movea.l a0,a3 bsr.w odgblok movea.l #reset2,a0 ;izpisi inacico, cputip in dmatip bsr.w odgtxt move.l (#cputip),d1 bsr.w odgstev tst.l (#dmatip) beq.b reset20 movea.l #reset21,a0 bsr.w odgtxt move.l (#dmatip),d1 bsr.w odgstev reset20 movea.l #reset22,a0 ;izpisi cas delovanja bsr.w odgtxt move.l #minute(a5),d1 bsr.w odgstev movea.l #reset3,a0 ;izpisi hitrost glavne zanke bsr.w odgtxt move.l #hitrost(a5),d1 bsr.w odgstev movea.l #reset4,a0 bsr.w odgtxt moveq #0,d1 ;zanka za izpis statistike po kanalih reset15 addq.w #1,d1 move.w d1,-(a7) andi.w #1,d1 ;dodeli nov blok za odgovor? bne.b reset16 movea.l a3,a0 bsr.w odgblok reset16 movea.l #reset10,a0 ;izpisi stevilko kanala bsr.w odgtxt clr.l d1 move.w (a7),d1 bsr.w odgstev move.w (a7),d7 ;izracunaj odmik parametrov kanala mulu #kparam,d7 movea.l #reset11,a0 ;procent aktivnosti DCDja bsr.w odgtxt clr.l d1 move.w #procdcd(a5,d7.w),d1 bsr.w odgstev movea.l #reset12,a0 ;procent aktivnosti PTTja bsr.w odgtxt clr.l d1 move.w #procptt(a5,d7.w),d1 bsr.w odgstev movea.l #reset18,a0 ;stevilo cakajocih TX okvirjev bsr.w odgtxt movea.l #bvmesni(a5,d7.w),a0 clr.l d1 move.w (a0)+,d1 sub.w (a0)+,d1 bpl.b reset19 addi.w #dolvmes,d1 reset19 lsr.l #1,d1 bsr.w odgstev movea.l #reset13,a0 ;stevilo vstopnih zvez po kanalih bsr.w odgtxt move.l #vstzvez(a5,d7.w),d1 bsr.w odgstev movea.l #reset14,a0 ;stevilo izstopnih zvez po kanalih bsr.w odgtxt move.l #izszvez(a5,d7.w),d1 bsr.w odgstev movea.l #reset8,a0 bsr.w odgtxt move.w (a7)+,d1 cmpi.w #nkanal,d1 bcs.w reset15 movea.l #reset23,a0 ;izpisi stevilo javljanj bsr.w odgtxt move.l #njavise(a5),d1 bsr.w odgstev movea.l #reset24,a0 ;izpisi stevilo odzivov bsr.w odgtxt move.l #nodzivi(a5),d1 bsr.w odgstev movea.l #reset25,a0 ;izpisi stevilo BIN slik bsr.w odgtxt move.l #nbslike(a5),d1 bsr.w odgstev movea.l #reset26,a0 ;izpisi stevilo JPEG slik bsr.w odgtxt move.l #njslike(a5),d1 bsr.w odgstev movea.l a3,a0 ;dodeli nov blok za odgovor bsr.w odgblok movea.l #reset27,a0 ;izpisi stevilo resenih sysop gesel bsr.w odgtxt movea.l #nsysop(a5),d1 bsr.w odgstev move.w (a7)+,d1 ;trenutni sysop? bpl.b reset17 movea.l #reset9,a0 bsr.w odgtxt reset17 movea.l #reset5,a0 ;izpisi osnovni naslov bsr.w odgtxt move.l a6,d1 bsr.w odghexl movea.l #reset6,a0 ;izpisi klicani naslov bsr.w odgtxt move.l #podprog(a5),d1 bsr.w odghexl movea.l #reset7,a0 bsr.w odgtxt move.l #podperi(a5),d1 ;izpisi periodo klicanja bsr.w odgstev movea.l #reset8,a0 bsr.w odgtxt bsr.w prompt rts reset2 '*** SuperVozelj V81 ' reset21 '+' reset22 ' Cas delovanja: ' reset3 ' minut ' reset4 ' zank/s ***^M' reset23 'Javljanja: ' reset24 ' Odzivi: ' reset25 ' Slike(BIN): ' reset26 ' Slike(JPEG): ' reset27 '^MGeslo: ' reset5 ' Osnovni naslov: ' reset6 ' Klicani naslov: ' reset7 ' Perioda: ' reset8 '^M' reset9 '!' reset10 'Kanal: ' reset11 ' DCD: ' reset12 '% PTT: ' reset18 '% Caka: ' reset13 ' Vstop: ' reset14 ' Izstop: ' ;*** Glej klicni znak uporabnika *** glejzna moveq #7,d2 ;kazalec na crke klicnega znaka clr.w #nznakov(a1) move.w #-1,#zahteva(a1) bsr.w ukznak ;precitaj iskani (kanal in) klicni znak tst.w #zahteva(a1) bpl.b glejzn9 clr.w #zahteva(a1) glejzn9 movea.l #glejzac,a0 ;naslov in dolzina Glej seznama move.l #glejdol,d1 movea.l a2,a3 ;naslov zveze za odgovor v A3 tst.w #nznakov(a1) ;ce ni znaka - izpisi celoten seznam beq.w glejtab clr.w #nznakov(a1) glejzn1 subi.l #glejblo,d1 ;iskanje znaka - kontrola preostale bmi.b glejzn3 cmpi.w #glejzas,(a0) ;poglej zastavico seznama beq.b glejzn2 glejzn3 movea.l a3,a0 ;prompt na koncu izpisa zvez bsr.w odgblok bsr.w prompt rts glejzn2 tst.w #zahteva(a1) ;zahteva za kanal? beq.b glejzn5 move.w #rxkanal(a0),d0 ;primerjaj stevilko kanala cmp.w #zahteva(a1),d0 beq.b glejzn5 glejzn6 adda.l #glejblo,a0 ;naslednji klicni znak bra.b glejzn1 glejzn5 moveq #6,d2 ;primerjaj klicne znake brez SSID! moveq #5,d3 glejzn7 addq.w #1,d2 move.b #bokvir(a1,d2.w),d0 cmpi.b #84,d0 ;wildcard '*' za primerjavo? beq.b glejzn4 cmp.b #bokvir(a0,d2.w),d0 ;enaka crka v klicnem znaku? dbne d3,glejzn7 bne.b glejzn6 glejzn4 move.l a1,-(a7) ;izpisi podatke zadnje taksne zveze move.l d1,-(a7) move.l a0,-(a7) movea.l a3,a0 bsr.w odgblok movea.l (a7),a0 ;izpisi uro koncanja zveze adda.w #glejura,a0 clr.b #19(a0) suba.l a6,a0 bsr.w odgtxt movea.l (a7),a0 bsr.w uzveza movea.l #glejzn8,a0 bsr.w odgtxt movea.l (a7)+,a0 move.l (a7)+,d1 movea.l (a7)+,a1 bra.b glejzn6 glejzn8 '^M' ;*** Izpisi tabelo glej, samo kanal in znak uporabnika *** glejtab moveq #24,d7 ;dodeli prvi blok za odgovor glejta1 cmpi.w #24,d7 bcs.b glejta2 moveq #0,d7 ;D7.W stevec znakov v seznamu Glej move.l a0,-(a7) ;dodeli blok za odgovor move.l a1,-(a7) move.l d1,-(a7) movea.l a3,a0 bsr.w odgblok move.w d0,-(a7) ;naslov bloka bsr.w naslov movea.l a0,a2 move.w (a7)+,d0 move.l (a7)+,d1 movea.l (a7)+,a1 movea.l (a7)+,a0 tst.w d0 ;blok se na razpolago? bne.b glejta2 rts glejta2 subi.l #glejblo,d1 ;konec Glej seznama? bmi.b glejta3 cmpi.w #glejzas,(a0) ;poglej zastavico seznama beq.b glejta5 glejta3 andi.w #7,d7 ;prompt na koncu Glej seznama beq.b glejta4 movea.l #glejt11,a0 bsr.w odgtxt glejta4 bsr.w prompt rts glejta5 move.w #rxkanal(a0),d3 ;stevilka kanala tst.w #zahteva(a1) ;zahteva za kanal? beq.b glejta6 cmp.w #zahteva(a1),d3 beq.b glejta6 glejta7 adda.l #glejblo,a0 ;naslednji klicni znak v seznamu bra.b glejta1 glejta6 move.w #zactxt(a2),d2 ;prepisi kanal in znak add.w #doltxt(a2),d2 addi.w #48,d3 move.b d3,#0(a2,d2.w) move.b #58,#1(a2,d2.w) ;':' ...za navadno vstopno zvezo cmpi.w #3,#nznakov(a0) bcs.b glejta8 move.b #42,#1(a2,d2.w) ;'*' ...za zvezo preko VIA digi glejta8 tst.b #izvznak(a0) beq.b glejta9 move.b #62,#1(a2,d2.w) ;'>' ...za zvezo preko SVja glejta9 moveq #7,d3 ;klicni znak moveq #5,d4 glejt10 move.b #bokvir(a0,d3.w),d5 lsr.b #1,d5 move.b d5,#2(a2,d2.w) addq.w #1,d2 addq.w #1,d3 dbf d4,glejt10 move.b #32,#2(a2,d2.w) ;' ' med dvema znakoma addi.w #9,#doltxt(a2) ;pristej dolzino teksta addq.w #1,d7 ;steje samo izpisane klicne znake! move.w d7,d3 ;pretvori konec v po 8.znaku? andi.w #7,d3 bne.b glejta7 move.b #13,#2(a2,d2.w) bra.b glejta7 glejt11 '^M' ;*** Sporoci vrstico/stavek naslovniku *** sporoci moveq #7,d2 ;kazalec na crke klicnega znaka move.w d2,d3 addi.w #bokvir,d3 ;default klicni znak wildcard "*" move.b #84,#0(a1,d3.w) move.b #64,#1(a1,d3.w) move.w #-1,#zahteva(a1) bsr.w ukznak ;precitaj znak naslovnika clr.w #nznakov(a1) movem.l #$40e0,-(a7) ;blok - potrditev ukaza uporabniku movea.l a2,a0 bsr.w odgblok movea.l #sporoc1,a0 bsr.w odgtxt movem.l (a7)+,#$0702 movea.l a0,a3 ;zacetek A3 in dolzina D7.W sporocila move.w d1,d7 clr.l d6 ;stevec najdenih naslovnikov D6.L movea.l #naszvez(a5),a0 ;naslov A0 in stevilo D1 zvez move.w (a0)+,d1 bra.b sporoc2 ;zanka po vseh zvezah sporoc3 move.w d1,-(a7) move.w (a0)+,d1 move.l a0,-(a7) move.w d0,-(a7) ;stevilka bloka za potrditev prenosa move.w d1,d0 bsr.w sporoc5 move.w (a7)+,d0 movea.l (a7)+,a0 move.w (a7)+,d1 sporoc2 dbf d1,sporoc3 tst.l d6 ;stevilo najdenih: nobenega naslovnika? bne.b sporo14 move.l a1,d6 ;sporoci, da je naslovnik nedostopen movea.l #sporo15,a0 bsr.w odgtxt move.w d0,-(a7) ;prepisi znak nedostopnega naslovnika beq.b sporo17 bsr.w naslov movea.l d6,a1 ;A1 na zacetek klicnega znaka adda.w #bokvir,a1 addq.l #7,a1 movea.l a0,a2 adda.w #zactxt(a0),a2 adda.w #doltxt(a0),a2 moveq #5,d1 ;prepisi najvec 6 crk klicnega znaka sporo18 move.b (a1)+,d2 lsr.b #1,d2 cmp.b #32,d2 ;presledek? beq.b sporo17 move.b d2,(a2)+ addq.w #1,#doltxt(a0) dbf d1,sporo18 sporo17 move.w (a7)+,d0 movea.l #sporo16,a0 bsr.w odgtxt bsr.w prompt rts sporo14 movea.l #sporoc4,a0 ;stevilo najdenih naslovnikov bsr.w odgtxt move.l d6,d1 bsr.w odgstev movea.l #sporo13,a0 bsr.w odgtxt bsr.w prompt rts sporoc1 '*** Sporocilo preneseno ' sporo15 'nikomur! Naslovnik ' sporo16 ' nedostopen! ' sporoc4 '^M*** Najdenih ' sporo13 ' naslovnikov ... ' sporoc5 bsr.w naslov ;naslov bloka zveze tst.w #nznakov(a0) ;obsotjeca vstopna zveza? bne.b sporo20 rts sporo20 tst.w #sysopst(a2) ;SYSOP se vmesa v vsako zvezo!!!!!!! bmi.b sporoc6 move.w #povezav,d1 tst.w #nznakov(a0,d1.w) ;naslovnik v upravnem nacinu? beq.b sporoc6 tst.w #rxkanal(a0,d1.w) ;naslovnik klice? beq.b sporoc6 rts sporoc6 move.w #zahteva(a1),d0 ;zahteva za primerjavo kanala? bmi.b sporo19 beq.b sporo19 cmp.w #rxkanal(a0),d0 ;enak kanal? beq.b sporo19 rts sporo19 move.l a1,-(a7) ;primerjaj klicne znake move.l a0,-(a7) move.w #bokvir,d0 addq.w #7,d0 adda.w d0,a0 adda.w d0,a1 moveq #5,d0 ;primerjaj samo 6 crk klicnega znaka sporoc7 cmpi.b #84,(a1) ;wildcard "*" (ASCII*2)? beq.b sporoc8 cmpm.b (a0)+,(a1)+ dbne d0,sporoc7 beq.b sporoc8 ;vseh 6 crk znaka enakih? movea.l (a7)+,a0 movea.l (a7)+,a1 rts sporoc8 movea.l (a7),a0 ;dodeli blok za sporocilo naslovniku move.l a2,-(a7) bsr.w odgblok movea.l (a7)+,a2 tst.w d0 bne.b sporoc9 ;kaj ce ni vec prostora?!? movea.l (a7)+,a0 movea.l (a7)+,a1 rts sporoc9 move.l a2,-(a7) ;uporabnikov klicni znak naslovniku adda.w #bokvir,a2 addq.l #7,a2 bsr.w odgznak ;kontrola dolzine >>> nevarnost iz A3 !!! bsr.w naslov move.w #zactxt(a0),d1 ;izracunaj dolzino okvirja move.w #doltxt(a0),d2 move.w #ddokvir,d0 sub.w d2,d0 cmp.w d7,d0 bcs.b sporo12 move.w d7,d0 sporo12 add.w d0,#doltxt(a0) adda.w d1,a0 adda.w d2,a0 move.b #62,#-1(a0) ;pretvori presledek v puscico movea.l a3,a1 ;prepisi tekst sporocila bra.b sporo11 sporo10 move.b (a1)+,(a0)+ sporo11 dbf d0,sporo10 movea.l (a7)+,a2 ;potrdi prenos sporocila uporabniku movea.l (a7)+,a0 move.l a3,-(a7) movea.l a2,a3 movea.l a0,a2 ;naslovnikov klicni znak adda.w #bokvir,a2 addq.l #7,a2 move.w #12(a7),d0 bsr.w odgznak ;izpisi znak s kontrolo dolzine A3 move.w d0,#12(a7) movea.l a3,a2 movea.l (a7)+,a3 movea.l (a7)+,a1 addq.l #1,d6 ;povecaj stevec najdenih naslovnikov rts ;*** Precitaj klicni znak iz ukaza v okvir (A1,D2.W) *** ukznak bsr.w beseda ;poisci naslednjo besedo v ukazu tst.w #zahteva(a1) ;zahteva za kanal ze postavljena? bpl.b ukznak1 cmpi.w #1,d1 ;sledi zadosti znakov? bcs.b ukznak1 beq.b ukznak2 cmpi.b #33,#1(a0) ;presledek za eno samo stevilko? bcc.b ukznak1 ukznak2 clr.w d3 move.b (a0),d3 ;precita stevilko kanala subi.w #48,d3 cmpi.w #nkanal,d3 ;veljavna stevilka kanala? bhi.b ukznak1 move.w d3,#zahteva(a1) ;zahteva za kanal klicanja bsr.w beseda ;poisci naslednjo besedo v ukazu ukznak1 moveq #5,d3 ;precitaj najvec 6 crk klicnega znaka ukznak5 tst.w d1 bne.b ukznak6 rts ukznak6 cmpi.b #33,(a0) bcs.b ukznak7 cmpi.b #45,(a0) beq.b ukznak7 move.b (a0)+,d0 cmpi.b #96,d0 ;male crke pretvori v velike bcs.b ukzna13 subi.b #32,d0 ukzna13 lsl.b #1,d0 move.b d0,#bokvir(a1,d2.w) addq.w #1,d2 subq.w #1,d1 dbf d3,ukznak5 ukznak7 tst.w d3 ;napolni manjkajoce crke s presledki bmi.b ukznak8 move.b #64,#bokvir(a1,d2.w) addq.w #1,d2 subq.w #1,d3 bra.b ukznak7 ukznak8 moveq #6,d0 ;prepisi SSID vozlja, ce ni naveden move.b #bokvir(a2,d0.w),#bokvir(a1,d2.w) addq.w #1,d2 addq.w #1,#nznakov(a1) ;veljaven znak! cmpi.b #45,(a0) ;naveden SSID? beq.b ukznak9 rts ukznak9 clr.w d0 ;precitaj steviko SSID-ja addq.l #1,a0 subq.w #1,d1 ukzna10 tst.w d1 bne.b ukzna11 rts ukzna11 cmpi.b #33,(a0) ;konec znaka? bcs.b ukzna12 mulu #10,d0 add.b (a0)+,d0 andi.w #15,d0 subq.w #1,d1 bra.b ukzna10 ukzna12 andi.w #15,d0 ;izracunani SSID lsl.b #1,d0 ori.b #96,d0 move.w d2,d3 subq.w #1,d3 move.b d0,#bokvir(a1,d3.w) rts ;*** Vzpostavljanje povezave - ukaz C(onnect) *** klici moveq #6,d0 ;prepisi klicni znak in SSID uporabnika moveq #7,d3 moveq #0,d2 klici1 move.b #bokvir(a2,d3.w),#bokvir(a1,d2.w) addq.w #1,d3 addq.w #1,d2 dbf d0,klici1 subq.w #1,d2 ;ciklicno povecaj SSID za 1 addq.b #2,#bokvir(a1,d2.w) andi.b #30,#bokvir(a1,d2.w) ori.b #96,#bokvir(a1,d2.w) addq.w #1,d2 move.w #1,#nznakov(a1) ;stevec klicnih znakov move.w #-1,#zahteva(a1) ;osposobi avtomatiko klici2 cmpi.w #maxznak,#nznakov(a1) ;zanka za vhod klicnih z. bcc.b klici3 move.w d2,d3 ;default klicni znak "CQ" addi.w #bokvir,d3 move.b #134,#0(a1,d3.w) move.b #162,#1(a1,d3.w) move.b #64,#2(a1,d3.w) move.b #64,#3(a1,d3.w) move.b #64,#4(a1,d3.w) move.b #64,#5(a1,d3.w) move.b #96,#6(a1,d3.w) bsr.w ukznak ;precitaj klicani klicni znak iz ukaza move.w d2,d3 ;spreminjanje lastnega SSIDja uporabnika? subq.w #7,d3 cmpi.b #$40,#bokvir(a1,d3.w) bne.b klici9 subq.w #1,d2 moveq #6,d3 move.b #bokvir(a1,d2.w),#bokvir(a1,d3.w) subq.w #6,d2 subq.w #1,#nznakov(a1) ;sprememba SSIDja ni nov znak! klici9 tst.w d1 ;konec ukaza? bne.b klici2 klici3 clr.b #izvznak(a1) bsr.w avtomat ;avtomatsko posredovanje klicanja!!!!!!!! bsr.w kvozlji ;klicanje po tabeli vozljev!!!!!!!!!!!!!! bsr.w knazaj ;avtomatsko klicanje nazaj!!!!!!!!!!!!!!!! bsr.w kglej ;avtomatsko klicanje nazaj po Glej!!!!!!!!! tst.w #zahteva(a1) ;nobene zahteve? bpl.b klic10 clr.w #zahteva(a1) klic10 cmpi.w #2,#nznakov(a1) bcc.b klici4 move.w #2,#nznakov(a1) klici4 move.w (a2),(a1) ;postavi protokol povezave... lsl.w (a1) clr.w #txtblok(a1) ;pocisti vse spremenljivke protokola clr.w #nponovi(a1) move.l #milisek(a5),#tponovi(a1) clr.l #rpromet(a1) clr.l #tpromet(a1) clr.w #txprkaz(a1) clr.w #rxprkaz(a1) clr.w #potrjen(a1) move.w #maxfram,#mokvir(a1) clr.w #podgovo(a1) clr.w #rxkanal(a1) ;rxkanal=0 > nima se povezave move.l a2,-(a7) ;potrdi vzpostavljanje povezave move.l a1,-(a7) movea.l a2,a0 bsr.w odgblok movea.l #klici5,a0 bsr.w odgtxt movea.l (a7),a0 bsr.w uzveza movea.l #klici6,a0 bsr.w odgtxt movea.l (a7),a0 ;primerjaj klicani znak s fujznaki bsr.w fujznak movea.l (a7)+,a1 movea.l (a7)+,a2 tst.w d0 bne.b klici8 bsr.w pdvzvez ;preverjanje znakov dvojnih zvez cmpi.w #1,d7 bne.b klici8 rts klici8 move.w #provmes(a2),d2 ;podri vzpost. nedovoljene zveze bsr.w spposr movea.l a2,a0 ;javi nedovoljene znake bsr.w odgblok movea.l #klici7,a0 bsr.w odgtxt bsr.w prompt rts klici5 '*** ' klici6 '***^M' klici7 '*** Nedovoljen(i) klicni znak(i) !!! ***^M' ;*** Preverjanje stevila (A1) enakih zvez v D7.W *** pdvzvez movea.l #naszvez(a5),a3 ;naslov bloka zvez clr.w d7 ;stevec enakih zvez move.w (a3)+,d6 bra.b pdvzve1 pdvzve2 move.w (a3)+,d0 bsr.w naslov bsr.b pdvzve3 ;preveri vstopno zvezo adda.w #povezav,a0 bsr.b pdvzve3 ;preveri povezavo pdvzve1 dbf d6,pdvzve2 rts pdvzve3 move.w #nznakov(a0),d0 ;primerjanje stevila znakov zvez cmp.w #nznakov(a1),d0 beq.b pdvzve4 rts pdvzve4 move.l a0,-(a7) ;primerjanje klicnih znakov obeh zvez move.l a1,-(a7) adda.w #bokvir,a0 adda.w #bokvir,a1 mulu #7,d0 subq.w #1,d0 pdvzve5 cmpm.b (a0)+,(a1)+ dbne d0,pdvzve5 bne.b pdvzve6 addq.w #1,d7 ;enaki znaki - povecaj stevec! pdvzve6 movea.l (a7)+,a1 movea.l (a7)+,a0 rts ;*** Avtomatsko posredovanje klicanja *** avtomat cmpi.w #2,#nznakov(a1) beq.b avtom16 rts avtom16 tst.w #zahteva(a1) bmi.b avtoma1 rts avtoma1 movea.l #avtzac,a0 ;tabela za posredovanje move.w (a0)+,d1 cmpi.w #avtdol,d1 bcs.b avtoma2 move.w #avtdol,d1 avtoma2 tst.w d1 ;konec tabele? bne.b avtoma3 rts avtom