KEEP ATALK SYMBOL OFF LIST OFF ERR ON MSB OFF CodeChk ON DataChk OFF MCOPY ATALK.MACROS COPY TOOLS AX GEQU <$0 BX GEQU Return+1 LDA CompAdr+2 STA >Return+3 JSR GetMyName LDY #OpenATPSkt|-16 LDX #OpenATPSkt JSL APPLETALK SEP #$20 LDA Socket STA RespSkt STA RegSkt REP #$20 LDY #RegisterName|-16 LDX #RegisterName JSL APPLETALK JSR SetSound LDY #GetATPReq|-16 LDX #GetATPReq JSL APPLETALK LDX ZPHANDLE+2 LDY ZPHANDLE JSL FreeZMem PLD PLB RTL GetMyName ANOP OPEN OpnPrm LDA OpnPrm STA RdPrm READ RdPrm CLOSE OpnPrm LDA InitPkt AND #$00FF TAY INY LDX #0 NLOOP LDA NameSuf,X STA InitPkt,Y INY INX CPX #12 BNE NLOOP RTS ; Completion routine ReqComp ENTRY PHB PHD PEA ATALKDAT|-8 PLB PLB LDX #$200 JSL GetZMem STX ZPHANDLE+2 STY ZPHANDLE TCD LDA REQBUFF CMP #MaxType+1 ; Not our packet, throw it away BGE ReqCont SEP #$20 LONGA OFF LDA #ReqCont|-16 PHA REP #$20 LONGA ON PEA ReqCont-1 LDA REQBUFF ASL A ASL A TAX SEP #$20 LDA PKTTYPE+2,X PHA REP #$20 LDA PKTTYPE,X PHA RTL ReqCont ANOP LDY #GetATPReq|-16 ; accept messages again LDX #GetATPReq JSL APPLETALK LDX ZPHANDLE+2 LDY ZPHANDLE JSL FreeZMem PLD PLB JMP Return ; Neccessary way to exit out of completion routines Return ENTRY JMP >$000000 DC I1'0' ; DON'T MOVE THIS!!!! ; ATLKSTAT - Returns if appletalk is active or not. ; carry clear - active ; carry set - not active (should not make apple talk calls) ATLKSTAT ANOP LDA >$00C7F9 CMP #$5441 ; 'AT' BNE A3 LDA >$00C7FB ; 'LK' CMP #$4B4C BNE A3 CLC RTS A3 SEC RTS MakeSound ENTRY PHA LDX #SoundToolStatus JSL TOOLS PLA BNE MS1 TDC CLC ADC #$100 PHA LDX #SoundStartUp JSL TOOLS MS1 ANOP LDA SNDIN BNE S1 LDX #SysBeep JSL TOOLS RTL S1 ANOP LDA SNDHAND+2 PHA STA AX+2 LDA SNDHAND PHA STA AX LDX #HLock JSL TOOLS LDA [AX] TAX LDY #2 LDA [AX],Y STA FFRecord+2 STX FFRecord PEA $7FFF LDX #FFStopSound JSL TOOLS PEA 1 PEA FFRecord|-16 PEA FFRecord LDX #FFStartSound JSL TOOLS LDA SNDHAND+2 PHA LDA SNDHAND PHA LDX #HUnLock JSL TOOLS RTL DEREF ENTRY LDA [AX] TAX LDY #2 LDA [AX],Y STA AX+2 STX AX RTL SetSound ENTRY OPEN OpPkt JCS BadSnd LDA OpPkt STA RdPkt GET_EOF RdPkt JCS BadSnd LDA RdPkt+2 STA RdPkt+6 LDA RdPkt+4 STA RdPkt+8 LDA RdPkt+2 XBA AND #$00FF PHA LDA RdPkt+4 XBA ORA 1,S PLX STA FFRecord+4 PHA PHA LDA RdPkt+8 PHA LDA RdPkt+6 PHA LDA MYID PHA PEA $0008 PHA PHA LDX #NewHandle JSL TOOLS PLA ; get the new handle STA AX STA SNDHAND PLA STA AX+2 STA SNDHAND+2 JCS BadSnd LDA [AX] TAX LDY #2 LDA [AX],Y STA RdPkt+4 STX RdPkt+2 READ RdPkt JCS BadSnd CLOSE OpPkt RTS BadSnd ANOP LDA #0 STA SNDIN RTS ; GetZMem - get a range of memory in zero page (rather prodos 8 or 16) ; In : X = size of block to get (multiple of $100) ; Out : X,Y - Handle of block (if prodos 16) ; A - Address of block in bank 0 ; ; NOTE : Right now you can't ask for more than 3 pages ; You must call FreeZMem to get rid of the memory GetZMem ENTRY LDA >$E100BC AND #$00FF BEQ P8 PHA PHA PEA 0 PHX LDA MYID PHA PEA $C005 PEA $0 PEA $0 LDX #NewHandle JSL TOOLS PEI AX+2 PEI AX LDA 5,S STA AX LDA 7,S STA AX+2 LDA [AX] PLX STX AX PLX STX AX+2 PLY PLX RTL P8 ANOP LDX #$300-2 P8LOOP LDA >$008000,X STA ZSave,X DEX DEX BPL P8LOOP LDX #0 LDY #0 LDA #$8000 ; give them 8000 RTL ; FreeZMem - free zero page area ; IN : X,Y - Handle of zero page FreeZMem ENTRY CPX #0 BNE FP16 CPY #0 BNE FP16 LDX #$300-2 F8LOOP LDA ZSave,X STA >$008000,X DEX DEX BPL F8LOOP RTL FP16 PHX PHY LDX #DisposeHandle JSL TOOLS RTL END ;------- routines to handle different types of packets ---- SEND START USING ATALKDAT LDA INCDA BEQ S2 JSL GETMSG S2 RTL PAGER ENTRY LDA SrcNode AND #$00FF STA LastPage JSL MakeSound LDA INCDA BNE Pag1 RTL Pag1 LDA SrcNode AND #$00FF JSL FlashUsr RTL ; FlashUsr - Flash the bar on a particular user ; in: Acc - node number FlashUsr ENTRY PEI AX LDX Temp PHX STA Temp LDA #Buffer STA AX LDX #0 FLLOOP ANOP PHX LDY #2 LDA (AX),Y AND #$00FF CMP Temp BEQ FL2 LDA AX CLC ADC #5 STA AX JSL MOVEN JSL MOVEN JSL MOVEN PLX INX CPX NumMatch BNE FLLOOP JMP FLDONE FL2 ANOP PLA STA Temp LDA CH PHA LDA CV PHA LDA XMIN PHA LDA XMAX PHA LDA YMIN PHA LDA YMAX PHA LDX #$0000 LDY #$5016 JSL SETWNDW LDA Temp INA JSL INVERT JSR WAIT JSL INVERT JSR WAIT JSL INVERT JSR WAIT JSL INVERT JSR WAIT JSL INVERT JSR WAIT JSL INVERT PLA STA YMAX PLA STA YMIN PLA STA XMAX PLA STA XMIN PLA STA CV PLA STA CH FLDONE ANOP PLA STA Temp PLA STA AX RTL WAIT ANOP LDY #$FFFF WLOOP DEY BNE WLOOP RTS END CDA_OPEN START CDASEG USING ATALKDAT USING TOOLDAT PHB PHD PEA ATALKDAT|-8 PLB PLB LDA #1 STA INCDA LDA #1 STA CHRec STA CHSnd LDA #2 STA CVRec LDA #13 STA CVSnd LDX #$100 JSL GetZMem STX CDZHAND+2 STY CDZHAND TCD JSL TXTSTART JSR DRAWSCRN JSR USERLIST LDA LastPage BEQ CMD JSL FlashUsr CMD ANOP JSL GETKEY AND #$5F ; convert to upper case LDX #KEYTBL JSL CITRP BCS CMD DEX PEA CMD-1 PHX RTS QUIT ENTRY PLA DONECDA ANOP LDX CDZHAND+2 LDY CDZHAND JSL FreeZMem LDA #0 STA INCDA PLD PLB RTL GETMSG ENTRY LDA CH PHA LDA CV PHA LDA XMIN PHA LDA XMAX PHA LDA YMIN PHA LDA YMAX PHA JSR WRITEUSR LDX #$0102 LDY #$3B0B JSL SETWNDW LDA CHRec STA CH LDA CVRec STA CV LDX #ReqBuff|-16 LDY #ReqBuff+2 JSL WriteCStr LDA #13 JSL PUTCHAR LDA CH STA CHRec LDA CV STA CVRec PLA STA YMAX PLA STA YMIN PLA STA XMAX PLA STA XMIN PLA STA CV PLA STA CH RTL ; write the user out who sent the packet WRITEUSR ANOP LDX #$0100 LDY #$3B0B JSL SETWNDW LDX #30 LDY #1 JSL GOTOXY LDA #Buffer STA AX LDX #0 WULOOP ANOP PHX LDA SrcNode AND #$00FF STA Temp LDY #2 LDA (AX),Y AND #$00FF CMP Temp BNE WU2 LDA #KSI JSL PUTCHAR LDA AX CLC ADC #5 TAY LDX #Buffer|-16 JSL WritePStr LDA #KEOL JSL PUTCHAR LDA #KSO JSL PUTCHAR PLX RTS WU2 ANOP LDA AX CLC ADC #5 STA AX JSL MOVEN JSL MOVEN JSL MOVEN PLX INX CPX NumMatch BNE WULOOP RTS SENDMSG ENTRY LDA USRNUM BNE SND2 RTS SND2 TAX JSR GETADR STX Address STY Address+2 LDA CH PHA LDA CV PHA LDA XMIN PHA LDA XMAX PHA LDA YMIN PHA LDA YMAX PHA LDX #$0000 LDY #$5016 JSL SETWNDW LDX #MSG2|-16 LDY #MSG2 JSL WriteCStr LDX #$010D LDY #$3B16 JSL SETWNDW LDA CHSnd STA CH LDA CVSnd STA CV Snd2a LDX #SendBuff JSL GetStr BCS Snd2b LDA #0 STA SendBuf LDY #SendATPReq|-16 LDX #SendATPReq JSL APPLETALK BRA SND2a Snd2b ANOP LDA CV STA CVSnd LDA CH STA CHSnd LDX #$0000 LDY #$5016 JSL SETWNDW LDX #MSG1|-16 LDY #MSG1 JSL WriteCStr PLA STA YMAX PLA STA YMIN PLA STA XMAX PLA STA XMIN PLA STA CV PLA STA CH RTS PAGE ENTRY LDA USRNUM BNE PAG2 RTS PAG2 ANOP TAX JSR GETADR STX Address STY Address+2 LDA #1 STA SendBuf LDY #SendATPReq|-16 LDX #SendATPReq JSL APPLETALK RTS DA ENTRY LDA USRNUM BNE DA4 RTS DA4 JSL INVERT INC USRNUM LDA USRNUM CMP NumMatch BLT DA3 BEQ DA3 LDA #1 STA USRNUM DA3 JSL INVERT RTS UA ENTRY LDA USRNUM BNE UA4 RTS UA4 JSL INVERT DEC USRNUM LDA USRNUM BNE UA2 LDA NumMatch STA USRNUM UA2 JSL INVERT RTS INVERT ENTRY PHA CLC ADC #2 TAY LDX #61 JSL GOTOXY LDX #InvertL|-16 LDY #InvertL JSL WriteCStr PLA RTL ; GETADR - Get the network address of a specific user ; IN : X - Number of user to get address for (1-NumMatch) ; OUT : X,Y - address of user GETADR ANOP LDA #Buffer STA AX DEX BEQ GDONE G2 ANOP PHX LDA AX CLC ADC #5 ; offset into name STA AX JSL MOVEN ; skip name JSL MOVEN ; skip type JSL MOVEN ; skip zone PLX DEX BNE G2 GDONE ANOP LDY #2 LDA (AX),Y TAY LDA (AX) TAX RTS USERLIST ANOP LDY #LookUpName|-16 LDX #LookUpName JSL AppleTalk LDA NumMatch BNE U2 LDA #0 STA USRNUM RTS U2 TAX LDA #Buffer STA AX LDA #Buffer|-16 STA AX+2 LDA #3 STA Temp LOOP PHX LDA AX CLC ADC #5 ; offset into name STA AX LDX #62 LDY Temp JSL GOTOXY LDX AX+2 LDY AX JSL WritePStr INC Temp JSL MOVEN ; skip name JSL MOVEN ; skip type JSL MOVEN ; skip zone PLX DEX JNE LOOP LDX #61 LDY #3 JSL GOTOXY LDX #InvertL|-16 LDY #InvertL JSL WriteCStr LDA #1 STA USRNUM RTS MOVEN ENTRY LDA (AX) AND #$00FF SEC ADC AX STA AX RTL DRAWSCRN ANOP JSL HOME LDA #' ' JSL PUTCHAR LDY #77 LDA #'_' JSR Line LDA #' ' JSL PUTCHAR LDA #21 STA Temp D1 ANOP LDX #0 LDY Temp JSL GOTOXY LDA #'|' JSL PUTCHAR LDX #60 LDY Temp JSL GOTOXY LDA #'|' JSL PUTCHAR LDX #79 LDY Temp JSL GOTOXY LDA #'|' JSL PUTCHAR DEC Temp LDA Temp BNE D1 LDX #0 LDY #22 JSL GOTOXY LDA #'|' JSL PUTCHAR LDY #77 LDA #'_' JSR Line LDA #'|' JSL PUTCHAR LDX #1 LDY #11 JSL GOTOXY LDY #58 LDA #'_' JSR Line LDX #60 LDY #22 JSL GOTOXY LDA #'|' JSL PUTCHAR LDX #61 LDY #16 JSL GOTOXY LDY #17 LDA #'_' JSR Line LDX #CHTXT|-16 LDY #CHTXT JSL WriteCStr LDX #MSG1|-16 LDY #MSG1 JSL WriteCStr RTS Line ANOP STA TEMP Line2 PHY LDA TEMP JSL PUTCHAR PLY DEY BPL Line2 RTS CDA_CLOSE ENTRY PHB PHD PEA ATALKDAT|-8 PLB PLB PLD PLB RTL CITRP ENTRY PHA TSC ; make stack the zero page PHD TCD SEP #$20 LONGA OFF CITRP1 LDA |0,X ; get the table value indirect thru the stack INX ; add 3 bytes per table entry INX INX CMP #-1 ; compare table value to -1 BEQ CITRP3 ; end of table CMP 1 ; compare table value to accum (on stack) BNE CITRP1 ; match found CLC ; found CITRP3 ANOP LONGA ON REP #$20 DEX ; back up to address DEX LDA |0,X ; get address of routine (WRAPS TO X - 3) TAX ; put the address in the X-reg PLD ; restore direct page PLA RTL ; return END ;----------------- data -------------------- ATALKDAT DATA DATASEG AppleTalk EQU >$E11014 KeyBoard EQU $C000 ClrKey EQU $C010 ChTxt ANOP DC I1'KGOTO,64,18' DC C'P - Page' DC I1'KGOTO,64,19' DC C'S - Send' DC I1'KGOTO,64,20' DC C'U - UserList' DC I1'KGOTO,64,21' DC C' - Exits' DC I1'KSI' DC I1'KGOTO,1,1' DC C' Last message received from: ' DC I1'KGOTO,61,1' DC C' USERLIST ' DC I1'KSO,0' Msg1 DC I1'KGOTO,1,12,KSI' DC C' Choose a user to send message to. ' DC I1'KSO,0' Msg2 DC I1'KGOTO,1,12,KSI' DC C' Type in message - Hit to send, stops session ' DC I1'KSO,0' InvertL DC I1'KINVERTON',C' ',I1'KINVERTOFF',I1'0' KEYTBL DC I1'27',A'QUIT' DC C'S',A'SENDMSG' DC I1'$0A',A'DA' DC I1'$0B',A'UA' DC C'P',A'PAGE' DC I1'-1' KEYTBL2 DC I1'8',A'BKSPC' DC I1'21',A'FRWRD' DC I1'13',A'GetDone' DC I1'27',A'GetEsc' DC I1'-1' MYID DS 2 ZPHANDLE DS 4 CDZHAND DS 4 SNDIN DC I'1' ; if 0 then no sound found ZSave DS $300 INCDA DC I'0' ; flag if we are in cda or not USRNUM DC I'0' LASTPAGE DC I'0' ; node number of last pager CHSnd DC I'0' CVSnd DC I'0' CHRec DC I'0' CVRec DC I'0' Temp DS 4 String DC I1'32' DS 32 OpnPrm DC I'0' DC I4'ATNAME' DC I4'0' ATNAME DC I1'28',C'*/SYSTEM/SYSTEM.SETUP/ATINIT' RdPrm DC I'0' DC I4'InitPkt-1' DC I4'64' DC I4'0' GetInfo ANOP DC I1'0' ; sync DC I1'$02' ; GetInfo DC I'0' ; result CompAdr DC I4'0' ; completion rtn routine DC I'0' DC I1'0' DC I1'0' DC I'0' DC I1'0' NameSuf DC I1'08',C'WPGSMAIL',I1'1',C'*' OpenATPSkt ANOP DC I1'0' ; sync DC I1'$14' DC I'0' Socket DC I1'0' RegisterName ANOP DC I1'0' ; sync DC I1'$0E' ; RegisterName DC I'0' ; result code DC I4'0' ; completion routine DC I4'RegName' ; Name structure DC I1'4' ; retry interval DC I1'4' ; retry count DC I'0' ; reserved RegSkt DC I1'0' ; socket number DC I1'1' ; check flag RegName DS 9 InitPkt ANOP DS 64 GetATPReq ANOP DC I1'$80' ; async DC I1'$16' ; GetATPReq DC I'0' ; result DC I4'ReqComp' ; Completion routine RespSkt DC I1'0' ; response socket DC I'0' ; source network number SrcNode DC I1'0' ; source node DC I1'0' ; source socket DC I'0' ; ATP transaction ID DC I'100' ; req. buffer length DC I4'ReqBuff' ; req. buffer pointer DC I4'0' ; user bytes DC I'0' ; actual request length DC I1'0' ; ATP flags DC I1'0' ; bitmap DC I4'0' ; reserved ReqBuff DC I'0' DC I1'0' ; zero length, no message yet DS 100 MaxType EQU 1 PKTTYPE DC I4'Send-1' ; 0 send request DC I4'Pager-1' ; 1 page user DC I4'0' Header DC I1'14',C'Message Center' DC I4'CDA_OPEN' DC I4'CDA_CLOSE' SNDHAND DS 4 OpPkt DC I'0' DC A4'PathName' DC I4'0' RdPkt DC I'0' DC A4'0' DC I4'0' DC I4'0' PathName DC I1'31',C'*/SYSTEM/SYSTEM.SETUP/ATALK.SND' FFRecord DC A4'0' DC I'0' FREQ DC I'428' DC I'$0100' DC I'$0000' DC A4'0' DC I'$00FF' LookUpName ANOP DC I1'0' ; sync DC I1'$10' ; command (LookUp) DC I'0' ; result code DC I4'0' ; completion routine DC I4'Name' ; entity name pointer DC I1'4' ; retry interval DC I1'4' ; retry count DS 2 ; reserved DC I'800' ; buffer length DC I4'Buffer' ; buffer pointer DC I1'20' ; max # of matches NumMatch DC I1'0' ; actual number of matches DC I1'0' ; leave this here Name DC I1'1',C'=' DC I1'08',C'WPGSMAIL',I1'1',C'*' Buffer DS 800 CursOn DC I1'5' CursOff DC I1'6' AltChar DC I1'15' StdChar DC I1'14' SendATPReq ANOP DC I1'0' ; sync DC I1'$12' ; SendATPReq DC I'0' ; result DC I4'0' ; completion routine DC I1'0' ; dynamic socket number Address DC I'0' ; destination network DC I1'0' ; destination node DC I1'0' ; destination socket DC I'0' ; ATP transaction ID DC I'100' ; request buffer length DC I4'SendBuf' ; request buffer pointer DC I4'0' ; user bytes DC I1'1' ; number of response buffers DC I4'BDS' ; response BDS pointer DC I1'$20' ; ATP flags DC I1'0' ; retry interval DC I1'0' ; retry count DC I1'1' ; current bit-map DC I1'0' ; number of responses received DC I6'0' ; reserved SendBuf DC I'0' SendBuff DS 100 BDS ANOP DC I'100' DC I4'BuffPtr' DC I4'0' DC I'0' BuffPtr DS 100 ; Text tools data PAGE1 EQU $C054 PAGE2 EQU $C055 COL80 EQU $C001 ; Control character codes KCON EQU 5 ; Cursor on KCOFF EQU 6 ; Cursor off KBELL EQU 7 ; Ring bell KBSPC EQU 8 ; Back space KLF EQU 10 ; Line feed KVT EQU 11 ; Clear to end of screen KFF EQU 12 ; Form feed KCR EQU 13 ; Carriage return KSO EQU 14 ; Standard characters KSI EQU 15 ; Alternate characters KMOUSEON EQU 20 ; Mouse characters on KMOUSEOFF EQU 21 ; Mouse characters off KINVERTON EQU 22 KINVERTOFF EQU 23 KHOME EQU 25 ; Home Cursor KESC EQU 27 ; Escape KEOL EQU 29 ; Clear to end of line KGOTO EQU 30 ; GotoXY CNTRLTBL ANOP DC A'0' ;0 DC A'0' ;1 DC A'0' ;2 DC A'0' ;3 DC A'0' ;4 DC A'0' ;5 Cursor on DC A'0' ;6 Cursor off DC A'0' ;7 Ring bell DC A'0' ;8 Back space DC A'0' ;9 DC A'0' ;10 Line feed DC A'0' ;11 Clear to end of screen DC A'0' ;12 Form feed DC A'CR-1' ;13 Carriage return DC A'SO-1' ;14 Standard characters DC A'SI-1' ;15 Alternate characters DC A'0' ;16 DC A'0' ;17 DC A'0' ;18 DC A'0' ;19 DC A'MOUSEON-1' ;20 Mouse text on DC A'MOUSEOFF-1' ;21 Mouse text off DC A'INVERTON-1' ;22 Invert on DC A'INVERTOFF-1' ;23 Invert off DC A'0' ;24 DC A'0' ;25 Home Cursor DC A'0' ;26 DC A'0' ;27 Escape DC A'0' ;28 DC A'CLEOL-1' ;29 Clear to end of line DC A'GTOXY-1' ;30 GotoXY BASETBL DC A'$400,$480,$500,$580,$600,$680,$700,$780' DC A'$428,$4A8,$528,$5A8,$628,$6A8,$728,$7A8' DC A'$450,$4D0,$550,$5D0,$650,$6D0,$750,$7D0' INVERTFLG DS 2 ; invert character MOUSEFLG DS 2 ; mouse characters on or off GOTOFLG DS 2 ; Goto flag (>0 if goto active) XMIN DS 2 ; left edge of window XMAX DS 2 ; right edge of window YMIN DS 2 ; to edge of window YMAX DS 2 ; bottom edge of window CH DS 2 ; current horizontal position CV DS 2 ; current vertical position CHMASK DS 2 ; character mask END COPY TEXT.TOOLS