10PutV = &22A 20GetV = &22C 30Oput = &80 40Oget = &82 50putptr = &84 60getptr = &86 70Top = &88 80Bot = &8A 90S_sent = &8C 100Buffer_count_lo = &8D:Buffer_count_hi = &8E 120State_flag = &8F 140XOFFtrigger_lo = &20:XOFFtrigger_hi = &0A 150XONtrigger_lo = &00:XONtrigger_hi=0 160true=1 170false=0 190 oswrch = &FFEE 200 OSASCI = &FFE3 210 osbyte = &FFF4 220 OSWORD = &FFF1 230 TEMP = &0070 240 Sym = TEMP 250 Matrix = &3B00 260 TEMP1 = &0071 270 PROTECT = &0072 280 290 DEST = &0073 300 DEST1 = &0074 310 CX = &0075 320 CY = &0076 330 TX = &0077 340 TY = &0078 350 360page = &79 370page1 = &7A 380Ytab = &7B 390Ytab1 = &7C 400Cell = &7D 410Cell1 = &7E 420BaseY = &7F 430Com_len = &00 440Star_buff=&400 441Q_needed=&4FF 460 transparent = 1 470 printing = 2 480 490 COMLEN = 8 500 510 REM Len ("TERMINAL") 520 530 B% = &8000 550 570 C% = &C000 590 600 FOR Z = 4 TO 7 STEP 3 610 P%=B% 620 O%=C% 630[ OPT Z 640 660 670JMP LANGJP 680JMP SERVJP 690EQUB &C2 700EQUB &25 710EQUB &00 720EQUS "ELBIT Terminal Emulator" 730EQUB &00 740 EQUS "3.01" 750.COPYR EQUB &00 760EQUS "(C) 1983 Acorn" 770EQUB &00 771\ 772\Brk handler 773.Brkhand 774Lda #31:JSR oswrch:Lda #1:JSR oswrch:LDA #24:JSR oswrch 776Ldy #0 777.ErrLoop Iny 778Lda (&FD),Y:Beq ErrEnd 779Ora #&80:Jsr oswrch 780Jmp ErrLoop 781.ErrEnd 782JSR VSTRING:EQUS " ":EQUB 30:NOP 783JSR REPLACE 784Lda #0:Sta State_flag 785Sta Q_needed 789JMP LOOP 800 810.LANGJP 811Lda #Brkhand MOD 256: Sta &202 812Lda #Brkhand DIV 256: Sta &203 813Cli 820LDA #&E5 830LDX #&1 840LDY #&0 850JSR osbyte 860LDA #&02 870TAX 880LDY #0 890JSR osbyte 900LDA #181 910LDX #1 920LDY #0 930 STY BaseY 940 JSR osbyte \ RS 8 bit 960 lda #15:ldx #0:ldy #0: jsr osbyte \ *fx 15,0 - flush buffers 980 LDA #11 990 LDX #190 1000 JSR osbyte \ AUTO REP DELAY 1010 LDA #144 1020 LDX #0 1030 LDY #1 1040 JSR osbyte \ *TV 0,1 1050LDA #22 1060JSR oswrch 1070LDA #3 1080JSR oswrch \ Mode 3 1090JSR VSTRING 1100EQUB 31 1110 EQUB 44 \ Send to spare report line 1120 EQUB 24 1130 EQUS "Acorn ELBIT Terminal Emulator 3.01" 1140 EQUB 30 1150 NOP 1160 LDA #&00 1170 Sta State_flag \ No printing 1180 STA PROTECT \ Initialise PROTECT OFF 1190 STA CX 1200 STA CY 1210 LDX #7 1220 LDA #7 1230 JSR osbyte \ *FX 7,7 9600 Rx 1240 LDX #7 1250 LDA #8 1260 JSR osbyte \ *FX 8,7 9600 Tx 1270 LDA #20:LDX #6:LDY #0: JSR osbyte 1280 JSR INVER 1450 1460.LOOP LDA #&91 1470 LDX #&01 1480 LDY #&00 1490 JSR osbyte \*FX145,1 Get char from 423 i/p buffer 1500 1510\ Select Input (423) assumed 1520\ A = Inkey (0) 1530 1540 BCS KEYBOARD \C=1 => Buffer empty 1550\ if Success then ... 1560 TYA 1570 AND #&7F 1580 JSR GTOVDU 1590\ ... ToVDU (A) 1600.KEYBOARD 1601 JSR poll 1602 JMP LOOP 1603.poll 1609 LDA #&91 1610 LDX #&00 1620 LDY #&00 1630 JSR osbyte \*FX 145,0 Get char from keyboard buffer 1650\ A = Inkey (0) 1660 BCS pdone \C=1 => Buffer empty 1670\ if Success then ... 1671.sneak 1680 TYA 1690 PHA 1700 LDA #3 1710 LDX #3 1720 LDY #0 1730 JSR osbyte \*FX3,3 Select printer & 423 1740\ ... Select Output (423) 1750 PLA 1760 JSR GTO432 1770\ ... To423 (A) 1780 LDA #&03 1790 LDX #&00 1800 LDY #&00 1810 JSR osbyte \*FX3,0 Re-select VDU 1811RTS 1812.pdone 1820\ ... Select Output (VDU) 1821\? RS423 output assumed? 1822Lda Q_needed 1823Cmp #true 1824Bne qdone 1825Ldy #ASC("Q") AND 31 1827Lda #false:Sta S_sent:Sta Q_needed 1828JMP sneak 1829.qdone 1839RTS 1840\ >> forever 1850.SERVJP CMP #&04 \Offer command line 1870 BNE RET 1880 TYA \Save regs 1890 PHA 1900 TXA 1910 PHA 1920 LDX #COMLEN \Load counter 1930.CHKCOM LDA (&F2),Y \Pointer to command line 1940 CMP COMMAND-1,X 1950 BNE BADCOMM \Command not recognised 1960 INY 1970 DEX 1980 BNE CHKCOM 1990.DUMBGO JSR initBF 2000 PLA 2010 TAX \Get rom no. in X 2020 LDA #&8E 2030 JSR osbyte \Jump to language 2040.BADCOMM CMP #ASC"." \Check for abbreviation 2050 BEQ DUMBGO 2060 PLA 2070 TAX 2080 PLA 2090 TAY 2100 LDA #&04 \Pass command on 2110.RET RTS 2120.VSTRING PLA 2130 STA TEMP 2140 PLA 2150 STA TEMP+1 2160 LDY #&00 2170 BEQ VLOOP 2180.VGO JSR OSASCI 2190.VLOOP INC TEMP 2200 BNE VGON 2210 INC TEMP+1 2220.VGON LDA (TEMP),Y 2230 BPL VGO 2240 JMP (TEMP) 2241.invstring PLA:Sta TEMP:PLA: Sta TEMP+1 2242Ldy #0:Beq vloop 2243.vgo ORA #&80:JSR OSASCI 2244.vloop INC TEMP 2245BNE vgon 2246INC TEMP+1 2247.vgon LDA (TEMP),Y 2248BPL vgo 2249JMP (TEMP) 2250.COMMAND EQUS "LANIMRET" 2260.GoToPrinter 2261PLA:PHA 2290 Cmp #ASC("P") AND 31 2300 Bne Ordinary 2310 JSR CONTROL \ Check for END-PRINT command 2311 PLA:RTS 2320.Ordinary 2330 Lda State_flag 2340 And #transparent \ means no screen update if set. 2350 Bne To_printer 2370\ To screen also......... 2380 Pla 2390\ Jsr ToElbit \ Will not be a DLE because this was 2391JSR oswrch 2400 \ filtered out above 2401RTS 2410.To_printer 2420 Lda #1 2430 Jsr oswrch 2440 Pla 2450 Jsr oswrch 2460.done 2470 Rts 2480.GTOVDU 2481PHA 2490 LdA State_flag 2500And #printing 2510 Bne GoToPrinter 2511PLA 2520.ToElbit 2530 CMP #ASC(" ") \ Control char? 2540 BCC CONTROL 2550 CMP #&7F \ Non printing? 2560 BEQ VDDONE 2570 STA TEMP 2580 LDA CX 2590 STA DEST 2600 LDA CY 2610 STA DEST1 2620 JSR SETCELL 2630 LDA PROTECT 2640 BNE nocheck 2650\ Load A from PageMap (CX,CY) 2660 LDY #0 2670 LDA (Cell),Y 2680 BPL nocheck 2690 JMP RIGHT 2700.nocheck LDA TEMP 2710 ORA PROTECT \ *** protected fields no longer underlined... 2720 PHA 2730 AND #127 \********************************** 2740 JSR oswrch 2750\ Store A at PageMap (CX,CY) 2760 LDY #0 2770 PLA 2780 STA (Cell),Y 2790 JMP ANYCHAR \ And increment pointers 2800.VDDONE RTS 2810.SETCELL LDA DEST1:JSR Wrap24 2820 ASLA:TAX 2830 LDA Xtab,X 2840 STA Cell 2850 LDA Xtab+1,X 2860 STA Cell1 2870 LDA Cell 2880 CLC 2890 ADC DEST 2900 BCC L2 2910 INC Cell1 2920.L2 STA Cell 2930 RTS 2940\[[[[[[[[[[[ TERMINAL HANDLER CODE .. ]]]]]]]]]]] 2950.CONTROL \ Handle all control chars 2960 PHA 2970 ASL A 2980 TAX 2990 LDA ACTIONS,X 3000 STA DEST 3010 LDA ACTIONS+1,X 3020 STA DEST+1 3030 PLA 3040 JMP (DEST) 3050.GTO432 TAX 3060 LDA CONVERT,X 3070 JSR oswrch 3080 RTS 3090.STARTPROTECT 3100 LDA #&80 \ True 3110 STA PROTECT 3120 RTS 3130.ENDPROTECT 3140 LDA #&00 \ False 3150 STA PROTECT 3160 RTS 3170.CLRSCR 3260 LDA #0 3270 STA CX 3280 STA CY 3290.CLREOS LDA CX 3300 STA TX 3310 LDA CY 3320 STA TY 3330 JSR coff 3340\ repeat << 3350\ CLEAN (TX, TY) 3360\ TX = 0; TY = TY+1 3370\ until TY = 24 3380.CLloop 3390 JSR CLEAN 3400 LDA #0 3410 STA TX 3420 INC TY 3430 LDA TY 3440 CMP #24 3450 BNE CLloop 3460 JSR con 3470 JMP REPLACE 3480.CLREOL 3490 JSR coff 3500 LDA CX 3510 STA TX 3520 LDA CY 3530 STA TY 3540JSR CLEAN 3550 JSR con 3560 RTS 3570.CLEAN \ Common entry point - Clears from TX, TY to RHS 3580\ repeat << 3590\ MoveTo (X,Y) 3600\ VDU 32 3610\ X = X + 1 3620\ >> until X = 80 3630 LDA #31 3640 JSR oswrch 3650 LDA TX 3660 JSR oswrch 3670 LDA TY 3680 JSR oswrch 3690.CNloop LDA TX 3700STA DEST 3710LDA TY 3720STA DEST+1 3730JSR SETCELL 3740LDA PROTECT 3750 BNE nocheck2 3760\ Load A from PageMap(TX,TY) 3770 LDY #0 3780 LDA (Cell),Y 3790 BPL nocheck2 3800 LDA #9 3810 JSR oswrch 3820 JMP out 3830.nocheck2 3840 LDA #32 3850 JSR oswrch 3860\ Store A in PageMap (TX,TY) 3870 LDY #0 3880 STA (Cell),Y 3890.out 3900 INC TX 3910 LDA TX 3920 CMP #80 3930 BNE CNloop 3940 \ from CX, CY inclusive 3950 JMP REPLACE \ and replace the cursor 3960.ADDRESSFIELD 3970 \ Move to X,Y 3980.againagain 3990 LDA #&91:LDX #1:LDY #0 4000 JSR osbyte 4010 BCS againagain:TYA:AND #&7F 4020 CMP #&C 4030 BCC OK: CMP #&10 :BCC REPLACE 4040 SBC #(&10-&0B-1) \ Carry set 4050 CMP #&1C-(&10-&0B-1) 4060 BCS REPLACE 4070.OK STA TY 4080.again LDA #&91:LDX #1:LDY #0 4090 JSR osbyte:BCS again:TYA:AND #&7F 4100 CMP #80:BCS REPLACE 4110 STA TX 4120 LDA TX:STA CX:LDA TY:STA CY 4130 \ Convert TX, TY to CX, CY 4140 \ and move there 4150.REPLACE 4160 LDA #31 \ Set cursor command 4170 JSR oswrch 4180 LDA CX 4190 JSR oswrch 4200 LDA CY 4210 JSR oswrch 4220 RTS 4230.BELL JSR oswrch 4240 RTS 4250.LEFT LDA CX 4260 CMP CY 4270 BNE CantBe 4280 CMP #0 4290 BNE CantBe 4300 LDA #79 4310 STA CX 4320 LDA #23 4330 STA CY 4340 JMP REPLACE 4350.CantBe 4360 LDA CX 4370 BEQ ScrollUp 4380 DEC CX 4390 LDA #8: JSR oswrch 4400 RTS 4410.ScrollUp LDA #79 4420 STA CX 4430 DEC CY 4440 JMP REPLACE \ or RTS 4450.DOWN JSR oswrch 4460 JMP ScrollDown 4470.HOMEUP LDA #0 4480 STA CX 4490 STA CY 4500 JMP REPLACE 4510.RETN LDA #0 4520 STA CX 4530 JMP REPLACE 4540.RIGHT LDA #9 \ Tab character on BBC machine 4550 JSR oswrch 4560.ANYCHAR INC CX: LDA CX 4570 CMP #80 4580 BNE RET2 \ Assumes cursor already moved. 4590 LDA #0 4600 STA CX 4610.ScrollDown 4620 LDA CY: CMP #23 4630 BEQ Bottom 4640 INC CY 4650 JMP REPLACE \ or RTS 4660.Bottom LDA #10 \ Force scroll 4670 JSR oswrch 4680 LDA #11 \ and return cursor 4690 JSR oswrch 4700 LDA #1 4710 JSR Wrap24 4720 STA BaseY 4730 JSR WipeLast 4740.RET2 RTS 4750.UP LDA CY: BEQ NoScroll: LDA #11 \ Cursor up 4760 JSR oswrch 4770 LDA CY 4780 BNE Updone 4790 LDA #23 4800 STA CY 4810 JMP REPLACE 4820.NoScroll LDA #23: STA CY 4830 JMP REPLACE 4840.Updone DEC CY \ Special handling for scroll/wrap on = 0 4850 RTS 4860.IGNORE RTS 4870.ACTIONS EQUW IGNORE \ 00 4880EQUW IGNORE \ 01 4890EQUW IGNORE \ 02 4900EQUW IGNORE \ 03 4910EQUW IGNORE \ 04 4920EQUW IGNORE \ 05 4930EQUW IGNORE \ 06 4940EQUW BELL \ 07 4950EQUW LEFT \ 08 4960EQUW IGNORE \ 09 4970 EQUW DOWN \ 0A 4980 EQUW IGNORE \ 0B 4990EQUW HOMEUP \ 0C 5000 EQUW RETN \ 0D 5010 EQUW STARTPROTECT \ 0E 5020 EQUW IGNORE \ 0F 5030 EQUW ESCAPE \ 10 DLE 5040 EQUW IGNORE \ 11 5050 EQUW IGNORE \ 12 5060 EQUW IGNORE \ 13 5070 EQUW CLREOS \ 14 5080 EQUW RIGHT \ 15 5090 EQUW CLREOL \ 16 5100 EQUW ENDPROTECT \ 17 5110 EQUW CLRSCR \ 18 5120 EQUW IGNORE \ 19 5130 EQUW UP \ 1A 5140 EQUW ADDRESSFIELD \ 1B 5150 EQUW IGNORE \ 1C 5160 EQUW IGNORE \ 1D 5170 EQUW IGNORE \ 1E 5180 EQUW IGNORE \ 1F 5190.CONVERT 5200 EQUB &0 \ 0 5210 EQUB &1 \ 1 5220 EQUB &2 \ 2 5230 EQUB &3 \ 3 5240 EQUB &4 \ 4 5250 EQUB &5 \ 5 5260 EQUB &6 \ 6 5270 EQUB &7 \ 7 5280 EQUB &8 \ 8 5290 EQUB &9 \ 9 5300 EQUB &A \ A 5310 EQUB &B \ B 5320 EQUB &C \ C 5330 EQUB &D \ D 5340 EQUB &E \ E 5350 EQUB &F \ F 5360 EQUB &10 \ 10 5370 EQUB &11 \ 11 5380 EQUB &12 \ 12 5390 EQUB &13 \ 13 5400 EQUB &14 \ 14 5410 EQUB &15 \ 15 5420 EQUB &16 \ 16 5430 EQUB &17 \ 17 5440 EQUB &18 \ 18 5450 EQUB &19 \ 19 5460 EQUB &1A \ 1A 5470 EQUB &1B \ 1B 5480 EQUB &1C \ 1C 5490 EQUB &1D \ 1D 5500 EQUB &1E \ 1E 5510 EQUB &1F \ 1F 5520 EQUB &20 \ 20 5530 EQUB &21 \ 21 5540 EQUB &22 \ 22 5550 EQUB &23 \ 23 5560 EQUB &24 \ 24 5570 EQUB &25 \ 25 5580 EQUB &26 \ 26 5590 EQUB &27 \ 27 5600 EQUB &28 \ 28 5610 EQUB &29 \ 29 5620 EQUB &2A \ 2A 5630 EQUB &2B \ 2B 5640 EQUB &2C \ 2C 5650 EQUB &2D \ 2D 5660 EQUB &2E \ 2E 5670 EQUB &2F \ 2F 5680 EQUB &30 \ 30 5690 EQUB &31 \ 31 5700 EQUB &32 \ 32 5710 EQUB &33 \ 33 5720 EQUB &34 \ 34 5730 EQUB &35 \ 35 5740 EQUB &36 \ 36 5750 EQUB &37 \ 37 5760 EQUB &38 \ 38 5770 EQUB &39 \ 39 5780 EQUB &3A \ 3A 5790 EQUB &3B \ 3B 5800 EQUB &3C \ 3C 5810 EQUB &3D \ 3D 5820 EQUB &3E \ 3E 5830 EQUB &3F \ 3F 5840 EQUB &40 \ 40 5850 EQUB &41 \ 41 5860 EQUB &42 \ 42 5870 EQUB &43 \ 43 5880 EQUB &44 \ 44 5890 EQUB &45 \ 45 5900 EQUB &46 \ 46 5910 EQUB &47 \ 47 5920 EQUB &48 \ 48 5930 EQUB &49 \ 49 5940 EQUB &4A \ 4A 5950 EQUB &4B \ 4B 5960 EQUB &4C \ 4C 5970 EQUB &4D \ 4D 5980 EQUB &4E \ 4E 5990 EQUB &4F \ 4F 6000 EQUB &50 \ 50 6010 EQUB &51 \ 51 6020 EQUB &52 \ 52 6030 EQUB &53 \ 53 6040 EQUB &54 \ 54 6050 EQUB &55 \ 55 6060 EQUB &56 \ 56 6070 EQUB &57 \ 57 6080 EQUB &58 \ 58 6090 EQUB &59 \ 59 6100 EQUB &5A \ 5A 6110 EQUB &5B \ 5B 6120 EQUB &5C \ 5C 6130 EQUB &5D \ 5D 6140 EQUB &5E \ 5E 6150 EQUB &5F \ 5F 6160 EQUB &60 \ 60 6170 EQUB &61 \ 61 6180 EQUB &62 \ 62 6190 EQUB &63 \ 63 6200 EQUB &64 \ 64 6210 EQUB &65 \ 65 6220 EQUB &66 \ 66 6230 EQUB &67 \ 67 6240 EQUB &68 \ 68 6250 EQUB &69 \ 69 6260 EQUB &6A \ 6A 6270 EQUB &6B \ 6B 6280 EQUB &6C \ 6C 6290 EQUB &6D \ 6D 6300 EQUB &6E \ 6E 6310 EQUB &6F \ 6F 6320 EQUB &70 \ 70 6330 EQUB &71 \ 71 6340 EQUB &72 \ 72 6350 EQUB &73 \ 73 6360 EQUB &74 \ 74 6370 EQUB &75 \ 75 6380 EQUB &76 \ 76 6390 EQUB &77 \ 77 6400 EQUB &78 \ 78 6410 EQUB &79 \ 79 6420 EQUB &7A \ 7A 6430 EQUB &7B \ 7B 6440 EQUB &7C \ 7C 6450 EQUB &7D \ 7D 6460 EQUB &7E \ 7E 6470 EQUB &7F \ 7F Delete 6480\ <<<<<<<<<<< Normal Fn keys >>>>>>>>>>>> 6490 EQUB &80 \ 80 6500 EQUB &1E \ 81 F1 6510 EQUB &14 \ 82 F2 6520 EQUB &16 \ 83 F3 6530 EQUB &0C \ 84 F4 6540 EQUB &0F \ 85 F5 6550 EQUB &0E \ 86 F6 6560 EQUB &00 \ 87 F7 6570 EQUB &04 \ 88 F8 6580 EQUB &06 \ 89 F9 6590 EQUB &8A \ 8A 6600 EQUB &8B \ 8B 6610 EQUB &08 \ 8C Left 6620 EQUB &15 \ 8D Right 6630 EQUB &0A \ 8E Down 6640 EQUB &1A \ 8F Up 6650\ <<<<<<<<<<<<< Shift Fn keys >>>>>>>>>>>>>>> 6660 EQUB &90 \ 90 6670 EQUB &91 \ 91 6680 EQUB &92 \ 92 6690 EQUB &18 \ 93 Shift F3 6700 EQUB &94 \ 94 6710 EQUB &95 \ 95 6720 EQUB &96 \ 96 6730 EQUB &19 \ 97 Shift F7 6740 EQUB &98 \ 98 6750 EQUB &99 \ 99 6760 EQUB &9A \ 9A 6770 EQUB &9B \ 9B 6780 EQUB &12 \ 9C Shift left 6790 EQUB &01 \ 9D Shift right 6800 EQUB &1F \ 9E Shift down 6810 EQUB &1D \ 9F Shift up 6820\ <<<<<<<<<<< Control Fn keys >>>>>>>> 6830 EQUB &A0 \ A0 6840 EQUB &02 \ A1 Cont F1 6850 EQUB &10 \ A2 Cont F2 6860 EQUB &A3 \ A3 6870 EQUB &11 \ A4 Cont F4 6880 EQUB &A5 \ A5 6890 EQUB &A6 \ A6 6900 EQUB &1C \ A7 Cont F7 6910 EQUB &A8 \ A8 6920 EQUB &13 \ A9 Cont F9 6930 EQUB &AA \ AA 6940 EQUB &AB \ AB 6950 EQUB &AC \ AC 6960 EQUB &AD \ AD 6970 EQUB &AE \ AE 6980 EQUB &AF \ AF 6990\ <<<<<<<<<<<<< Control+Shift Fn keys >>>>>>>>>> 7000 EQUB &B0 \ B0 7010 EQUB &B1 \ B1 7020 EQUB &B2 \ B2 7030 EQUB &B3 \ B3 7040 EQUB &B4 \ B4 7050 EQUB &B5 \ B5 7060 EQUB &B6 \ B6 7070 EQUB &B7 \ B7 7080 EQUB &B8 \ B8 7090 EQUB &B9 \ B9 7100 EQUB &BA \ BA 7110 EQUB &BB \ BB 7120 EQUB &BC \ BC 7130 EQUB &BD \ BD 7140 EQUB &BE \ BE 7150 EQUB &BF \ BF 7160 EQUB &C0 \ C0 7170 EQUB &C1 \ C1 7180 EQUB &C2 \ C2 7190 EQUB &C3 \ C3 7200 EQUB &C4 \ C4 7210 EQUB &C5 \ C5 7220 EQUB &C6 \ C6 7230 EQUB &C7 \ C7 7240 EQUB &C8 \ C8 7250 EQUB &C9 \ C9 7260 EQUB &CA \ CA 7270 EQUB &CB \ CB 7280 EQUB &CC \ CC 7290 EQUB &CD \ CD 7300 EQUB &CE \ CE 7310 EQUB &CF \ CF 7320 EQUB &D0 \ D0 7330 EQUB &D1 \ D1 7340 EQUB &D2 \ D2 7350 EQUB &D3 \ D3 7360 EQUB &D4 \ D4 7370 EQUB &D5 \ D5 7380 EQUB &D6 \ D6 7390 EQUB &D7 \ D7 7400 EQUB &D8 \ D8 7410 EQUB &D9 \ D9 7420 EQUB &DA \ DA 7430 EQUB &DB \ DB 7440 EQUB &DC \ DC 7450 EQUB &DD \ DD 7460 EQUB &DE \ DE 7470 EQUB &DF \ DF 7480 EQUB &E0 \ E0 7490 EQUB &E1 \ E1 7500 EQUB &E2 \ E2 7510 EQUB &E3 \ E3 7520 EQUB &E4 \ E4 7530 EQUB &E5 \ E5 7540 EQUB &E6 \ E6 7550 EQUB &E7 \ E7 7560 EQUB &E8 \ E8 7570 EQUB &E9 \ E9 7580 EQUB &EA \ EA 7590 EQUB &EB \ EB 7600 EQUB &EC \ EC 7610 EQUB &ED \ ED 7620 EQUB &EE \ EE 7630 EQUB &EF \ EF 7640 EQUB &F0 \ F0 7650 EQUB &F1 \ F1 7660 EQUB &F2 \ F2 7670 EQUB &F3 \ F3 7680 EQUB &F4 \ F4 7690 EQUB &F5 \ F5 7700 EQUB &F6 \ F6 7710 EQUB &F7 \ F7 7720 EQUB &F8 \ F8 7730 EQUB &F9 \ F9 7740 EQUB &FA \ FA 7750 EQUB &FB \ FB 7760 EQUB &FC \ FC 7770 EQUB &FD \ FD 7780 EQUB &FE \ FE 7790 EQUB &FF \ FF 7800.Xtab 7810 EQUW &3880 7820 EQUW &38D0 7830 EQUW &3920 7840 EQUW &3970 7850 EQUW &39C0 7860 EQUW &3A10 7870 EQUW &3A60 7880 EQUW &3AB0 7890 EQUW &3B00 7900 EQUW &3B50 7910 EQUW &3BA0 7920 EQUW &3BF0 7930 EQUW &3C40 7940 EQUW &3C90 7950 EQUW &3CE0 7960 EQUW &3D30 7970 EQUW &3D80 7980 EQUW &3DD0 7990 EQUW &3E20 8000 EQUW &3E70 8010 EQUW &3EC0 8020 EQUW &3F10 8030 EQUW &3F60 8040 EQUW &3FB0 8050.INVER:LDA #32:STA Sym:.LP3 LDA #23:JSR oswrch:LDA Sym 8060 STA &3B00:ORA #&80:JSR oswrch 8070 LDX #&00 8080 LDY #&3B 8090 LDA #10 8100 JSR OSWORD 8110 LDX #0 8120.LP4 INX 8130 LDA &3B00,X 8140 EOR #&FF 8150 JSR oswrch 8160 TXA 8170 CMP #8 8180 BNE LP4 8190 INC Sym 8200 BPL LP3 8210 LDX #&80:STX Cell 8220 LDY #&38:STY Cell+1:LDY #0 8230.LP5 LDA #32 8240 STA (Cell),Y 8250 INC Cell 8260 BNE L6 8270 INC Cell+1 8280.L6 LDA Cell+1:CMP #&40 8300 BNE LP5 8330 RTS 8340.Wrap24 CLC 8350 ADC BaseY 8360 CMP #24 8370 BCC L99 8380 SEC 8390 SBC #24 8400.L99 RTS 8410.WipeLast LDA #0 8420 STA DEST 8430 LDA #23 8440 STA DEST1 8450 JSR SETCELL 8460 LDY #79 8470 LDA #32 8480.L69 8490 STA (Cell),Y 8500 DEY 8510 BPL L69 8520 RTS 8530.initBF 8540 LDA #00 8550 STA Top 8560 LDA #&38 8570 STA Top+1 8580 LDA PutV 8590 STA Oput 8600 LDA PutV+1 8610 STA Oput+1 8620 LDA GetV 8630 STA Oget 8640 LDA GetV+1 8650 STA Oget+1 8660 LDA #Myget AND &FF 8670 STA GetV 8680 LDA #Myput AND &FF 8690 STA PutV 8700 LDA #Myget DIV 256 8710 STA GetV+1 8720 LDA #Myput DIV 256 8730 STA PutV+1 8740LDA #&83 8750LDY #0 8760LDX #0 8770JSR osbyte 8780 CLC 8790 TYA 8800 ADC #7 8810 STA Bot+1 8820 STX Bot 8830LDA Bot 8840STA putptr 8850STA getptr 8860LDA Bot+1 8870STA putptr+1 8880STA getptr+1 8890 Lda #false \ Flow-control via X-ON/X-OFF - No ^S sent yet. 8900 Sta S_sent 8910 Lda #0 8920 Sta Buffer_count_lo \ and nothing in the buffer as far as XON/XOFF is 8930 Sta Buffer_count_hi \ concerned 8940 RTS 8950\########################################################################## 8960\## ## 8970\## PUT character into RS423 input buffer ## 8980\## ## 8990\########################################################################## 9000.Hisput JMP (Oput) 9010.Myput 9020 Cpx #1 \ Check that it is a RS423 buffer operation 9030 Bne Hisput \ If not, then use original buffer handler 9040 Tya \ A now contains character to be put in buffer 9050 Ldy #0 9060 Php \ Mask interrupts 9070 Sei 9080 Sta (putptr),Y \ Place character in buffer at 'putptr' 9090 Inc putptr 9100 Bne nocar1 9110 Inc putptr+1 9120.nocar1 \ and increment 'putptr' 9130 Lda putptr 9140 Cmp Top 9150 Bne done2 9160 Lda putptr+1 9170 Cmp Top+1 9180 Bne done2 \ If 'putptr' is at the end of the buffer, 9190 \ wrap it round to the start again 9200 Lda Bot 9210 Sta putptr 9220 Lda Bot+1 9230 Sta putptr+1 9240.done2 9250 Lda putptr 9260 Cmp getptr 9270 Bne done1 9280 Lda putptr+1 9290 Cmp getptr+1 9300 Bne done1 \ If putptr' has caught up with 'getptr', 9310 \ i.e. the buffer is full, then... 9320 Lda putptr 9330 Bne zz1 9340 Dec putptr+1 9350.zz1 9360 Dec putptr \ undo the put operation, 9370 Plp \ disable interrupts, 9380 Sec \ and return 'buffer full' code in carry 9390 Rts 9400.done1 \ Otherwise 9410 Inc Buffer_count_lo \ Increment count of bytes in buffer 9411 Bne qaz1 9412 Inc Buffer_count_hi 9413 .qaz1 9420 Lda Buffer_count_lo 9430 Cmp #XOFFtrigger_lo \ Test trigger value to see if ^S needed 9431 Bne Plenty_room_left 9440 \ in order not to overflow the buffer... 9441 Lda Buffer_count_hi 9442 Cmp #XOFFtrigger_hi 9443 Bne Plenty_room_left 9460 Lda S_sent 9470 Cmp #true 9480 Beq Plenty_room_left \ Oscillating around XOFF trigger, but 9490 \ should stop soon as value is going down... 9500 Lda #3: Ldx #3: Ldy #0: Jsr osbyte 9510 Lda #ASC("S") AND 31 \ Send XOFF if so. 9520 Jsr oswrch 9530 Lda #3: Ldx #0: Ldy #0: Jsr osbyte 9540 Lda #true \ And note the fact so that 'get from buffer' 9550 \ can send the XON when there is room. 9560 Sta S_sent \ (Note that S_sent is a flag, not a semaphore, 9570 \ as this machine does not have processes) 9580.Plenty_room_left 9590 Plp \ Restore interrupts, 9600 Clc \ and return 'buffer not full' code in carry 9610 Rts 9620\########################################################################## 9630\## ## 9640\## GET character from RS423 input buffer ## 9650\## ## 9660\########################################################################## 9670.Hisget JMP (Oget) 9680.Myget CPX #1 9690 Bne Hisget \ Check for RS324 'get from buffer' operation 9700 Php \ Mask interrupts 9710 Sei 9720 Lda getptr 9730 Cmp putptr 9740 Bne L27 9750 Lda getptr+1 9760 Cmp putptr+1 9770 Bne L27 \ If nothing in buffer ('getptr' = 'putptr') 9780 Plp \ then restore interrupts 9790 Sec \ and return 'buffer empty' code in carry 9800 Rts 9810.L27 9820 Ldy #0 9830 Lda (getptr),Y \ else fetch the byte 9840 Tay 9850 Inc getptr 9860 Bne L30 9870 Inc getptr+1 9880.L30 \ and increment the 'get' pointer 9890 Lda getptr 9900 Cmp Top 9910 Bne done10 9920 Lda getptr+1 9930 Cmp Top+1 9940 Bne done10 \ If the 'get' pointer is at the limit 9950 \ of the cyclic buffer, then 9960 Lda Bot 9970 Sta getptr 9980 Lda Bot+1 9990 Sta getptr+1 \ reset it to the other end. 10000.done10 10001 Lda Buffer_count_lo 10002 Bne qaz2 10003 Dec Buffer_count_hi 10004.qaz2 10005 Dec Buffer_count_lo 10020 Lda S_sent 10030 Cmp #true \ Are we holding off input? 10040 Bne No_check_needed 10050 Lda Buffer_count_lo 10060 Cmp #XONtrigger_lo \ Is there enough room yet? 10070 Bne No_check_needed 10071 Lda Buffer_count_hi 10072 Cmp #XONtrigger_hi 10073 Bne No_check_needed 10080\******* Set flag to send ^Q from top level. 10081\******* Top level will set S_sent to false... 10090Lda #true:Sta Q_needed 10160.No_check_needed 10170 Plp \ Restore interrupts 10180 Clc \ Return 'character fetched OK' code in carry 10190 Rts 10200.coff LDA #23:JSR oswrch 10210LDA #1:JSR oswrch 10220LDA #0:JSR oswrch 10230.cmeet JSR oswrch:JSR oswrch:JSR oswrch 10240JSR oswrch:JSR oswrch:JSR oswrch 10250JSR oswrch 10260RTS 10270.con LDA #23:JSR oswrch 10280LDA #1:JSR oswrch 10290JSR oswrch:LDA #0 10300JMP cmeet 10310\ 10320.ESCAPE \ Entry point for non-elbit extensions... 10351JSR poll 10410 Lda #&91 10420 Ldx #&01 10430 Ldy #&00 10440 Jsr osbyte 10450BCS ESCAPE 10460TYA 10470 And #&7F 10480 Cmp #ASC("*") 10490 Bne Next_test 10500\ Build up command line and *OSCLI it. 10510 Lda #0:Sta Com_len 10520.OSloop 10570JSR poll 10620 Lda #&91 10630 Ldx #&01 10640 Ldy #&00 10650 Jsr osbyte 10660BCS OSloop 10670 Tya:And #&7F 10680 \ 10690 Ldy Com_len 10700 Sta Star_buff,Y 10710 Inc Com_len 10720 Cmp #32 10730 Bcs OSloop \ read until < 32 10740\ 10750 Ldx #Star_buff MOD 256 10760 Ldy #Star_buff DIV 256 10770 Jsr &FFF7 10780 rts 10790\ 10800\ 10810\ 10820.Next_test 10830 Cmp #ASC("P") AND 31 \ Special for DLE DLE to printer... 10840 Bne next_2 10850 Lda State_flag 10860 And #printing 10870 Beq ignore 10880 Lda #1 10890 Jsr oswrch 10900 Lda #ASC("P") AND 31 10910 Jsr oswrch 10920.ignore 10930 rts 10950.next_2 10960 Cmp #ASC("P") \ Print On (transparent) == print only 10970 Bne next_3 10990 Lda #printing OR transparent 11000 Sta State_flag 11001JSR pmess 11009LDA #2:JSR oswrch 11010 rts 11030.next_3 11040 CMP #ASC("B") \ Print On (non-transparent) == printer + screen 11050 Bne N 11070 Lda #printing 11080 Sta State_flag 11081JSR pmess 11082LDA #2:JSR oswrch 11090 rts 11110.N 11120 Cmp #ASC("C") \ End print 11130 Bne n 11150 Lda #0 11160 Sta State_flag 11161JSR VSTRING:EQUB 31:EQUB 1:EQUB 24:EQUS " ":NOP:JSR REPLACE 11169LDA #3:JSR oswrch 11170 Rts 11190.n 11191Cmp #ASC("R"):Bne rts 11192JSR coff:Lda #12:Jsr oswrch 11193Lda#0:Sta DEST:STA DEST1 11194.zaq Jsr SETCELL:Ldy #0:Lda (Cell),Y:And#127:Cmp #32:Bcs ewq:Lda #32:.ewq Jsr oswrch 11195 Inc DEST:Lda DEST:Cmp #80:Bne zaq 11197Lda #0:Sta DEST:Inc DEST1:Lda DEST1:Cmp #24:Bne zaq 11199JSR con:Jsr REPLACE 11200 Rts 11201.pmess 11202JSR VSTRING:EQUB 31:EQUB 1:EQUB 24:NOP:JSR invstring:EQUS "Printing...":NOP 11203JSR VSTRING:EQUS " ":EQUB 30:NOP 11204JSR REPLACE 11209.rts Rts 11210] 11220NEXT 11230END