10
20
30
40
50 OS_CLI=&FFF7:OSBYTE=&FFF4:OSWORD=&FFF1:OSWRCH=&FFEE
60 OSWRCR=&FFEC:OSNEWL=&FFE7:OSASCI=&FFE3:OSRDCH=&FFE0
70 OSFILE=&FFDD:OSARGS=&FFDA:OSBGET=&FFD7:OSBPUT=&FFD4
80 OSGBPB=&FFD1:OSFIND=&FFCE
90
100 load%=&FFFF0900
110 DIM mcode% &213
120 FOR P=0 TO 1
130 P%=load%:O%=mcode%
140 [OPT P*3+4
150 \ Control block, overlapping code
160 \ Read VDU info returns:
170 \ L0900-L0901 = Screen display start address
180 \ L0902-L0911 = 16 palette entries
190 \ L0912 = remote screen mode
200
210 .L0900
220 \ Control block for user lookup
230 EQUB 0:EQUB &14:EQUB 0:EQUB &18
240 :
250 .exec%
260 LDX #&A9:LDY #&00:LDA #&01:JSR OSARGS :\ Get command line address
270 LDA #&02:LDY #&00:JSR OSARGS :\ Get NET version
280 LDY #&00:CMP #&02:BNE L0926 :\ Bugfix not needed
290 \ Command line bugfix for NetFS<3.60
300 .L091A
310 INY:LDA (&A9),Y:CMP #&0D:BEQ L098B
320 CMP #&20:BNE L091A
330 :
340 \ Parse station number from command line
350 .L0925
360 INY
370 .L0926
380 LDA (&A9),Y
390 CMP #&20
400 BEQ L0925 :\ Skip spaces
410 BCC L098B
420 LDX #&00
430 STX &AD
440 CMP #&30:BCC L0966 :\ Not digit, look for user name
450 CMP #&3A:BCS L0966 :\ Not digit, look for user name
460 .L093A
470 LDX #&00
480 .L093C
490 LDA (&A9),Y
500 INY
510 CMP #&30
520 BCC L0956
530 AND #&0F
540 CLC
550 STX &A8
560 ASL &A8
570 ADC &A8
580 ASL &A8
590 ASL &A8
600 ADC &A8
610 TAX
620 JMP L093C
630
640 .L0956
650 STX L0AF1
660 CMP #&2E
670 BNE L098B
680 STX L0AF2
690 BEQ L093A
700 .L0962
710 INX
720 INY
730 LDA (&A9),Y
740 .L0966
750 STA L0907,X
760 CMP #&0D
770 BNE L0962
780 LDX #&00
790 LDY #&09
800 LDA #&14
810 JSR OSWORD
820 LDA #&00
830 STA L0900+17
840 CMP L0900+3
850 BNE L0900+2
860 LDY #&01
870 .L0982
880 LDA L0905,Y
890 STA L0AF1,Y
900 DEY
910 BPL L0982
920 :
930 \ L0AF2=net, L0AF1=stn
940 .L098B
950 LDA #&00:LDX #&FF:JSR OSBYTE
960 CPX #&03:ROR A:STA &AE :\ &AE bit 7=non-Master/Master
970 LDX #&DB:JSR L0AB3 :\ Ping the remote station
980 BEQ L09B1 :\ Present, skip forwards
990 .L099E
1000 BRK:EQUB &A2:EQUS "Inactive"
1010 .L09A8
1020 BRK:EQUB &A2:EQUS "PROTed":BRK
1030 .L09B1
1040 LDX L0900
1050 DEX
1060 BEQ L09C1
1070 DEC &AD
1080 CPX #&0E
1090 BCS L09FA
1100 CPX #&04
1110 BCC L09FA
1120 .L09C1
1130 LDX #&DC:JSR L0A98 :\ Read VDU information
1140 BNE L09A8 :\ Can't read, must be PROTed
1150 LDX #&E1:JSR L0A98 :\ Read...
1160 BNE L09A8 :\ Can't read, must be PROTed
1170 LDA L0900+1:STA L0AEA
1180 LDX #&E6:JSR L0A98 :\ Read...
1190 BNE L09A8 :\ Can't read, must be PROTed
1200 LDA #&87:JSR OSBYTE :\ Read current screen mode
1210 LDA L0900+18 :\ Remote station's screen mode
1220 AND #&07:CMP #&07:PHP
1230 CMP L0A02,Y:BCS L0A0C :\ If remote mode same or smaller than my mode, can switch to it
1240 BIT &AE:BMI L0A0A :\ If Master, shadow screen present, can use it
1250 STA &0E09 :\ Store in NFS workspace as MODE error number
1260 ORA #&30:STA L0A01 :\ Store in MODE? error message
1270 .L09FA
1280 BRK:EQUB &AD:EQUS "Mode "
1290 .L0A01:EQUS "?" :\ Mode number of remote station
1300 \ MODE comparison table, can change modes if same or smaller screen size
1310 .L0A02
1320 EQUB 0 :\ Also terminator of Mode? error message
1330 EQUB 0
1340 EQUB 0
1350 EQUB 3
1360 EQUB 4
1370 EQUB 4
1380 EQUB 6
1390 EQUB 7
1400 :
1410 .L0A0A
1420 ORA &AE :\ Add shadow screen bit if present
1430 .L0A0C
1440 TAX
1450 CPY L0912:BEQ L0A1B :\ If screen mode same, don't change
1460 LDA #&16:JSR OSWRCH :\ Change screen mode
1470 TXA:JSR OSWRCH
1480 :
1490 \ Set local palette to match remote palette
1500 .L0A1B
1510 LDX #&0F :\ Start at colour 15
1520 .L0A1D
1530 LDA #&13:JSR OSWRCH :\ VDU 19
1540 TXA:JSR OSWRCH :\ Logical colour
1550 LDA L0900+2,X :\ Get physical colour from remote VDU info
1560 LDY #&04 :\ Send it four times to fill VDU 19 command
1570 .L0A2B
1580 JSR OSWRCH:DEY:BNE L0A2B
1590 STY L0AF3
1600 DEX:BPL L0A1D :\ Loop for 16 palette entries
1610 :
1620 LDY #&0C:STY &FE00 :\ Select CRTC register 12 - start of screen
1630 LDA L0900+0:STA &0350 :\ CRTC address of top of screen
1640 LDA L0900+1:STA &0351
1650 PLP:BNE L0A51 :\ Skip if not MODE 7
1660 SBC #&74:EOR #&20:BCS L0A5A :\ Correction for MODE 7
1670 .L0A51
1680 LDX #&03
1690 .L0A53
1700 LSR A:ROR L0900:DEX:BNE L0A53 :\ Correction for MODE <7
1710
1720 .L0A5A
1730 STA &FE01 :\ Write CRTC start of screen high byte
1740 INY:STY &FE00 :\ Select CRTC start of screen low byte
1750 LDA L0900:STA &FE01 :\ Write address low byte
1760
1770 BIT &AE:BPL L0A71 :\ No shadow screen
1780 DEC L0AF5
1790 DEC L0AF9
1800 .L0A71
1810 BIT &AD
1820 BPL L0A78
1830 DEC L0AFD
1840 .L0A78
1850 LDA L0900+20
1860 STA L0AF4
1870 STA L0AEF
1880 CLC
1890 BMI L0A93
1900 ADC #&04
1910 STA L0900+20
1920 STA L0AED
1930 LDX #&EB
1940 JSR L0A98
1950 BEQ L0A78
1960 .L0A93
1970 LDA #&0D
1980 JSR OSWRCH
1990 .L0A98
2000 STX &A9
2010 LDY #&04
2020 LDA (&A9),Y
2030 STA L0AF8,Y
2040 DEY
2050 LDA (&A9),Y
2060 STA L0AF8,Y
2070 DEY
2080 LDA (&A9),Y
2090 STA L0AF6,Y
2100 DEY
2110 LDA (&A9),Y
2120 STA L0AF6,Y
2130 :
2140 .L0AB3
2150 STX &A9
2160 LDX #&0A
2170 STX &AA
2180 STX &A8
2190 .L0ABB
2200 LDY #&00
2210 INC &A8
2220 BMI L0ADA
2230 LDA (&A9),Y
2240 STA L0AEF
2250 LDA #&10
2260 LDX #&EF
2270 LDY #&0A
2280 JSR OSWORD
2290 .L0ACF
2300 LDA #&32
2310 JSR OSBYTE
2320 TXA
2330 BMI L0ACF
2340 ASL A
2350 BMI L0ABB
2360 .L0ADA
2370 RTS
2380
2390 DEY
2400 STA &02
2410 ORA #&02
2420 BRK
2430 STA (&02,X)
2440 ORA #&9E
2450 BRK
2460 STA (&1E,X)
2470 ORA #&E9
2480 .L0AEA
2490 BRK
2500 STA (&00,X)
2510 .L0AED
2520 BRA L0AEF
2530
2540 .L0AEF
2550 DEY
2560 BRK
2570 .L0AF1
2580 BRK
2590 .L0AF2
2600 BRK
2610 .L0AF3
2620 BRK
2630 .L0AF4
2640 ORA #&FF
2650 .L0AF6
2660 EQUB &FF
2670 TSB &09
2680 .L0AF9
2690 EQUB &FF
2700 EQUB &FF
2710 BRK
2720 ORA #&FF
2730 EQUB &FF
2740 JMP (&2B65)
2750
2760 ]NEXT
2770 PRINT "*SAVE VIEW ";~mcode%;" ";~O%;" ";~exec%;" ";~load%