10 REM > Stations/s v1.22
   20 REM Source for updated *Stations command
   30 REM Updated with more station types
   40 :
   50 OSBYTE=&FFF4:OSWORD=&FFF1:OSWRCH=&FFEE
   60 OSNEWL=&FFE7:OSASCI=&FFE3:OSARGS=&FFDA
   70 DEFFNm(A$)=LEFT$(A$,LENA$-1)+CHR$(ASCRIGHT$(A$,1)OR128)
   80 :
   90 load%=&FFFF08D5
  100 DIM mcode% &280
  110 FOR P=0 TO 1
  120   P%=load%:O%=mcode%
  130   [OPT P*3+4
  140   \ Transmit control block
  150   .L0AE5
  160   EQUB &00                :\ Control byte
  170   EQUB &00                :\ Port &00=Immediate
  180   .L0AE7
  190   EQUB &FE                :\ Station
  200   .L0AE8
  210   EQUB &00                :\ Network
  220   EQUW L0900+0:EQUW &FFFF :\ Data start address
  230   EQUW L0900+4:EQUW &FFFF :\ Data end address
  240   :
  250   .exec%
  260   .L0900
  270   LDX #&A8
  280   LDY #&00:LDA #&01:JSR OSARGS :\ Get command line
  290   LDX #&00                     :\ Prepare to do net 0=this net
  300   :
  310   .L0926
  320   LDA (&A8),Y                  :\ Get current character
  330   CMP #ASC"0":BCC L093F:INY    :\ <"0", do this net
  340   AND #&0F:STX &AA:ASL &AA     :\ X=X*10+digit
  350   ADC &AA:ASL &AA:ASL &AA
  360   ADC &AA:TAX:JMP L0926        :\ Jump to check next digit
  370   :
  380   \ Scan the network X
  390   .L093F
  400   STX L0AE8                    :\ Store network number
  410   LDX #&00:JSR L0A20           :\ Print banner
  420   :
  430   \ Ping remote machine
  440   .L0947
  450   LDA #&22:STA &AC             :\ Set column counter to 34
  460   .L094B
  470   LDA #&88:STA L0AE5           :\ Control='MachinePeek'
  480   LDA #&10
  490   LDX #L0AE5 AND 255
  500   LDY #L0AE5 DIV 256
  510   JSR OSWORD                   :\ Transmit MachinePeek
  520   LDA L0AE5:BEQ L094B          :\ Loop until Tx sucessful
  530   .L095E
  540   LDA #&32:JSR OSBYTE          :\ Poll Tx
  550   TXA:BMI L095E                :\ Loop until finished
  560   ROL A:BMI L0988              :\ If TxError, skip to next
  570   :
  580   LDX #&02:JSR L0ADC           :\ Print two spaces
  590   LDA L0AE7:JSR L098E          :\ Print station number
  600   LDX #&04:JSR L0ADC           :\ Print four spaces
  610   JSR L09C0:JSR L09C4          :\ Print machine name, version
  620   JSR OSNEWL                   :\ Print newline
  630   :
  640   .L0988
  650   DEC L0AE7:BNE L0947          :\ Dec station and loop until all done
  660   RTS
  670   :
  680   \ Print decimal number in A
  690   .L098E
  700   TAY
  710   LDA #&64:JSR L099B           :\ Print 100s
  720   LDA #&0A:JSR L099B           :\ Print 10s
  730   LDA #&01                     :\ Print 1s
  740   .L099B
  750   STA &AE:LDX #&FF:SEC:TYA
  760   .L09A1
  770   INX:SBC &AE:BCS L09A1
  780   ADC &AE:TAY:TXA
  790   .L09AA
  800   AND #&0F:SED:CLC
  810   ADC #&90:ADC #&40:CLD
  820   .L09B3
  830   DEC &AC:JMP OSASCI           :\ Dec column counter and print character
  840   :
  850   \ Print 'X' spaces
  860   .L0ADC
  870   LDA #ASC" "
  880   .L0ADE
  890   JSR L09B3:DEX:BNE L0ADE
  900   .L0AE0
  910   RTS
  920   :
  930   \ Print version number
  940   .L09C4
  950   LDX &AC:BEQ P%+5:JSR L0ADC   :\ Print spaces to align
  960   LDA L0900+3:JSR L09BA        :\ Print version.hi in hex
  970   LDA #&2E:JSR L09B3           :\ Print '.'
  980   LDA L0900+2                  :\ Print version.lo in hex
  990   :
 1000   \ Print hex number in A
 1010   .L09B8
 1020   PHA:JSR L09BC:PLA:JMP L09AA
 1030   .L09BA
 1040   CMP #&10:BCC L09BE
 1050   .L09BC
 1060   LSR A:LSR A:LSR A:LSR A
 1070   .L09BE
 1080   JMP L09AA
 1090   :
 1100   \ Print machine name
 1110   .L09C0
 1120   LDA L0900+0                  :\ A=machine
 1130   CLC:ADC #&40:BMI L09F8       :\ Don't print manufacturers
 1140   LDA L0900+1                  :\ A=manufacturer
 1150   LDX #L0A50-L0A30             :\ X=>start of manufacturers
 1160   JSR L09FE                    :\ Find and print name
 1170   LDA &AC:BEQ L0AE0            :\ Exit if unknown
 1180   :
 1190   .L09F8
 1200   LDA L0900+0:LDX #L0A60-L0A30 :\ X=>start of machine names
 1210   .L09FE
 1220   CMP L0A30,X:BEQ L0A20        :\ Matches, print this entry
 1230   PHA
 1240   LDA L0A30,X:BEQ L0A10        :\ End of table, print 'Uknown'
 1250   .L0A04
 1260   INX:LDA L0A30,X:BPL L0A04    :\ Step past this entry
 1270   PLA:INX:BNE L09FE
 1280   .L0A10
 1290   PLA
 1300   LDX #L0A40-L0A30:JSR L0A20   :\ Print 'Unknown'
 1310   LDA L0900+1:JSR L09B8        :\ Print manufacture code
 1320   LDA L0900+0:JSR L09B8        :\ Print machine code
 1330   LDA #ASC")":JSR L09B3        :\ Print closing ')'
 1340   LDX &AC:BNE L0ADC
 1350   :
 1360   \ Print message indexed by X
 1370   \ --------------------------
 1380   .L0A20
 1390   INX:LDA L0A30,X:PHP          :\ Get character, save bit 7
 1400   AND #&7F:JSR L09B3           :\ Drop bit 7, print character
 1410   PLP:BPL L0A20                :\ Loop until bit 7 set
 1420   .L0A28
 1430   RTS
 1440   :
 1450   .L0A30
 1460   EQUB &00:EQUS FNm("Station  Type"+CHR$13)
 1470   .L0A40
 1480   EQUB &80:EQUS FNm("Unknown (")
 1490   .L0A50
 1500   EQUB &FF:EQUS FNm("SJ Research ")
 1510   EQUB &02:EQUS FNm("Reuters ")
 1520   EQUB &01:EQUS FNm("Torch ")
 1530   EQUB &00:EQUS FNm("Acorn ")
 1540   .L0A60
 1550   EQUB &01:EQUS FNm("BBC Micro")
 1560   EQUB &02:EQUS FNm("Atom")
 1570   EQUB &03:EQUS FNm("System 3/4")
 1580   EQUB &04:EQUS FNm("System 5")
 1590   EQUB &05:EQUS FNm("Master")
 1600   EQUB &06:EQUS FNm("Electron")
 1610   EQUB &07:EQUS FNm("RISC OS")
 1620   EQUB &09:EQUS FNm("Communicator")
 1630   EQUB &0A:EQUS FNm("Master ET")
 1640   EQUB &0B:EQUS FNm("FileStore")
 1650   EQUB &0C:EQUS FNm("Compact")
 1660   EQUB &0D:EQUS FNm("Ecolink")
 1670   EQUB &0E:EQUS FNm("RISCiX")
 1680   EQUB &0F:EQUS FNm("RISC PC")
 1690   EQUB &10:EQUS FNm("Iyonix")
 1700   EQUB &11:EQUS FNm("A9")
 1710   EQUB &40:EQUS FNm("ZX Spectrum")
 1720   EQUB &41:EQUS FNm("Amstrad CPC")
 1730   \EQUB &F8:\EQUS FNm("GP Server")
 1740   \EQUB &F9:\EQUS FNm("80386 Unix")
 1750   \EQUB &FA:\EQUS FNm("SCSI")
 1760   \EQUB &FB:\EQUS FNm("PC card")
 1770   EQUB &FC:EQUS FNm("Nascom 2")
 1780   EQUB &FD:EQUS FNm("RM480Z")
 1790   EQUB &FE:EQUS FNm("File Server")
 1800   EQUB &FF:EQUS FNm("Z80 CP/M")
 1810   EQUB &00
 1820   .L0B00
 1830   :
 1840 ]NEXT
 1850 PRINT"Machine names table length: ";L0B00-L0A30;
 1860 IF L0B00-L0A30>256:PRINT" - too long":END ELSE PRINT
 1870 PRINT "*SAVE STATIONS ";~mcode%;" ";~O%;" ";~exec%OR&FFFF0000;" ";~load%