grwalter@watmath.UUCP (Fred Walter) (01/12/87)
this is the source for a vt52 emulator for the c64 written by frank prindle and played with by me. read term.doc. ----------cut line-------------------------------------------------- # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by watmath!grwalter on Mon Jan 5 19:38:02 EST 1987 # Contents: term.1 term.2 term.doc term.end term.font term.lables # term.plus.bas term.tables echo x - term.1 sed 's/^@//' > "term.1" <<'@//E*O*F term.1//' 100 ; 110 ; term.plus.64.1 120 ; 130 ; last date 870102 140 ; 150 ;various scaler variables 160 char .byte 0 ; character just read 170 stat .byte 0 ; rs-232 status byte 180 ndig .byte 0 ; digit counter for downline load 190 loopcnt .byte 0 ; cursor blink counter 200 loopmax .byte $00 ; cursor blink loop reset value 210 control .byte $06 ; rs-232 control reg (300 baud default) 220 command .byte $00 ; rs-232 command reg 230 optbdlo .byte $3c ; kluge value for 1200 baud 240 optbdhi .byte $01 ; kluge value for 1200 baud 250 fgbg8 .byte $bf ; 80 col fgnd/bgnd colors (gray1/gray3) 260 fgbg4 .byte $1b ; 40 col fgnd/bgnd colors (white/gray1) 270 escflag .byte 0 ; escape sequence flag/counter 280 xcoord .byte 0 ; temp storage for x screen coordinate 290 ycoord .byte 0 ; temp storage for y screen coordinate 300 lineh .byte 0 ; hires cursor line number 310 colh .byte 0 ; hires cursor column number 320 hilo .byte $f0 ; hires nibble mask 330 revmask .byte $0 ; reverse video mask ($f=reverse, $0=normal) 340 cflag .byte $ff ; zero if char under cursor has been reversed 350 cstate .byte $0 ; top nibble of char under cursor if cflag=0 360 flag79 .byte $0 ; non-zero if previous char printed in column 79 370 flag79t .byte $0 ; one shot copy of previous flag79 380 ccode .byte $0 ; temporary character storage for chrouth 390 suspend .byte $0 ; rs-232 reads suspended if non-zero 400 fxoff .byte $0 ; xoff has been sent if non-zero 410 commflg .byte $0 ; non-zero if commodore key is depressed 420 flag80 .byte $0 ; non-zero if 80 column mode 430 ; 440 ; terminal emulator reloacation from "here" to "there" 450 ; 460 *=there+$280 470 ; 480 movterm lda #<here ; set up source and dest to point 490 sta source ; to "here" and "there" respectively 500 lda #>here 510 sta source+1 520 lda #<there 530 sta dest 540 lda #>there 550 sta dest+1 560 ldx #$10 ; $1000 bytes will be moved 570 ldy #$00 580 lp lda (source),y ; beginning of outer and inner move loops 590 sta (dest),y 600 iny 610 bne lp ; end inner loop to move $100 bytes 620 inc source+1 630 inc dest+1 640 dex 650 bne lp ; end outer loop to do inner loop 16 times 660 beq renter ; skip around termination code 670 term lda r6510 ; prepare to terminate 680 ora #1 ; by paging basic rom in 690 sta r6510 700 brk ; terminate 710 renter lda r6510 ; reenter here 720 and #$fe ; page out basic rom 730 sta r6510 740 jmp init ; branch to init "there" 750 ; 760 ; terminal emulator main program 770 ; 780 init jsr revic ; set up vic chip bank and addresses 790 jsr movechr ; move 40 col char set from rom to ram 800 jsr replchr ; mod 40 col char set for full ascii 810 jsr screen ; set up screen attributes 820 jsr openrs ; open rs-232 channel 830 jsr welcome ; write initial message to screen 840 ; 850 tloop lda ndx ; main terminal loop begins 860 bne kbd ; keyboard has priority over rs-232 870 jsr flowcon ; do rs-232 flow control if necessary 880 jsr getrs ; get an rs-232 byte 890 bne kbd ; if none available, go check keyboard 900 jsr unblink ; restore character under cursor 910 lda escflag ; escape sequence activeprint 920 beq normal ; no 930 jsr escseq ; yes - process escape seq. 940 clc ; then skip printing char 950 bcc nospec 960 normal ldx char ; get ascii character read 970 lda from,x ; get equivalent c64 character to print 980 jsr chrouth ; print it on screen 990 ldx char ; get ascii again 1000 lda from,x ; get c64 again 1010 cmp #$01 ; code 1 characters are special 1020 bne nospec ; skip if not special 1030 jsr special ; process special rs-232 characters 1040 nospec jsr cleanup ; clean up after 40 col screen print 1050 clc ; repeat 1060 bcc tloop ; main loop 1070 ; 1080 kbd jsr getkb ; get a keyboard byte 1090 beq cursor ; if none available, go generate cursor 1100 ldx #5 ; change kernel output 1110 jsr chkout ; to rs-232 1120 jsr optimum ; wait for optimum time to do rs-232 out 1130 ldx char ; get c64 character read 1140 lda to,x ; get equivalent ascii character to send 1150 jsr chrout ; send it to rs-232 1160 ldx #0 ; return kernel output 1170 jsr chkout ; to screen 1180 cursor jsr docurs ; blink cursor position 1190 clc ; repeat 1200 bcc tloop ; main loop 1210 ; 1220 ; subroutine - open rs-232 as logical device 5 1230 ; 1240 openrs lda #<rsout ; allocate the rs-232 buffers 1250 sta robuf 1260 lda #>rsout 1270 sta robuf+1 1280 lda #<rsin 1290 sta ribuf 1300 lda #>rsin 1310 sta ribuf+1 1320 lda #4 ; pass rs-232 parameters as "filename" 1330 ldx #<control 1340 ldy #>control 1350 jsr setnam 1360 lda #5 ; equate logical unit 5 to physical 2 (rs-232) 1370 ldx #2 1380 ldy #0 1390 jsr setlfs 1400 jsr open ; do the open 1410 rts 1420 ; 1430 ; subroutine - move character set 2 from rom into ram as set 1 1440 ; 1450 movechr lda #$8e ; switch to character set 1 1460 jsr chrout 1470 lda vmcr ; set low 4 bits of vic memory control register 1480 and #$f0 ; to $0c so vic will fetch character patterns 1490 ora #$0e ; from $b800 1500 sta vmcr 1510 lda ccra ; clear bit 0 of cia control register a to stop 1520 and #$fe ; keyboard scan 1530 sta ccra 1540 lda r6510 ; page in character rom at $d000 1550 and #$fb 1560 sta r6510 1570 lda #$00 ; set up source to $d800 (rom set 2) 1580 sta source ; and dest to $b800 (ram set 1) 1590 sta dest 1600 lda #$d8 1610 sta source+1 1620 lda #$b8 1630 sta dest+1 1640 ldx #$08 ; $0800 bytes need to be moved 1650 ldy #$00 1660 mloop lda (source),y ; beginning of both outer and inner move loops 1670 sta (dest),y 1680 iny 1690 bne mloop ; end inner loop to move $100 bytes 1700 inc source+1 1710 inc dest+1 1720 dex 1730 bne mloop ; end outer loop to do inner loop 8 times 1740 lda r6510 ; page out character rom 1750 ora #$04 1760 sta r6510 1770 lda ccra ; resume keyboard scan 1780 ora #$01 1790 sta ccra 1800 rts 1810 ; 1820 ; subroutine - replace the bit patterns for 8 characters to attain full asc 1830 ; 1840 replchr lda #<newchar ; set up source to point to newchar 1850 sta source 1860 lda #>newchar 1870 sta source+1 1880 ldx #0 ; x always 0, y indexes through newchar 1890 ldy #0 1900 rloop1 lda (source),y ; begin outer loop - fetch screen code and 1910 lsr a ; compute dest as $b800 + screen code*8 1920 lsr a 1930 lsr a 1940 lsr a 1950 lsr a 1960 clc 1970 adc #$b8 1980 sta dest+1 1990 lda (source),y 2000 asl a 2010 asl a 2020 asl a 2030 sta dest 2040 lda #8 ; set inner loop counter to 8 2050 sta loopcnt 2060 iny ; index to first pattern byte 2070 rloop2 lda (source),y ; begin inner loop - move bit pattern for 1 chr 2080 sta (dest,x) 2090 lda dest+1 ; switch dest to reversed character area 2100 ora #$04 2110 sta dest+1 2120 lda (source),y ; move reversed bit pattern 2130 eor #$ff 2140 sta (dest,x) 2150 lda dest+1 ; switch dest back to normal characters 2160 eor #$04 2170 sta dest+1 2180 iny ; index to next bit pattern 2190 inc dest 2200 dec loopcnt 2210 bne rloop2 ; end inner loop to move 8 bytes 2220 cpy #$40 2230 bmi rloop1 ; end outer loop to modify 8 characters 2240 rts 2250 ; 2260 ; subroutine - perform rs-232 flow control 2270 ; 2280 flowcon lda shflag ; check commodore key 2290 and #$02 ; is it depressedprint 2300 beq nocomm ; no 2310 lda commflg ; was it depressed before 2320 bne bufchk ; yes, ignore it 2330 inc commflg ; set commodore key flag 2340 lda suspend ; currently suspendedprint 2350 beq notsus ; no 2360 lda #0 ; clear suspend flag 2370 sta suspend 2380 beq bufchk 2390 notsus inc suspend ; set suspend flag 2400 bne bufchk 2410 nocomm sta commflg ; clear commodore key flag 2420 bufchk lda ridbe ; compute number of char in rs-232 buffer 2430 sec 2440 sbc ridbs 2450 lsr a ; divide count by 2 for accurate check 2460 ldx fxoff ; has an xoff already been sent 2470 bne itsoff ; yes 2480 cmp #100 ; number chars in buffer reached 200print 2490 bmi flowret ; no - no flow control necessary yet 2500 jsr xoff ; send an xoff 2510 rts ; return 2520 itsoff cmp #10 ; has backlog dropped to 20 or lessprint 2530 bpl flowret ; no - leave input suspended 2540 jsr xon ; send an xon 2550 flowret rts 2560 ; 2570 ; subroutine - set border, background, and text colors, then clear screen 2580 ; 2590 screen lda #$0c ; set border to gray 2 2600 sta bord 2610 lda flag80 ; 80 column modeprint 2620 beq s40 ; no 2630 ; 2640 lda #<vidmat ; set up hires bgnd and fgnd colors 2650 sta dest 2660 lda #>vidmat 2670 sta dest+1 2680 ldx #$04 ; $0400 bytes need to be set 2690 ldy #0 2700 lda fgbg8 ; foreground/background colors 2710 sloop sta (dest),y ; begin both outer and inner set loops 2720 iny 2730 bne sloop ; end inner loop to set $100 bytes 2740 inc dest+1 2750 dex 2760 bne sloop ; end outer loop to do inner loop 4 times 2770 beq scom ; now go to common code 2780 ; 2790 s40 lda fgbg4 ; set 40 col bgnd color 2800 and #$0f 2810 sta bgnd 2820 lda fgbg4 ; set 40 col foreground color 2830 lsr a 2840 lsr a 2850 lsr a 2860 lsr a 2870 sta color ; continue into common code 2880 ; 2890 scom lda #$93 ; clear screen 2900 jsr chrouth 2910 rts 2920 ; 2930 ; subroutine - try to get a byte from rs-232 channel 2940 ; 2950 getrs lda suspend ; is rs-232 reading suspendedprint 2960 bne rsret ; yes 2970 ldx #$05 ; change kernel input to rs-232 channel 2980 jsr chkin 2990 jsr getin ; get byte 3000 and #$7f ; remove parity bit 3010 sta char 3020 jsr readst ; get status 3030 sta stat 3040 lda #0 ; return kernel input to keyboard 3050 jsr chkin 3060 jsr rserrs ; check for rs-232 errors 3070 bne rsret ; if error, return no byte 3080 lda stat ; check status to see if byte was read 3090 and #$08 3100 rsret rts ; return "ne" if no byte read 3110 ; 3120 ; subroutine - check for rs-232 errors 3130 ; 3140 rserrs lda stat ; check status for error bits 3150 and #$f7 3160 beq erret ; no errors, return "eq" 3170 jsr beeplo ; just beep on error 3180 lda #1 3190 erret rts ; return "ne" on errors 3200 ; 3210 ; subroutine - restore character under cursor to normal 3220 ; 3230 unblink lda flag80 ; 80 column modeprint 3240 beq u40 ; no 3250 ; 3260 lda cflag ; has cursor been blinked at this positionprint 3270 bne noneed ; no - char must still be in original state 3280 ldy #0 ; fetch top byte of character 3290 lda (pnth),y 3300 and hilo ; isolate nibble under cursor 3310 cmp cstate ; is character in original stateprint 3320 beq noneed ; yes 3330 ldy #8-1 ; must restore 8 bytes 3340 uloop lda (pnth),y ; fetch hires byte 3350 eor hilo ; reverse nibble under cursor 3360 sta (pnth),y ; replace hires byte 3370 dey ; decrement counter 3380 bpl uloop ; loop 8 times 3390 noneed ldy #$ff ; flag that char under cursor is restored 3400 sty cflag 3410 rts 3420 ; 3430 u40 ldy pntr ; fetch column displacement of cursor 3440 lda (pnt),y ; fetch screen byte under cursor 3450 and #$7f ; ensure non reversed character 3460 sta (pnt),y ; store back in screen 3470 rts 3480 ; 3490 ; subroutine - handle special input characters 3500 ; 3510 special lda char ; get ascii character 3520 cmp #$0d ; carriage returnprint 3530 bne notcr ; no 3540 sec ; yes, fetch cursor coordinates 3550 jsr ploth 3560 ldy #0 ; set column number to 0 3570 clc ; set cursor coordinates 3580 jsr ploth 3590 rts 3600 notcr cmp #$07 ; bellprint 3610 bne notbell ; no 3620 jsr beephi ; beep the tv with high tone 3630 rts 3640 notbell cmp #$1b ; ^[ (esc)print 3650 bne notesc ; no 3660 sta escflag ; set escape flag 3670 rts 3680 notesc cmp #$09 ; ^i (tab)print 3690 bne nottab ; no 3700 sec ; fetch cursor coordinates 3710 jsr ploth 3720 tya 3730 lsr a ; divide column by 8 3740 lsr a 3750 lsr a 3760 tay ; add one 3770 iny 3780 tya 3790 asl a ; multiply by 8 3800 asl a 3810 asl a 3820 tay 3830 lda flag80 ; 80 column modeprint 3840 bne nowrap ; yes 3850 cpy #40 ; is new column number 40print 3860 bne nowrap ; no 3870 ldy #0 ; column=0 3880 inx ; line=line+1 3890 cpx #25 ; does screen need to be rolled upprint 3900 bne nowrap ; no 3910 sty char ; zero char as a rollup flag 3920 nowrap clc ; reset column to new tab stop 3930 jsr ploth 3940 lda char ; is char zero (rollup required)print 3950 bne tabret ; no 3960 lda #$11 ; print cursor down to do rollup 3970 jsr chrouth 3980 tabret rts 3990 nottab brk ; error - there should be no other specials 4000 ; 4010 ; subroutine - clean up the c64 text editor flags for clean operation 4020 ; 4030 cleanup lda #$84 ; flag 2nd line as unlinked for good rollup 4040 sta ldtb1+1 4050 lda #$00 ; flag no-quote mode 4060 sta qtsw 4070 rts 4080 ; 4090 ; subroutine - try to get a keyboard byte 4100 ; 4110 getkb jsr getin ; get a keyboard character 4120 cmp #0 ;"is there a character ? 4130 bne kbchar ; yes 4140 rts ; return "eq" if no character 4150 kbchar cmp #$83 ;"is it "shift/run/stop" ? 4160 bne kbsw ; no 4170 jsr end ; yes, terminate program 4180 kbsw cmp #$9e ;"is it ^8 ? 4190 bne kbsw2 ; no 4200 jsr restore ; restore everything 4210 lda #"8" ; set 80 column flag 4220 sta digcol ; and 80 column message digit 4230 kbsw1 sta flag80 4240 pla ; fix stack pointer 4250 pla 4260 jmp init ; restart program in new mode 4270 kbsw2 cmp #$9f ;"is it ^4 ? 4280 bne kbret ; no 4290 jsr restore ; restore everything 4300 lda #"4" ; set 40 column message digit 4310 sta digcol 4320 lda #0 ; clear 80 column flag 4330 beq kbsw1 ; via common code 4340 kbret sta char ; save in char 4350 rts 4360 ; 4370 ; subroutine - blink the cursor 4380 ; 4390 docurs dec loopcnt ; decrement timer 4400 beq blinkit ;"expired ? 4410 rts ; no 4420 blinkit lda flag80 ;"80 column mode ? 4430 beq b40 ; no 4440 ; 4450 lda cflag ;"must we save state of current character ? 4460 beq nosave ; no 4470 ldy #0 ; fetch top byte of char 4480 lda (pnth),y 4490 and hilo ; isolate nibble under cursor 4500 sta cstate ; save this state 4510 sty cflag ; clear flag 4520 nosave ldy #8-1 ; must reverse 8 bytes 4530 bloop lda (pnth),y ; fetch hires byte 4540 eor hilo ; reverse nibble under cursor 4550 sta (pnth),y ; replace hires byte 4560 dey 4570 bpl bloop ; loop 8 times 4580 bmi bcom ; go to common code 4590 ; 4600 b40 ldy pntr ; fetch column displacement of cursor 4610 lda (pnt),y ; fetch screen byte under cursor 4620 eor #$80 ; reverse it's current state 4630 sta (pnt),y ; store back in screen 4640 clc ; compute corresponding color ram address 4650 lda pnt+1 ; because c64 "user" is unreliable 4660 adc #>(colram-vidmat4) 4670 sta source+1 4680 lda pnt 4690 sta source 4700 lda fgbg4 ; get color code for fgnd 4710 lsr a 4720 lsr a 4730 lsr a 4740 lsr a 4750 sta (source),y ; into color ram 4760 ; 4770 bcom lda loopmax ; reset timer 4780 sta loopcnt 4790 lda #0 ; reset sound from beep routine 4800 sta wave 4810 rts 4820 ; 4830 ; subroutine - initiate sounds (beeps) - will be terminated next cursor bl 4840 ; 4850 beeplo lda #$14 ; select low frequency 4860 bne beep 4870 beephi lda #$50 ; select high frequency 4880 beep sta freqhi 4890 lda #$0f ; select fast attack, slow decay 4900 sta attdec 4910 lda #$12 ; select sustain ... 4920 sta susrel 4930 lda #6 ; select not-too-loud volume 4940 sta vol 4950 lda #$21 ; select sawtooth wave 4960 sta wave 4970 lda loopmax ; reset cursor timer for consistent beep time 4980 sta loopcnt 4990 rts 5000 ; 5010 ; subroutine - downline load output from 6502 assembler until ^^ 5020 ; 5030 dload lda #0 ; initialize 5040 sta ndig ; number of digits read 5050 sta dest ; clear load base address 5060 sta dest+1 5070 dget lda ndx ; begin line loop - check keyboard 5080 bne dbreak ; any key terminates load 5090 jsr getrs ; get rs-232 byte 5100 bne dget ; if none, keep waiting 5110 lda char ; get ascii character 5120 cmp #$1e ; ^^ (terminate load)print 5130 bne noterm ; no 5140 dbreak rts ; yes, return 5150 noterm cmp #$0a ; line feedprint 5160 beq dload ; yes, new line restarts load process 5170 jsr chekdig ; convert character to digit 5180 bmi dget ; not a digit, ignore 5190 inc ndig ; increment digit count 5200 lda ndig ; check digit count 5210 cmp #3 ; first or secondprint 5220 bpl ndlo ; no 5230 jsr dlo ; yes, update destination low 5240 clc ; loop for next character 5250 bcc dget 5260 ndlo cmp #5 ; third or fourthprint 5270 bpl ndhi ; no 5280 jsr dhi ; yes, update destination high 5290 clc ; loop for next character 5300 bcc dget 5310 ndhi jsr putdat ; must be data, go store it 5320 clc ; loop for next character 5330 bcc dget 5340 ; 5350 ; subroutine - a a hex digit, return binary value (also in char), else -1 5360 ; 5370 chekdig sec ; convert decimal digit to binary 5380 sbc #"0" 5390 bmi ckbad ; below 0, not a digit 5400 cmp #9+1 ; is it a decimal digitprint 5410 bmi ckgood ; yes, return binary 5420 sec ; convert hex digit to binary 5430 sbc #"a"-"0"-10 5440 cmp #$a 5450 bmi ckbad ; below "A", not a digit 5460 cmp #$f+1 ; is it a hex digitprint 5470 bpl ckbad ; no, too high 5480 ckgood sta char ; return good digit value 5490 lda char 5500 rts 5510 ckbad lda #-1 ; return -1 (not digit) 5520 rts 5530 ; 5540 ; subroutine - dest(low) = 16*dest(low)+char 5550 ; 5560 dlo lda dest ; dest low 5570 asl a ; multiply by 16 5580 asl a 5590 asl a 5600 asl a 5610 ora char ; combine with char 5620 sta dest ; update dest low 5630 rts 5640 ; 5650 ; subroutine - dest(high) = 16*dest(high)+char 5660 ; 5670 dhi lda dest+1 ; dest high 5680 asl a ; multiply by 16 5690 asl a 5700 asl a 5710 asl a 5720 ora char ; combine with char 5730 sta dest+1 ; update dest high 5740 rts 5750 ; 5760 ; subroutine - put data into memory at dest 5770 ; 5780 putdat lda ndig ; which digitprint 5790 and #1 ; odd or evenprint 5800 bne podd ; odd, just go stash char 5810 lda source ; even, get stashed data 5820 asl a ; multiply by 16 5830 asl a 5840 asl a 5850 asl a 5860 ora char ; combine with char 5870 ldy #0 ; store data into memory 5880 sta (dest),y 5890 inc dest ; increment destination 5900 bne samehi 5910 inc dest+1 5920 samehi rts 5930 podd lda char ; stash char 5940 sta source ; temporarily in source 5950 rts 5960 ; 5970 .file 08,"0:term.2" @//E*O*F term.1// chmod u=rw,g=,o= term.1 echo x - term.2 sed 's/^@//' > "term.2" <<'@//E*O*F term.2//' 100 ; 110 ; term.plus.64.2 120 ; 130 ; last date 870102 140 ; 150 ; subroutine - map vic into appropriate bank and set up addresses 160 ; 170 revic lda ddrpa2 ; ensure bank select bits are outputs 180 ora #$03 190 sta ddrpa2 200 lda flag80 ; 80 column modeprint 210 beq re40 ; no 220 ; 230 lda dpa2 ; set vic bank to 1 240 and #$fc 250 ora #$02 260 sta dpa2 270 lda #$78 ; set vic screen to $5c00, hires to $6000 280 sta vmcr 290 lda vcr ; turn on hires mode 300 ora #$20 310 sta vcr 320 rts 330 ; 340 re40 lda dpa2 ; set vic bank to 2 350 and #$fc 360 ora #$01 370 sta dpa2 380 lda vmcr ; set vic screen to $b400 390 and #$0f 400 ora #$d0 410 sta vmcr 420 lda #$b4 ; tell kernel screen is at $b400 430 sta hibase 440 rts 450 ; 460 ; subroutine - restore everything and terminate program 470 ; 480 end jsr restore ; restore everything to default state 490 pla ; fix up stack pointer 500 pla 510 pla 520 pla 530 ldx #16 ; move 16 byte term/reentry code to $2a7 540 eloop lda term-1,x 550 sta unused-1,x 560 dex 570 bne eloop 580 jmp unused ; exit now through term code at $2a7 590 ; 600 ; subroutine - restore everything to default state 610 ; 620 restore lda #5 ; close rs-232 channel 630 jsr close 640 lda vcr ; turn off hires mode if on 650 and #$df 660 sta vcr 670 lda #$14 ; set vic memory control reg to default 680 sta vmcr 690 lda dpa2 ; map vic back to bank 0 700 ora #$03 710 sta dpa2 720 lda #$04 ; tell kernel screen is at $0400 730 sta hibase 740 lda #$93 ; clear the screen 750 jsr chrouth 760 ldx #0 770 stx flag79 ; restore flags to their initial state 780 stx suspend 790 stx fxoff 800 dex 810 stx cflag 820 rts 830 ; 840 ; subroutine - process escape sequences 850 ; 860 escseq sec ; get cursor coordinates 870 jsr ploth 880 sty xcoord 890 stx ycoord 900 lda escflag ; if escflag still esc, char is 910 cmp #$1b ; a function code 920 beq fcode 930 ; 940 ; process cursor coordinates following ^[y 950 ; 960 lda char ; put char-$20 into y coordinate if 970 sec ; escflag=2, x coordinate if 980 sbc #$20 ; escflag=1 990 dec escflag 1000 ldy escflag 1010 sta xcoord,y 1020 ldy xcoord ; move cursor to new position 1030 ldx ycoord 1040 clc 1050 jsr ploth 1060 rts 1070 ; 1080 ; process ^[a (cursor up) 1090 ; 1100 fcode lda char ; process escape function codes 1110 cmp #"a" ;"cursor up ? 1120 bne notup ; no 1130 up lda #$91 ; yes - print cursor up 1140 print jsr chrouth 1150 return lda #0 ; reset escape flag 1160 sta escflag 1170 rts 1180 ; 1190 ; process ^[b (cursor down) 1200 ; 1210 notup cmp #"b" ;"cursor down ? 1220 bne notdn ; no 1230 cpx #24 ; at bottom marginprint 1240 beq return ; yes 1250 lda #$11 ; print cursor down 1260 bne print 1270 ; 1280 ; process ^[c (cursor right) 1290 ; 1300 notdn cmp #"c" ;"cursor right ? 1310 bne notrt ; no 1320 lda flag80 ; 80 column mode 1330 bne rt80 ; yes, skip next check 1340 cpy #39 ; at right margin 1350 beq return ; yes 1360 rt80 cpy #79 ; at right marginprint 1370 beq return ; yes 1380 lda #$1d ; print cursor right 1390 bne print 1400 ; 1410 ; process ^[d (cursor left) 1420 ; 1430 notrt cmp #"d" ;"cursor left ? 1440 bne notlft ; no 1450 cpy #0 ;"at left margin ? 1460 beq return ; yes 1470 lf80 lda #$9d ; print cursor left 1480 bne print 1490 ; 1500 ; process ^[h (cursor home) 1510 ; 1520 notlft cmp #"h" ;"cursor home ? 1530 bne nothome ; no 1540 lda #$13 ; print cursor home 1550 bne print 1560 ; 1570 ; process ^[o (reverse video) 1580 ; 1590 nothome cmp #"o"+$20 ;"reverse video ? 1600 bne notrev ; no 1610 lda #$12 ; print reverse on 1620 bne print 1630 ; 1640 ; process ^[n (normal video) 1650 ; 1660 notrev cmp #"n"+$20 ;"normal video ? 1670 bne notnorm ; no 1680 lda #$92 ; print reverse off 1690 bne print 1700 ; 1710 ; process ^[i (reverse line feed) 1720 ; 1730 notnorm cmp #"i" ;"reverse line feed ? 1740 beq yesrlf ; yes 1750 jmp notrlf ; no 1760 yesrlf cpx #0 ; at top marginprint 1770 bne up ; no - use normal cursor up 1780 lda flag80 ; 80 column modeprint 1790 beq rlf40 ; no 1800 ; 1810 lda #<(hires+$1e00-$100) ; source pointer 1820 sta source 1830 lda #>(hires+$1e00-$100) 1840 sta source+1 1850 lda #<(hires+$1f40-$100) ; destination pointer 1860 sta dest 1870 lda #>(hires+$1f40-$100) 1880 sta dest+1 1890 ldx #$1e ; 1e00 bytes must be moved 1900 ldy #0 1910 rfloop1 lda (source),y ; begin both outer and inner move loops 1920 sta (dest),y 1930 iny 1940 lda (source),y ; this is replicated to gain speed 1950 sta (dest),y 1960 iny 1970 lda (source),y ; this is replicated to gain speed 1980 sta (dest),y 1990 iny 2000 lda (source),y ; this is replicated to gain speed 2010 sta (dest),y 2020 iny 2030 bne rfloop1 ; end inner loop to move $100 bytes 2040 dec source+1 2050 dec dest+1 2060 dex 2070 bne rfloop1 ; end outer loop to do inner loop $1e times 2080 tya 2090 rfloop2 sta (dest),y ; now clear next 256 bytes back 2100 iny 2110 bne rfloop2 2120 dec dest+1 2130 ldy #$c0 ; last, clear first 64 hires bytes 2140 rfloop3 sta (dest),y 2150 iny 2160 bne rfloop3 2170 jmp retesc 2180 ; 2190 rlf40 lda #<(vidmat4+999-40) 2200 sta source ; source = address of last byte to move 2210 sta dest ; dest = corresponding color ram address 2220 lda #>(vidmat4+999-40) 2230 sta source+1 2240 lda #>(colram+999-40) 2250 sta dest+1 2260 ldy #40 ; distance to be moved 2270 ldx #0 ; inhibit x indexing 2280 rlfloop lda (source,x) ; move a character to next line 2290 sta (source),y 2300 lda #$01 ; color code for white 2310 sta (dest),y ; into corresponding color ram addr 2320 dec source ; decrement source addresses 2330 dec dest 2340 lda source 2350 cmp #$ff 2360 bne rlf1 2370 dec source+1 2380 dec dest+1 2390 rlf1 lda source ; screen all movedprint 2400 cmp #<(vidmat4-1) 2410 bne rlfloop ; no 2420 lda source+1 ; screen all movedprint 2430 cmp #>(vidmat4-1) 2440 bne rlfloop ; no 2450 lda #$20 ; screen code for space 2460 bfloop sta vidmat4-1,y ; set first line to all spaces 2470 dey 2480 bne bfloop 2490 jmp retesc 2500 ; 2510 ; process ^[k (clear to end of line) 2520 ; 2530 notrlf cmp #"k" ;"clear to end of line ? 2540 bne noteol ; no 2550 lda flag80 ;"80 column mode ? 2560 beq eol40 ; no 2570 ; 2580 jsr hceol ; do the clear 2590 jmp retesc 2600 ; 2610 eol40 lda #$20 ; screen code for space 2620 ldy pntr ; get displacement from pnt 2630 eoloop sta (pnt),y ; store a space 2640 iny ; next logical column 2650 cpy #40 ; end of physical lineprint 2660 beq retesc ; yes 2670 cpy #80 ; end of physical lineprint 2680 beq retesc ; yes 2690 bne eoloop ; no, keep clearing 2700 ; 2710 ; process ^[j (clear to end of screen) 2720 ; 2730 noteol cmp #"j" ;"clear to end of screen ? 2740 bne noteos ; no 2750 lda flag80 ;"80 column mode ? 2760 beq eos40 ; no 2770 ; 2780 jsr hclear ; clear to end of screen 2790 jmp retesc 2800 ; 2810 eos40 lda pntr ; put cursor screen memory address 2820 clc ; (pnt+pntr) into dest 2830 adc pnt 2840 sta dest 2850 lda #0 2860 adc pnt+1 2870 sta dest+1 2880 lda #$20 ; screen code for space 2890 ldy #0 ; inhibit indexing 2900 eosloop sta (dest),y ; store a space 2910 inc dest ; increment screen address 2920 bne eos1 2930 inc dest+1 2940 eos1 ldx dest ; end of screenprint 2950 cpx #<(vidmat4+1000) 2960 bne eosloop ; no 2970 ldx dest+1 ; end of screenprint 2980 cpx #>(vidmat4+1000) 2990 bne eosloop ; no 3000 beq retesc 3010 ; 3020 ; process ^[y (cursor motion initiate) 3030 ; 3040 noteos cmp #"y" ;"cursor motion ? 3050 bne notcm ; no 3060 lda #2 ; set escflag to 2 so next 2 3070 sta escflag ; chars will be processed as 3080 rts ; coordinates 3090 ; 3100 ; process ^[z (identify <vt-52> terminal) 3110 ; 3120 notcm cmp #"z" ;"identify terminal ? 3130 bne notid ; no 3140 ldx #5 ; change kernel output 3150 jsr chkout ; to rs-232 3160 lda #$1b ; output esc 3170 jsr chrout 3180 lda #"/" ; output / 3190 jsr chrout 3200 lda #"z" ; output z 3210 jsr chrout 3220 ldx #0 ; restore kernel output 3230 jsr chkout ; to screen 3240 clc 3250 bcc retesc 3260 ; 3270 ; process ^[^\ (initiate downline load) 3280 ; 3290 notid cmp #$1c ; downline loadprint 3300 bne retesc ; no 3310 jsr dload ; do download 3320 retesc lda #0 ; no other functions 3330 sta escflag ; clear escape flag 3340 rts 3350 ; 3360 ; subroutine - hires screen print (but use chrout if 40 column mode) 3370 ; 3380 chrouth ldx flag80 ;"80 column mode ? 3390 bne cho80 ; yes 3400 jsr chrout 3410 rts 3420 cho80 cmp #$00 ; no-ops (0,1) are ignored 3430 beq hret4 3440 cmp #$01 3450 beq hret4 3460 ldy flag79 ; copy special column 79 flag to one-shot 3470 sty flag79t 3480 ldy #0 ; then clear the main flag 3490 sty flag79 3500 cmp #$13 ; cursor homeprint 3510 bne hnhome ; no 3520 ; 3530 ; process home code 3540 ; 3550 hhome lda #<hires ; reset cursor variables to home position 3560 sta pnth 3570 lda #>hires 3580 sta pnth+1 3590 lda #$f0 3600 sta hilo 3610 lda #0 3620 sta lineh 3630 sta colh 3640 hret4 rts 3650 ; 3660 ; process clear code 3670 ; 3680 hnhome cmp #$93 ; clear screenprint 3690 bne hnclear ; no 3700 jsr hhome ; first home the cursor 3710 jsr hclear ; then clear to end of screen 3720 rts 3730 ; 3740 ; process cursor left code 3750 ; 3760 hnclear cmp #$9d ; cursor leftprint 3770 bne hnleft ; no 3780 lda colh ; get column 3790 bne hncol0 ; column zero check 3800 lda lineh ; column zero case, get line 3810 beq hret1 ; line zero also so it's a no-op 3820 dec lineh ; decrement line 3830 lda #79 ; column=79 3840 sta colh 3850 bne hcom1 3860 hncol0 dec colh ; not column zero, just decrement column 3870 hcom1 lda hilo ; get hilo mask 3880 eor #$ff ; reverse it 3890 sta hilo 3900 cmp #$0f ; previous hires byteprint 3910 bne hret1 ; no 3920 lda pnth ; decrement hires pointer by 8 3930 sec 3940 sbc #8 3950 sta pnth 3960 lda pnth+1 3970 sbc #0 3980 sta pnth+1 3990 hret1 rts 4000 ; 4010 ; process cursor up code 4020 ; 4030 hnleft cmp #$91 ; cursor upprint 4040 bne hnup ; no 4050 lda lineh ; get line 4060 beq hret2 ; line zero is no-op 4070 dec lineh ; decrement line 4080 lda pnth ; decrement hires pointer by 320 4090 sec 4100 sbc #$40 4110 sta pnth 4120 lda pnth+1 4130 sbc #$01 4140 sta pnth+1 4150 hret2 rts 4160 ; 4170 ; process cursor down code 4180 ; 4190 hnup cmp #$11 ; cursor downprint 4200 bne hndown ; no 4210 lda lineh ; get line 4220 cmp #24 ; bottom lineprint 4230 beq hrollup ; yes, rollup required 4240 inc lineh ; increment line 4250 lda pnth ; increment hires pointer by 320 4260 clc 4270 adc #$40 4280 sta pnth 4290 lda pnth+1 4300 adc #$01 4310 sta pnth+1 4320 rts 4330 hrollup lda #<(hires+$140) ; source points to hires line 1 4340 sta source 4350 lda #>(hires+$140) 4360 sta source+1 4370 lda #<hires ; dest points to hires line 0 4380 sta dest 4390 lda #>hires 4400 sta dest+1 4410 ldx #$1e ; 1e0 bytes must be moved 4420 ldy #0 4430 hloop1 lda (source),y ; begin both outer and inner move loops 4440 sta (dest),y 4450 iny 4460 lda (source),y 4470 sta (dest),y 4480 iny 4490 lda (source),y 4500 sta (dest),y 4510 iny 4520 lda (source),y 4530 sta (dest),y 4540 iny 4550 bne hloop1 ; end inner loop to move $100 bytes 4560 inc source+1 4570 inc dest+1 4580 dex 4590 bne hloop1 ; end outer loop to do inner loop $1e times 4600 tya ; now clear next 256 hires bytes 4610 hloop2 sta (dest),y 4620 iny 4630 bne hloop2 4640 inc dest+1 4650 hloop3 sta (dest),y ; then the last 64 bytes 4660 iny 4670 cpy #$41 4680 bne hloop3 4690 rts 4700 ; 4710 ; process cursor right code 4720 ; 4730 hndown cmp #$1d ; cursor rightprint 4740 bne hnrt ; no 4750 hright lda colh ; get column 4760 cmp #79 ; at column 79print 4770 bne hncol79 ; no 4780 lda lineh ; get line 4790 cmp #24 ; at line 24print 4800 beq heos ; yes, treat end of screen special 4810 inc lineh ; increment line 4820 lda #0 ; column=0 4830 sta colh 4840 beq hcom2 4850 hncol79 inc colh ; not column 79, just increment column 4860 hcom2 lda hilo ; get hilo mask 4870 eor #$ff ; reverse it 4880 sta hilo 4890 cmp #$f0 ; next hires byteprint 4900 bne hret3 ; no 4910 lda pnth ; increment hires pointer by 8 4920 clc 4930 adc #8 4940 sta pnth 4950 lda pnth+1 4960 adc #0 4970 sta pnth+1 4980 hret3 rts 4990 heos lda #0 ; set column to zero 5000 sta colh 5010 lda #$f0 ; set hilo mask to upper nibble 5020 sta hilo 5030 lda pnth ; decrement hires pointer by $138 5040 sec 5050 sbc #$38 5060 sta pnth 5070 lda pnth+1 5080 sbc #$01 5090 sta pnth+1 5100 jmp hrollup ; complete by rolling up 5110 ; 5120 ; process reverse on code 5130 ; 5140 hnrt cmp #$12 ; reverse videoprint 5150 bne hnrev ; no 5160 lda #$0f ; set reverse mask 5170 sta revmask 5180 rts 5190 ; 5200 ; process reverse off code 5210 ; 5220 hnrev cmp #$92 ; normal videoprint 5230 bne hnnorm ; no 5240 lda #0 ; clear reverse mask 5250 sta revmask 5260 rts 5270 ; 5280 ; process printing character codes 5290 ; 5300 hnnorm sta ccode ; stash character code for later 5310 lda colh ; special column 79 treatment 5320 cmp #79 ; at column 79print 5330 bne not79 ; no 5340 lda flag79t ; was previous char printed at col 79print 5350 beq notf79 ; no 5360 jsr hright ; move cursor right to col 0 of next line 5370 clc 5380 bcc not79 5390 notf79 inc flag79 ; set flag, this char will print at 79 5400 not79 lda ccode ; get character code previously saved 5410 sec ; subtract $20 from character code 5420 sbc #$20 5430 sta source ; temporarily save code 5440 lsr a ; high of (code*8) 5450 lsr a 5460 lsr a 5470 lsr a 5480 lsr a 5490 sta source+1 ; source+1=high font displacement 5500 lda source ; low of (code*8) 5510 asl a 5520 asl a 5530 asl a 5540 clc 5550 adc #<font ; set source=desired font address 5560 sta source 5570 lda source+1 5580 adc #>font 5590 sta source+1 5600 ldy #8-1 ; move the font into a hires nibble 5610 hxloop lda (source),y 5620 eor revmask ; reverse font pattern if necessary 5630 tax 5640 lda hilo ; test to see which nibble 5650 cmp #$f0 ; upper nibbleprint 5660 bne hnoshft ; no 5670 txa 5680 asl a ; shift font byte into high nibble 5690 asl a 5700 asl a 5710 asl a 5720 tax 5730 hnoshft lda hilo ; change hilo mask 5740 eor #$ff ; into a mask to preserve other nibble 5750 and (pnth),y ; now preserve that nibble 5760 sta dest ; and temporarily save 5770 txa ; get new font nibble 5780 ora dest ; combine with other nibble 5790 sta (pnth),y ; replace hires screen byte 5800 dey 5810 bpl hxloop ; repeat for 8 bytes 5820 lda flag79 ; should cursor be moved right 1print 5830 bne skiprt ; no, column 79 just printed 5840 jmp hright ; finish by moving right 1 column 5850 skiprt rts 5860 ; 5870 ; subroutine - clear from cursor to end of hires screen 5880 ; 5890 hclear jsr hclunc ; first clear under cursor if necessary 5900 lda #<(hires+$1f40) ; compute number of bytes to clear 5910 sec 5920 sbc dest 5930 sta source ; temp save low byte of count 5940 lda #>(hires+$1f40) 5950 sbc dest+1 ; high byte of count=0print 5960 hclr2 beq lastfew ; yes 5970 tax ; x*$100 bytes need to be cleared first 5980 lda #0 5990 tay 6000 hcloop2 sta (dest),y ; begin both outer and inner clear loops 6010 iny 6020 bne hcloop2 ; end inner loop to clear $100 bytes 6030 inc dest+1 6040 dex 6050 bne hcloop2 ; end outer loop to do inner loop x times 6060 lastfew ldy source ; lastly, clear "low count byte" bytes 6070 beq hclret ; really nothing more to clear! 6080 dey 6090 hcloop3 sta (dest),y ; begin clear loop for all but 1 byte 6100 dey 6110 bne hcloop3 ; end clear loop for all but 1 byte 6120 sta (dest),y ; clear the remaining byte 6130 hclret rts 6140 ; 6150 ; subroutine - hires clear from cursor to end of line 6160 ; 6170 hceol jsr hclunc ; clear under cursor if necessary 6180 ldx colh ; compute 40-((colh+1)/2) 6190 inx 6200 txa 6210 lsr a 6220 sta source ; temp save 6230 lda #40 6240 sec 6250 sbc source 6260 sta source+1 ; temp save result of calculation 6270 asl a 6280 asl a 6290 asl a 6300 sta source ; source=low byte of count to be cleared 6310 lda source+1 6320 lsr a ; compute high byte of count to be cleared 6330 lsr a 6340 lsr a 6350 lsr a 6360 lsr a 6370 clc 6380 bcc hclr2 ; share code in hclear from here on 6390 ; 6400 ; subroutine - hires clear under cursor if cursor in odd column 6410 ; 6420 hclunc lda pnth ; make dest point to current byte 6430 sta dest 6440 lda pnth+1 6450 sta dest+1 6460 lda colh ; is the column number 6470 and #1 ; evenprint 6480 beq evencol ; yes 6490 ldx #8 ; clear low nibble of 8 bytes under cursor 6500 ldy #0 ; while incrementing dest by 8 6510 hcloop1 lda (dest),y ; begin 8 byte clear loop 6520 and #$f0 6530 sta (dest),y 6540 inc dest 6550 bne hc1 6560 inc dest+1 6570 hc1 dex 6580 bne hcloop1 ; end of 8 byte clear loop 6590 evencol rts 6600 ; 6610 ; subroutine - hires plot (but use plot if 40 column mode) 6620 ; 6630 ploth bcc pset ; carry clear means go set coordinates 6640 lda flag80 ; 80 column modeprint 6650 bne fetch80 ; yes 6660 jsr plot ; use commodore plot function 6670 tya 6680 cmp #40 ; is column >= 40print 6690 bmi plret ; no 6700 sec ; subtract 40 6710 sbc #40 6720 plret tay ; return the 40 column coordinates 6730 rts 6740 fetch80 ldx lineh ; fetch 80 column coordinates 6750 ldy colh 6760 rts 6770 pset cpx #0 ; line < 0print 6780 bpl ps1 ; no 6790 ldx #0 ; set line to 0 6800 ps1 cpx #25 ; line >= 25print 6810 bmi ps2 ; no 6820 ldx #24 ; set line to 24 6830 ps2 cpy #0 ; column < 0print 6840 bpl ps3 ; no 6850 ldy #0 ; set column to 0 6860 ps3 lda flag80 ; 80 column modeprint 6870 bne test80 ; yes 6880 cpy #40 ; column >= 40print 6890 bmi ps4 ; no 6900 ldy #39 ; set column to 39 6910 ps4 clc ; set cursor coordinates 6920 jsr plot ; using commodore plot 6930 rts 6940 test80 cpy #80 ; column >= 80print 6950 bmi hset ; no 6960 ldy #79 ; set column to 79 6970 hset stx lineh ; set cursor position 6980 sty colh 6990 tya ; derive new hilo mask 7000 ldy #$f0 ; hilo mask for upper nibble 7010 and #1 ; check low column bit 7020 beq hupper ; even columns use high nibble 7030 ldy #$0f ; hilo mask for lower nibble 7040 hupper sty hilo ; set up hilo 7050 lda #<hires ; compute new hires screen pointer 7060 sta pnth ; assume home position 7070 lda #>hires 7080 sta pnth+1 7090 cpx #0 ; line zeroprint 7100 beq hatline ; yes 7110 hploop lda pnth ; add $140 to pointer once for each line 7120 clc 7130 adc #$40 7140 sta pnth 7150 lda pnth+1 7160 adc #$01 7170 sta pnth+1 7180 dex 7190 bne hploop ; loop for all lines 7200 hatline lda colh ; get column 7210 lsr a ; divide by 2 7220 asl a ; multiply by 8 7230 asl a 7240 asl a 7250 bcc nocarry ; carry from shiftsprint 7260 inc pnth+1 ; yes, propogate the carry 7270 nocarry clc ; add rest of col/2*8 to pointer 7280 adc pnth 7290 sta pnth 7300 lda pnth+1 7310 adc #0 7320 sta pnth+1 7330 lda #0 ; clear column 79 flag 7340 sta flag79 7350 rts 7360 ; 7370 ; subroutine - send out ^s (xoff) to remote host 7380 ; 7390 xoff ldx #5 ; switch kernel to rs-232 output 7400 stx fxoff ; set xoff flag 7410 jsr chkout 7420 jsr optimum ; wait until optimum time 7430 lda #$13 ; then, transmit ^s 7440 xcom jsr chrout 7450 ldx #0 ; restore kernel output to screen 7460 jsr chkout 7470 rts 7480 ; 7490 ; subroutine - send out ^q (xon) to remote host 7500 ; 7510 xon lda #0 ; clear xoff flag 7520 sta fxoff 7530 ldx #5 ; switch kernel to rs-232 output 7540 jsr chkout 7550 lda #$11 ; transmit ^q 7560 bne xcom 7570 ; 7580 ; subroutine - wait for optimum time to transmit an rs-232 character 7590 ; 7600 optimum lda bitci ; rs-232 input bit count 7610 cmp #7 ; wait until count is not 7 7620 beq optimum 7630 ldx time+2 ; set x to 2 jiffys in the future 7640 inx 7650 inx 7660 opti2 lda bitci ; wait until rs-232 bit count 7670 cmp #7 ; equals 7 7680 beq optiret 7690 cpx time+2 ; or until 2 jiffys have expired 7700 bne opti2 7710 optiret rts 7720 ; 7730 ; subroutine - write initial message to screen 7740 ; 7750 welcome lda flag80 ; 80 column modeprint 7760 beq welprnt ; no 7770 ldy #20 ; write 20 extra spaces to screen 7780 sty welcnt 7790 padloop lda #" " ; this padding will center message 7800 jsr chrouth 7810 dec welcnt 7820 bne padloop 7830 welprnt ldy #0 ; initial message index 7840 weloop sty welcnt ; save message counter 7850 lda welmsg,y ; get message character 7860 beq welret ; done when 0 character found 7870 jsr chrouth ; output the character 7880 ldy welcnt ; retrieve counter 7890 iny ; increment to get next char index 7900 bne weloop ; loop for more characters 7910 welret clc ; now move cursor to line 3, col 0 7920 ldy #0 7930 ldx #3 7940 jsr ploth 7950 rts ; all done 7960 ; 7970 .file 08,"0:term.font" @//E*O*F term.2// chmod u=rw,g=,o= term.2 echo x - term.doc sed 's/^@//' > "term.doc" <<'@//E*O*F term.doc//' 100 n$="0:term.plus.o":open 15,8,15,"s"+n$:close 15:open 1,8,1,n$ 110 sys 1000 120 .opt o1 130 ; 140 ; term.plus.64.doc 150 ; 160 ; origion version by frank prindle using the cbm assembler. 170 ; converted by g. r. (fred) walter to assemble using pal. 180 ; 190 ; last date 870102 200 ; 210 ;"This program makes the Commodore 64 operate like a semi- 220 ;"intellegent 40 or 80 column ascii terminal. It supports input 230 ;"and display of all the ASCII characters, and beeps when the BEL 240 ;"character is received. Beware that the 80 column display mode 250 ;"will probably require a monitor unless you are using a B/W 260 ;"TV set with outstanding sharpness and video bandwidth. 270 ; 280 ;"The communication protocol is full duplex, 8 bits, no 290 ;"parity, 1 stop bit, 300 or 1200 baud, with XON/XOFF (DC1/ 300 ;"DC3) host flow control protocol -- this should satisfy most 310 ;"host computers. The display screen is 40 columns X 25 lines 320 ;"or 80 columns X 25 lines. 330 ; 340 ;"Because of the unusual layout of the C64 keyboard, the 350 ;"desire to support all ascii characters, and a personal 360 ;"need to find the ESC and BS keys in their usual positions, 370 ;"the following key substitutions apply (note- ^x is short- 380 ;"hand for CONTROL-x): 390 ; 400 ;" TO SEND TYPE really is 410 ;" ------- ---- --------- 420 ;" \ BRITISH-POUND backslash 430 ;" ^\ ^BRITISH-POUND ctrl backslash 440 ;" ^[164] ^= ctrl underscore 450 ;" ^ UP-ARROW up-arrow 460 ;" ^^ ^UP-ARROW ctrl up-arrow 470 ;" ^[ (ESC) ^[ or BACK-ARROW escape 480 ;" [164] f1 underscore 490 ;" [C=*] f2 pipe 500 ;" [SHIFT_@] f3 backwards ' 510 ;" [175] f4 tilde 520 ;" [SHIFT_+] f5 left curly bracket 530 ;" [SHIFT_-] f6 right curly bracket 540 ;" DEL (RUB) f7 delete 550 ;" ^T f8 ctrl t 560 ;" ^H (BS) DEL, ^H, or ^T backspace 570 ;" ^J (NL) SHIFT/RETURN or ^J newline 580 ;" ^S (DC3) ^S or HOME 590 ;" ^Q (DC1) ^Q or CURSOR DOWN 600 ;" ^I (TAB) ^I (ie. No separate TAB key) 610 ; 620 ;"The CONTROL-8 key is used to switch the program from 40 column 630 ;"to 80 column mode. The CONTROL-4 key is used to switch the 640 ;"program back from 80 column to 40 column mode. Depressing one 650 ;"of these keys when already in the corresponding mode will simply 660 ;"clear the screen (as it does when switching modes). 670 ; 680 ;"Note that pressing the COMMODORE key will place the terminal 690 ;"program in a suspended display mode (ie. the cursor will freeze 700 ;"at it's current position), and ^S will be sent to the host 710 ;"computer when the RS-232 input buffer fills up. Similarly, 720 ;"pressing the COMMODORE key will remove the terminal from the 730 ;"suspended display mode and send a ^Q to the host computer only 740 ;"if a ^S had previously been sent and the buffer has become nearly 750 ;"empty. This enables the COMMODORE key to be used like the SCROLL/ 760 ;"NO-SCROLL key on DEC terminals. Suspended display mode is 770 ;"indicated to the user by the cursor blinking much faster than 780 ;"normal, an indication that the COMMODORE key must be pressed to 790 ;"resume displaying the received text. The program may also send 800 ;"^S and ^Q to the host computer on it's own from time to time if 810 ;"it detects an impending RS-232 buffer overflow condition - this 820 ;"normally will only occur while printing a number of short or blank 830 ;"lines while scrolling the screen up (or down), since 4 to 15 char- 840 ;"acters are received into the RS-232 buffer during the time it 850 ;"takes to scroll the whole screen. In any case, this automatic 860 ;"flow control is fully synchronized with the flow control 870 ;"necessitated by the use of the COMMODORE key to suspend and resume 880 ;"the display of received text. Depressing the ^S and ^Q keys (or 890 ;"their substitutes indicated above) unconditionally sends those 900 ;"ASCII characters to the remote host computer without any local 910 ;"effect. 920 ; 930 ;"This terminal program does 'not' support flow control in the 940 ;"opposite direction - receiving ^S from the host computer will not 950 ;"lock the keyboard or have any other effect, nor will ^Q. 960 ; 970 ;"Also note that pressing the RUN/STOP key with SHIFT depres- 980 ;"sed will cleanly terminate the terminal emulator program, 990 ;"and generate the BRK interrupt to send the C64 back 1000 ;"to whoever is servicing those interrupts (BASIC, 1010 ;"SUPERMON64,etc). 1020 ; 1030 ;"All 94 printable ascii characters and the space will 1040 ;"be displayed on the screen as received over the RS-232 1050 ;"channel. Most of the remaining (control) characters are 1060 ;"not displayed- however the following control characters 1070 ;"and escape sequences have special effects: 1080 ;" 1090 ;" CHARACTER EFFECT 1100 ;" --------- ------ 1110 ;" ^G (BEL) beeps the TV 1120 ;" ^H (BS) cursor backspaces 1130 ;" ^I (TAB) cursor moves right to next tab stop 1140 ;" ^J (NL) cursor moves down one line with scrolling 1150 ;" ^M (CR) cursor moves to start of line 1160 ;" ^[A cursor moves up one line 1170 ;" ^[B cursor moves down 1180 ;" ^[C cursor moves right one char. 1190 ;" ^[D cursor moves left one char. 1200 ;" ^[H cursor homes 1210 ;" ^[I cursor moves up one line with scrolling 1220 ;" ^[J clears from cursor to end of screen 1230 ;" ^[K clears from cursor to end of line 1240 ;" ^[Ylc cursor moves to line l-$20, col c-$20 1250 ;" ^[Z sends DEC VT-52 terminal id string 1260 ;" ^[n (lowercase n) turns off reverse video 1270 ;" ^[o (lowercase o) turns on reverse video 1280 ;" ^[^\ initiates downline load 1290 ; 1300 ;"Tab stops are pre-defined and fixed at every 8 columns 1310 ;"beginning with column 0 (ie. 0, 8, 16, 24, ...). 1320 ; 1330 ;"The rest should all be pretty much self explanatory except 1340 ;"for "downline load". Once the ^[^\ sequence has been re- 1350 ;"ceived, the program expects lines to come in over the RS- 1360 ;"232 channel of the form: 1370 ; 1380 ;" ;llhhdddddddddd... 1390 ; 1400 ;"where "llhh" is the address for the first byte of data 1410 ;"on the line (in 6502 low/high format), and "dddddd.." 1420 ;"are the data bytes themselves - note that the address 1430 ;"must be 4 hexadecimal digits and each data byte must 1440 ;"be 2 hexadecimal digits. The load is terminated normally 1450 ;"by reception of the control character ^^, or abnormally 1460 ;"if the user hits a key on the C64 keyboard during the 1470 ;"load. In the 40 column mode, It is possible to load anywhere 1480 ;"in the address ranges $0800 through $9fff and $c000 through 1490 ;"$cfff since the terminal program itself hides under the BASIC 1500 ;"ROM (from $a000 through $bfff). 80 column mode should not 1510 ;"be used to download into the address range $5c00 through 1520 ;"$7fff because that is where the high resolution video matrix 1530 ;"and screen image reside in that mode. 1540 ; 1550 ;"VAX UNIX users (Berkeley 4.1bsd) will find that the following 1560 ;""termcap" entries effectively describe this terminal program 1570 ;"for use with the terminal dependent UNIX programs (eg. vi, 1580 ;"emacs, more, rogue, etc.): 1590 ; 1600 ;" qc[C=*]c64[C=*]C64[C=*]Commodore 64:co#40:li#25:\ 1610 ;" :up=\EA:do=\EB:cl=\EH\EJ:am:bs:\ 1620 ;" :bw:ho=\EH:nd=\EC:so=\Eo:\ 1630 ;" :se=\En:cm=\EY%+ %+ :\ 1640 ;" :ce=\EK:sr=\EI:pt: 1650 ; 1660 ;" qd[C=*]c64w[C=*]C64W[C=*]Commodore 64 80 Col X 25 Lin:co#80:li#25:\ 1670 ;" :up=\EA:do=\EB:cl=\EH\EJ:bs:\ 1680 ;" :bw:ho=\EH:nd=\EC:so=\Eo:\ 1690 ;" :se=\En:cm=\EY%+ %+ :\ 1700 ;" :ce=\EK:sr=\EI:pt: 1710 ; 1720 ;"VAX VMS users can probably get away with the following (although 1730 ;"some VMS programs [eg. edt] require an auxilliary keypad, and do 1740 ;"not work especially well in 40 column mode): 1750 ; 1760 ;" set term /dev=vt52 1770 ;" set term /pag=25 1780 ;" set term /wid=80 [or 40, as the case may be] 1790 ; 1800 ;"TOPS-20 users can run "emacs" and the like after the following: 1810 ; 1820 ;" term vt52 1830 ;" term length 25 1840 ;" term width 80 [or 40, as the case may be] 1850 ;" term pause com 1860 ; 1870 ;"A low pitched beep (much lower than that generated by 1880 ;"receipt of the BEL character) indicates an error on the 1890 ;"RS-232 channel (a hit, lost data, etc). 1900 ; 1910 ;"Of course, this program assumes you have been able 1920 ;"to connect a modem (or null modem) to the C64 user 1930 ;"port, which may or may not be trivial! 1940 ; 1950 ;"To run the terminal program, just load it like any BASIC 1960 ;"program and RUN it. You will be prompted for the baud 1970 ;"rate. Enter either 3 or 300 for 300 baud, 12 or 1200 1980 ;"for 1200 baud, or just a carriage return for the default 1990 ;"(300 baud). If you find communications shaky or impos- 2000 ;"sible at 1200 baud, you may have to change the poke in 2010 ;"basic which pokes 0 to poke 8 instead. If this fails to 2020 ;"help, try tuning the optional baud rate constants in 0a4f 2030 ;"and 0a50 for your system clock as described in ref. guide 2040 ;"page 350 (use poke of 0 into 0a4d in this case). 2050 ; 2060 ;"Once it has been run, the terminal program moves itself 2070 ;"under the BASIC ROM and runs there (although the original 2080 ;"copy remains where it was loaded and can be re-run as long 2090 ;"as it remains intact). The memory map at run time is: 2100 ; 2110 ;" $a080-$afff The program area 2120 ;" $b000-$b1ff Unused 2130 ;" $b200-$b2ff RS-232 output buffer 2140 ;" $b300-$b3ff RS-232 input buffer 2150 ;" $b400-$b7ff Video matrix (the 40 column screen) 2160 ;" $b800-$bfff Character set for 40 column mode 2170 ;" $02a7-$02b6 Termination/Restart code 2180 ; 2190 ;"In addition, the following memory areas are used only while the 2200 ;"program is in the 80 column mode: 2210 ; 2220 ;" $5c00-$5fff Video matrix (the 80 column color memory) 2230 ;" $6000-$7fff Hires screen (the 80 column screen) 2240 ; 2250 ;"Once the terminal program has been terminated (with SHIFT/ 2260 ;"RUN/STOP), it may be re-started by re-running the original 2270 ;"BASIC program. However, if the BASIC program area has been 2280 ;"over-written during downloading, the terminal program can 2290 ;"still be restarted (at the same baud rate as before) with 2300 ;"the BASIC direct command "(686)" ; this command will 2310 ;"restart the terminal program at any time, even after running 2320 ;"other programs, unless some program is run which pokes 2330 ;"into the areas shown in the first map above. 2340 ; 2350 ;"One last warning: this program is not relocatable - do 2360 ;"not change the *length* of the BASIC program or nothing 2370 ;"will work! 2380 ; 2390 ;"Good Luck and Enjoy.... 2400 ;" Frank Prindle 2410 ; 2420 .file 08,"0:term.lables" @//E*O*F term.doc// chmod u=rw,g=,o= term.doc echo x - term.end sed 's/^@//' > "term.end" <<'@//E*O*F term.end//' 100 ; 110 ; term.plus.64.end 120 ; 130 ; last date 870102 140 ; 150 ; initial message and counter 160 ; 170 welcnt .byte 0 ; counter used for welcome message below 180 welmsg .byte $11:.asc " " 190 .byte "t"+32,"e"+32,"r"+32,"m"+32,"." 200 .byte "p"+32,"l"+32,"u"+32,"s"+32," ","-"," " 210 digcol .byte "4","0"," " 220 .byte "c"+32:.asc "olumn " 230 .byte "m"+32:.asc "ode" 240 .byte 0 250 ; 260 .end 08,"0:term.doc" @//E*O*F term.end// chmod u=rw,g=,o= term.end echo x - term.font sed 's/^@//' > "term.font" <<'@//E*O*F term.font//' 100 ; 110 ; term.plus.64.font 120 ; 130 ; last date 870102 140 ; 150 ; 80 column font for the 95 printing characters (in c64 ascii order) 160 ; 170 font .byte $0, $0, $0, $0, $0, $0, $0, $0 ; " " 180 .byte $0, $4, $4, $4, $4, $0, $4, $0 ; "!" 190 .byte $0, $a, $a, $0, $0, $0, $0, $0 ; """ 200 .byte $0, $2, $a, $e, $a, $e, $a, $8 ; "#" 210 .byte $0, $4, $e, $c, $6, $e, $4, $0 ; "$" 220 .byte $0, $0, $8, $2, $4, $8, $2, $0 ; "%" 230 .byte $0, $4, $a, $a, $4, $a, $5, $0 ; "&" 240 .byte $0, $2, $4, $0, $0, $0, $0, $0 ; "'" 250 .byte $0, $2, $4, $4, $4, $4, $2, $0 ; "(" 260 .byte $0, $8, $4, $4, $4, $4, $8, $0 ; ")" 270 .byte $0, $0, $a, $4, $e, $4, $a, $0 ; "*" 280 .byte $0, $0, $0, $4, $e, $4, $0, $0 ; "+" 290 .byte $0, $0, $0, $0, $0, $0, $4, $8 ; "," 300 .byte $0, $0, $0, $0, $e, $0, $0, $0 ; "-" 310 .byte $0, $0, $0, $0, $0, $0, $4, $0 ; "." 320 .byte $0, $2, $2, $4, $4, $8, $8, $0 ; "/" 330 .byte $0, $0, $4, $a, $a, $a, $4, $0 ; "0" 340 .byte $0, $0, $4, $c, $4, $4, $4, $0 ; "1" 350 .byte $0, $0, $c, $2, $4, $8, $e, $0 ; "2" 360 .byte $0, $0, $e, $2, $6, $2, $e, $0 ; "3" 370 .byte $0, $0, $a, $a, $e, $2, $2, $0 ; "4" 380 .byte $0, $0, $e, $8, $c, $2, $e, $0 ; "5" 390 .byte $0, $0, $e, $8, $e, $a, $e, $0 ; "6" 400 .byte $0, $0, $e, $2, $4, $8, $8, $0 ; "7" 410 .byte $0, $0, $e, $a, $e, $a, $e, $0 ; "8" 420 .byte $0, $0, $e, $a, $e, $2, $e, $0 ; "9" 430 .byte $0, $0, $0, $4, $0, $4, $0, $0 ; ":" 440 .byte $0, $0, $0, $4, $0, $4, $8, $0 ; ";" 450 .byte $0, $0, $2, $4, $8, $4, $2, $0 ; "<" 460 .byte $0, $0, $0, $e, $0, $e, $0, $0 ; "=" 470 .byte $0, $0, $8, $4, $2, $4, $8, $0 ; ">" 480 .byte $0, $e, $2, $6, $4, $0, $4, $0 ; "?" 490 .byte $0, $4, $a, $e, $a, $8, $6, $0 ; "@" 500 .byte $0, $0, $0, $e, $2, $e, $e, $0 ; "a" 510 .byte $0, $0, $8, $e, $a, $a, $e, $0 ; "b" 520 .byte $0, $0, $0, $6, $8, $8, $6, $0 ; "c" 530 .byte $0, $0, $2, $e, $a, $a, $e, $0 ; "d" 540 .byte $0, $0, $0, $6, $a, $c, $6, $0 ; "e" 550 .byte $0, $0, $4, $a, $c, $8, $8, $0 ; "f" 560 .byte $0, $0, $0, $e, $a, $e, $2, $6 ; "g" 570 .byte $0, $0, $8, $c, $a, $a, $a, $0 ; "h" 580 .byte $0, $0, $4, $0, $4, $4, $4, $0 ; "i" 590 .byte $0, $0, $4, $0, $4, $4, $4, $c ; "j" 600 .byte $0, $0, $8, $a, $c, $a, $a, $0 ; "k" 610 .byte $0, $0, $4, $4, $4, $4, $6, $0 ; "l" 620 .byte $0, $0, $0, $e, $e, $e, $a, $0 ; "m" 630 .byte $0, $0, $0, $c, $a, $a, $a, $0 ; "n" 640 .byte $0, $0, $0, $e, $a, $a, $e, $0 ; "o" 650 .byte $0, $0, $0, $e, $a, $e, $8, $8 ; "p" 660 .byte $0, $0, $0, $e, $a, $e, $2, $3 ; "q" 670 .byte $0, $0, $0, $e, $a, $8, $8, $0 ; "r" 680 .byte $0, $0, $0, $e, $8, $2, $e, $0 ; "s" 690 .byte $0, $0, $4, $e, $4, $4, $6, $0 ; "t" 700 .byte $0, $0, $0, $a, $a, $a, $e, $0 ; "u" 710 .byte $0, $0, $0, $a, $a, $a, $4, $0 ; "v" 720 .byte $0, $0, $0, $a, $e, $e, $e, $0 ; "w" 730 .byte $0, $0, $0, $a, $4, $a, $a, $0 ; "x" 740 .byte $0, $0, $0, $a, $a, $4, $4, $c ; "y" 750 .byte $0, $0, $0, $e, $2, $8, $e, $0 ; "z" 760 .byte $0, $6, $4, $4, $4, $4, $6, $0 ; "[" 770 .byte $0, $8, $8, $4, $4, $2, $2, $0 ; "\" 780 .byte $0, $c, $4, $4, $4, $4, $c, $0 ; "]" 790 .byte $0, $0, $4, $a, $0, $0, $0, $0 ; "^" 800 .byte $0, $0, $0, $0, $0, $0, $0, $e ; "[164]" 810 .byte $0, $8, $4, $0, $0, $0, $0, $0 ; "[SHIFT_@]" 820 .byte $0, $4, $e, $a, $e, $a, $a, $0 ; "A" 830 .byte $0, $c, $a, $c, $a, $a, $c, $0 ; "B" 840 .byte $0, $6, $8, $8, $8, $8, $6, $0 ; "C" 850 .byte $0, $c, $a, $a, $a, $a, $c, $0 ; "D" 860 .byte $0, $e, $8, $c, $8, $8, $e, $0 ; "E" 870 .byte $0, $e, $8, $c, $8, $8, $8, $0 ; "F" 880 .byte $0, $e, $8, $8, $a, $a, $e, $0 ; "G" 890 .byte $0, $a, $a, $e, $a, $a, $a, $0 ; "H" 900 .byte $0, $e, $4, $4, $4, $4, $e, $0 ; "I" 910 .byte $0, $2, $2, $2, $2, $a, $e, $0 ; "J" 920 .byte $0, $a, $a, $c, $a, $a, $a, $0 ; "K" 930 .byte $0, $8, $8, $8, $8, $8, $e, $0 ; "L" 940 .byte $0, $a, $e, $e, $e, $a, $a, $0 ; "M" 950 .byte $0, $2, $a, $e, $e, $a, $8, $0 ; "N" 960 .byte $0, $e, $a, $a, $a, $a, $e, $0 ; "O" 970 .byte $0, $e, $a, $a, $e, $8, $8, $0 ; "P" 980 .byte $0, $e, $a, $a, $a, $a, $e, $6 ; "Q" 990 .byte $0, $c, $a, $a, $c, $a, $a, $0 ; "R" 1000 .byte $0, $e, $8, $c, $6, $2, $e, $0 ; "S" 1010 .byte $0, $e, $4, $4, $4, $4, $4, $0 ; "T" 1020 .byte $0, $a, $a, $a, $a, $a, $e, $0 ; "U" 1030 .byte $0, $a, $a, $a, $a, $a, $4, $0 ; "V" 1040 .byte $0, $a, $a, $a, $e, $e, $a, $0 ; "W" 1050 .byte $0, $a, $a, $4, $a, $a, $a, $0 ; "X" 1060 .byte $0, $a, $a, $e, $4, $4, $4, $0 ; "Y" 1070 .byte $0, $e, $2, $4, $8, $8, $e, $0 ; "Z" 1080 .byte $0, $2, $4, $2, $2, $4, $2, $0 ; "[SHIFT_+]" left curly bracket 1090 .byte $0, $4, $4, $4, $0, $4, $4, $4 ; "[C=*]" pipe 1100 .byte $0, $8, $4, $8, $8, $4, $8, $0 ; "[SHIFT_-]" right curly bracket 1110 .byte $0, $0, $5, $a, $0, $0, $0, $0 ; "[175]" tilde 1120 ; 1130 .file 08,"0:term.end" @//E*O*F term.font// chmod u=rw,g=,o= term.font echo x - term.lables sed 's/^@//' > "term.lables" <<'@//E*O*F term.lables//' 100 ; 110 ; term.plus.64.lables 120 ; 130 ; last date 870102 140 ; 150 ; constant declarations 160 ; 170 ;kernel entry points 180 setnam = $ffbd ; set filename 190 setlfs = $ffba ; set open parameters 200 chkout = $ffc9 ; change kernel output channel 210 chrout = $ffd2 ; output a character 220 chkin = $ffc6 ; change kernel input channel 230 getin = $ffe4 ; input a character 240 readst = $ffb7 ; read i/o status 250 open = $ffc0 ; open a channel 260 close = $ffc3 ; close a channel 270 plot = $fff0 ; fetch/set cursor position (40 col) 280 ;commodore page zero variables 290 ndx = $c6 ; number of keyboard bytes pending 300 r6510 = $01 ; memory control register for 6510 310 ribuf = $f7 ; rs-232 input buffer pointer (2-byte) 320 robuf = $f9 ; rs-232 output buffer pointer (2-byte) 330 bitci = $a8 ; rs-232 input bit count 340 time = $a0 ; jiffy clock (3-byte) 350 pntr = $d3 ; cursor column displacement (40 col) 360 pnt = $d1 ; video matrix address of cursor line (40 col) 370 ldtb1 = $d9 ; editor line link table (40 col) 380 qtsw = $d4 ; quote-mode switch (40 col) 390 ;other commodore variables 400 ridbe = $29b ; rs-232 index to end of input buffer 410 ridbs = $29c ; rs-232 index to start of input buffer 420 shflag = $28d ; shift key flags (commodore key = bit 1) 430 hibase = $288 ; video matrix page number (40 col) 440 color = $286 ; 40 column foreground color 450 ; 460 ;page zero temporaries 470 source = $fb ; indirect address to be read 480 dest = $fd ; indirect address to be stored 490 pnth = $a3 ; hires screen pointer (basic temp data area) 500 ;commodore i/o addresses 510 vcr = $d011 ; vic control register 520 vmcr = $d018 ; vic memory control register 530 ccra = $dc0e ; cia control register a 540 bgnd = $d021 ; 40 column background color 550 bord = $d020 ; border color 560 freqhi = $d401 ; sid frequency (high byte) 570 attdec = $d405 ; sid attack/decay 580 susrel = $d406 ; sid sustain/release 590 vol = $d418 ; sid volume 600 wave = $d404 ; sid waveform select 610 ddrpa2 = $dd02 ; cia-2 data direction reg (port a) 620 dpa2 = $dd00 ; cia-2 data port a 630 ;color ram, hires screen, and video matrix addresses 640 colram = $d800 ; color ram address (40 col) 650 hires = $6000 ; hires screen address 660 vidmat = $5c00 ; video matrix address (80 col) 670 vidmat4 = $b400 ; video matrix address (40 col) 680 ;low memory area unused by basic 690 unused = $02a7 ; 16 byte termination/reentry area 700 ;terminal program load and run addresses 710 here = $0800 ; address where terminal program loaded 720 there = $a000 ; address where terminal program runs 730 ;relocated rs-232 buffer addresses 740 rsout = $b200 ; address of rs-232 output buffer 750 rsin = $b300 ; address of rs-232 input buffer 760 ; 770 .file 08,"0:term.tables" @//E*O*F term.lables// chmod u=rw,g=,o= term.lables echo x - term.plus.bas sed 's/^@//' > "term.plus.bas" <<'@//E*O*F term.plus.bas//' 100 print " [CLR]" 110 input "baud";b$ 120 if left$(b$,2)="12"then poke 2637,0 130 if left$(b$,1)="3" then poke 2637,6 140 sys(2688) @//E*O*F term.plus.bas// chmod u=rw,g=,o= term.plus.bas echo x - term.tables sed 's/^@//' > "term.tables" <<'@//E*O*F term.tables//' 100 ; 110 ; term.plus.64.tables 120 ; 130 ; last date 870102 140 ; 150 ;************************************************************************** 160 ;note - this program is assembled to run in the address space beginning at 170 ;$a080 but should be loaded at $0880. the space from $a000-$a080 (really 180 ;$0800-$0880) is reserved for a small basic program which queries for baud 190 ;rate, pokes "control" as appropriate, and calls "movterm". 200 ;************************************************************************** 210 ; 220 ; table declarations 230 ; 240 *=there+$80 250 ; 260 ;table "to" translates c64 to ascii 270 to .byte $00 ; cannot transmit null 280 .byte $01 ;"^A from ^A key 290 .byte $02 ;"^B from ^B key 300 .byte $03 ;"^C from ^C key 310 .byte $04 ;"^D from ^D key 320 .byte $05 ;"^E from ^E key 330 .byte $06 ;"^F from ^F key 340 .byte $07 ;"^G from ^G key 350 .byte $08 ;"^H from ^H key 360 .byte $09 ;"^I from ^I key 370 .byte $0a ;"^J from ^J key 380 .byte $0b ;"^K from ^K key 390 .byte $0c ;"^L from ^L key 400 .byte $0d ;"^M from ^M and RETURN keys 410 .byte $0e ;"^N from ^N key 420 .byte $0f ;"^O from ^O key 430 .byte $10 ;"^P from ^P key 440 .byte $11 ;"^Q from ^Q and CURS DOWN keys 450 .byte $12 ;"^R from ^R key 460 .byte $13 ;"^S from ^S and HOME keys 470 .byte $08 ;"^H from ^T and DEL keys 480 .byte $15 ;"^U from ^U key 490 .byte $16 ;"^V from ^V key 500 .byte $17 ;"^W from ^W key 510 .byte $18 ;"^X from ^X key 520 .byte $19 ;"^Y from ^Y key 530 .byte $1a ;"^Z from ^Z key 540 .byte $1b ;"^[ from ^[ key 550 .byte $1c ;"^\ from ^POUND key 560 .byte $1d ;"^] from ^] key 570 .byte $1e ;"^^ from ^^ key 580 .byte $1f ;"^[164] from ^= key 590 .byte $20 ;"SPACE from SPACE bar 600 .byte "!" ;"! from ! key 610 .byte $22 ;"" from " key 620 .byte "#" ;"# from # key 630 .byte "$" ;"$ from $ key 640 .byte "%" ;"% from % key 650 .byte "&" ;"& from & key 660 .byte "'" ;"' from ' key 670 .byte "(" ;"( from ( key 680 .byte ")" ;") from ) key 690 .byte "*" ;"* from * key 700 .byte "+" ;"+ from + key 710 .byte "," ;", from , key 720 .byte "-" ;"- from - key 730 .byte "." ;". from . key 740 .byte "/" ;"/ from / key 750 .byte "0" ;"0 from 0 key 760 .byte "1" ;"1 from 1 key 770 .byte "2" ;"2 from 2 key 780 .byte "3" ;"3 from 3 key 790 .byte "4" ;"4 from 4 key 800 .byte "5" ;"5 from 5 key 810 .byte "6" ;"6 from 6 key 820 .byte "7" ;"7 from 7 key 830 .byte "8" ;"8 from 8 key 840 .byte "9" ;"9 from 9 key 850 .byte ":" ;": from : key 860 .byte ";" ;"; from ; key 870 .byte "<" ;"< from < key 880 .byte "=" ;"= from = key 890 .byte ">" ;"> from > key 900 .byte "?" ;"? from ? key 910 .byte "@" ;"@ from @ key 920 .byte "a"+$20 ;"a from a key 930 .byte "b"+$20 ;"b from b key 940 .byte "c"+$20 ;"c from c key 950 .byte "d"+$20 ;"d from d key 960 .byte "e"+$20 ;"e from e key 970 .byte "f"+$20 ;"f from f key 980 .byte "g"+$20 ;"g from g key 990 .byte "h"+$20 ;"h from h key 1000 .byte "i"+$20 ;"i from i key 1010 .byte "j"+$20 ;"j from j key 1020 .byte "k"+$20 ;"k from k key 1030 .byte "l"+$20 ;"l from l key 1040 .byte "m"+$20 ;"m from m key 1050 .byte "n"+$20 ;"n from n key 1060 .byte "o"+$20 ;"o from o key 1070 .byte "p"+$20 ;"p from p key 1080 .byte "q"+$20 ;"q from q key 1090 .byte "r"+$20 ;"r from r key 1100 .byte "s"+$20 ;"s from s key 1110 .byte "t"+$20 ;"t from t key 1120 .byte "u"+$20 ;"u from u key 1130 .byte "v"+$20 ;"v from v key 1140 .byte "w"+$20 ;"w from w key 1150 .byte "x"+$20 ;"x from x key 1160 .byte "y"+$20 ;"y from y key 1170 .byte "z"+$20 ;"z from z key 1180 .byte "[" ;"[ from [ key 1190 .byte "\" ;"\ from POUND key 1200 .byte "]" ;"] from ] key 1210 .byte "^" ;"^ from ^ key (really UP ARROW) 1220 .byte $1b ;"^[ from [164] key ([164] means ESC) 1230 .byte "@"+$20 ;"[SHIFT_@] from SHIFT/* key 1240 .byte "a" ;"A from A key 1250 .byte "b" ;"B from B key 1260 .byte "c" ;"C from C key 1270 .byte "d" ;"D from D key 1280 .byte "e" ;"E from E key 1290 .byte "f" ;"F from F key 1300 .byte "g" ;"G from G key 1310 .byte "h" ;"H from H key 1320 .byte "i" ;"I from I key 1330 .byte "j" ;"J from J key 1340 .byte "k" ;"K from K key 1350 .byte "l" ;"L from L key 1360 .byte "m" ;"M from M key 1370 .byte "n" ;"N from N key 1380 .byte "o" ;"O from O key 1390 .byte "p" ;"P from P key 1400 .byte "q" ;"Q from Q key 1410 .byte "r" ;"R from R key 1420 .byte "s" ;"S from S key 1430 .byte "t" ;"T from T key 1440 .byte "u" ;"U from U key 1450 .byte "v" ;"V from V key 1460 .byte "w" ;"W from W key 1470 .byte "x" ;"X from X key 1480 .byte "y" ;"Y from Y key 1490 .byte "z" ;"Z from Z key 1500 .byte $7b ;"[SHIFT_+] from SHIFT/+ key 1510 .byte $7c ;"[C=*] from ????? 1520 .byte $7d ;"[SHIFT_-] from SHIFT/- key 1530 .byte $7e ;"[175] from SHIFT/^ key 1540 .byte $7f ;"DEL from ????? 1550 .byte "?" ;"illegal key 1560 .byte "?" ;"illegal key 1570 .byte "?" ;"illegal key 1580 .byte "?" ;"illegal key 1590 .byte "?" ;"illegal key 1600 .byte $5f ;"[164] from F1 key 1610 .byte $60 ;"[SHIFT_@] from F3 key 1620 .byte $7b ;"[SHIFT_+] from F5 key 1630 .byte $7f ;"DEL from F7 key 1640 .byte $7c ;"[C=*] from F2 key 1650 .byte $7e ;"[175] from F4 key 1660 .byte $7d ;"[SHIFT_-] from F6 key 1670 .byte $14 ;"^T from F8 key 1680 .byte $0a ;"NL from SHIFT/CR key 1690 .byte "?" ;"illegal key 1700 .byte "?" ;"illegal key 1710 .byte "?" ;"illegal key 1720 .byte "?" ;"illegal key 1730 .byte "?" ;"illegal key 1740 .byte "?" ;"illegal key 1750 .byte "?" ;"illegal key 1760 .byte "?" ;"illegal key 1770 .byte "?" ;"illegal key 1780 .byte "?" ;"illegal key 1790 .byte "?" ;"illegal key 1800 .byte "?" ;"illegal key 1810 .byte "?" ;"illegal key 1820 .byte "?" ;"illegal key 1830 .byte "?" ;"illegal key 1840 .byte "?" ;"illegal key 1850 .byte "?" ;"illegal key 1860 .byte "?" ;"illegal key 1870 .byte $20 ;"SPACE from SHIFT/SPACE key 1880 .byte "?" ;"illegal key 1890 .byte "?" ;"illegal key 1900 .byte "?" ;"illegal key 1910 .byte "?" ;"illegal key 1920 .byte "?" ;"illegal key 1930 .byte "?" ;"illegal key 1940 .byte "?" ;"illegal key 1950 .byte "?" ;"illegal key 1960 .byte "?" ;"illegal key 1970 .byte "?" ;"illegal key 1980 .byte "?" ;"illegal key 1990 .byte "?" ;"illegal key 2000 .byte "?" ;"illegal key 2010 .byte "?" ;"illegal key 2020 .byte "?" ;"illegal key 2030 .byte "?" ;"illegal key 2040 .byte "?" ;"illegal key 2050 .byte "?" ;"illegal key 2060 .byte "?" ;"illegal key 2070 .byte "?" ;"illegal key 2080 .byte "?" ;"illegal key 2090 .byte "?" ;"illegal key 2100 .byte "?" ;"illegal key 2110 .byte "?" ;"illegal key 2120 .byte "?" ;"illegal key 2130 .byte "?" ;"illegal key 2140 .byte "?" ;"illegal key 2150 .byte "?" ;"illegal key 2160 .byte "?" ;"illegal key 2170 .byte "?" ;"illegal key 2180 .byte "?" ;"illegal key 2190 .byte "@"+$20 ;"[SHIFT_@] from SHIFT/* key (dup) 2200 .byte "a" ;"A from A key (dup) 2210 .byte "b" ;"B from B key (dup) 2220 .byte "c" ;"C from C key (dup) 2230 .byte "d" ;"D from D key (dup) 2240 .byte "e" ;"E from E key (dup) 2250 .byte "f" ;"F from F key (dup) 2260 .byte "g" ;"G from G key (dup) 2270 .byte "h" ;"H from H key (dup) 2280 .byte "i" ;"I from I key (dup) 2290 .byte "j" ;"J from J key (dup) 2300 .byte "k" ;"K from K key (dup) 2310 .byte "l" ;"L from L key (dup) 2320 .byte "m" ;"M from M key (dup) 2330 .byte "n" ;"N from N key (dup) 2340 .byte "o" ;"O from O key (dup) 2350 .byte "p" ;"P from P key (dup) 2360 .byte "q" ;"Q from Q key (dup) 2370 .byte "r" ;"R from R key (dup) 2380 .byte "s" ;"S from S key (dup) 2390 .byte "t" ;"T from T key (dup) 2400 .byte "u" ;"U from U key (dup) 2410 .byte "v" ;"V from V key (dup) 2420 .byte "w" ;"W from W key (dup) 2430 .byte "x" ;"X from X key (dup) 2440 .byte "y" ;"Y from Y key (dup) 2450 .byte "z" ;"Z from Z key (dup) 2460 .byte $7b ;"[SHIFT_+] from SHIFT/+ key (dup) 2470 .byte $7c ;"[C=*] from ????? (dup) 2480 .byte $7d ;"[SHIFT_-] from SHIFT/- key (dup) 2490 .byte $7e ;"[175] from SHIFT/^ key (dup) 2500 .byte $7f ;"DEL from ????? 2510 .byte $20 ;"SPACE from SHIFT/SPACE key (dup) 2520 .byte "?" ;"illegal key 2530 .byte "?" ;"illegal key 2540 .byte "?" ;"illegal key 2550 .byte "?" ;"illegal key 2560 .byte "?" ;"illegal key 2570 .byte "?" ;"illegal key 2580 .byte "?" ;"illegal key 2590 .byte "?" ;"illegal key 2600 .byte "?" ;"illegal key 2610 .byte "?" ;"illegal key 2620 .byte "?" ;"illegal key 2630 .byte "?" ;"illegal key 2640 .byte "?" ;"illegal key 2650 .byte "?" ;"illegal key 2660 .byte "?" ;"illegal key 2670 .byte "?" ;"illegal key 2680 .byte "?" ;"illegal key 2690 .byte "?" ;"illegal key 2700 .byte "?" ;"illegal key 2710 .byte "?" ;"illegal key 2720 .byte "?" ;"illegal key 2730 .byte "?" ;"illegal key 2740 .byte "?" ;"illegal key 2750 .byte "?" ;"illegal key 2760 .byte "?" ;"illegal key 2770 .byte "?" ;"illegal key 2780 .byte "?" ;"illegal key 2790 .byte "?" ;"illegal key 2800 .byte "?" ;"illegal key 2810 .byte "?" ;"illegal key 2820 .byte $7e ;"[175] from SHIFT/^ key (dup) 2830 ; 2840 ;table "from" translates ascii to c64 2850 from .byte $00 ;"NUL doesn't print 2860 .byte $00 ;"^A doesn't print 2870 .byte $00 ;"^B doesn't print 2880 .byte $00 ;"^C doesn't print 2890 .byte $00 ;"^D doesn't print 2900 .byte $00 ;"^E doesn't print 2910 .byte $00 ;"^F doesn't print 2920 .byte $01 ;"BEL is special 2930 .byte $9d ;"BS prints as CURSOR LEFT 2940 .byte $01 ;"TAB is special 2950 .byte $11 ;"NL prints as CURSOR DOWN 2960 .byte $00 ;"^K doesn't print 2970 .byte $00 ;"^L doesn't print 2980 .byte $01 ;"CR is special 2990 .byte $00 ;"^N doesn't print 3000 .byte $00 ;"^O doesn't print 3010 .byte $00 ;"^P doesn't print 3020 .byte $00 ;"^Q doesn't print 3030 .byte $00 ;"^R doesn't print 3040 .byte $00 ;"^S doesn't print 3050 .byte $00 ;"^T doesn't print 3060 .byte $00 ;"^U doesn't print 3070 .byte $00 ;"^V doesn't print 3080 .byte $00 ;"^W doesn't print 3090 .byte $00 ;"^X doesn't print 3100 .byte $00 ;"^Y doesn't print 3110 .byte $00 ;"^Z doesn't print 3120 .byte $01 ;"^[ is special 3130 .byte $00 ;"^\ doesn't print 3140 .byte $00 ;"^] doesn't print 3150 .byte $00 ;"^^ doesn't print 3160 .byte $00 ;"^[164] doesn't print 3170 .byte $20 ;"SPACE prints as SPACE 3180 .byte $21 ;"! prints as ! 3190 .byte $22 ;"" prints as " 3200 .byte $23 ;"# prints as # 3210 .byte $24 ;"$ prints as $ 3220 .byte $25 ;"% prints as % 3230 .byte $26 ;"& prints as & 3240 .byte $27 ;"' prints as ' 3250 .byte $28 ;"( prints as ( 3260 .byte $29 ;") prints as ) 3270 .byte $2a ;"* prints as * 3280 .byte $2b ;"+ prints as + 3290 .byte $2c ;", prints as , 3300 .byte $2d ;"- prints as - 3310 .byte $2e ;". prints as . 3320 .byte $2f ;"/ prints as / 3330 .byte $30 ;"0 prints as 0 3340 .byte $31 ;"1 prints as 1 3350 .byte $32 ;"2 prints as 2 3360 .byte $33 ;"3 prints as 3 3370 .byte $34 ;"4 prints as 4 3380 .byte $35 ;"5 prints as 5 3390 .byte $36 ;"6 prints as 6 3400 .byte $37 ;"7 prints as 7 3410 .byte $38 ;"8 prints as 8 3420 .byte $39 ;"9 prints as 9 3430 .byte $3a ;": prints as : 3440 .byte $3b ;"; prints as ; 3450 .byte $3c ;"< prints as < 3460 .byte $3d ;"= prints as = 3470 .byte $3e ;"> prints as > 3480 .byte $3f ;"? prints as ? 3490 .byte $40 ;"@ prints as @ 3500 .byte $61 ;"A prints as A 3510 .byte $62 ;"B prints as B 3520 .byte $63 ;"C prints as C 3530 .byte $64 ;"D prints as D 3540 .byte $65 ;"E prints as E 3550 .byte $66 ;"F prints as F 3560 .byte $67 ;"G prints as G 3570 .byte $68 ;"H prints as H 3580 .byte $69 ;"I prints as I 3590 .byte $6a ;"J prints as J 3600 .byte $6b ;"K prints as K 3610 .byte $6c ;"L prints as L 3620 .byte $6d ;"M prints as M 3630 .byte $6e ;"N prints as N 3640 .byte $6f ;"O prints as O 3650 .byte $70 ;"P prints as P 3660 .byte $71 ;"Q prints as Q 3670 .byte $72 ;"R prints as R 3680 .byte $73 ;"S prints as S 3690 .byte $74 ;"T prints as T 3700 .byte $75 ;"U prints as U 3710 .byte $76 ;"V prints as V 3720 .byte $77 ;"W prints as W 3730 .byte $78 ;"X prints as X 3740 .byte $79 ;"Y prints as Y 3750 .byte $7a ;"Z prints as Z 3760 .byte $5b ;"[ prints as [ 3770 .byte $5c ;"\ prints as \ 3780 .byte $5d ;"] prints as ] 3790 .byte $5e ;"^ prints as ^ 3800 .byte $5f ;"[164] prints as [164] 3810 .byte $60 ;"[SHIFT_@] prints as [SHIFT_@] 3820 .byte $41 ;"a prints as a 3830 .byte $42 ;"b prints as b 3840 .byte $43 ;"c prints as c 3850 .byte $44 ;"d prints as d 3860 .byte $45 ;"e prints as e 3870 .byte $46 ;"f prints as f 3880 .byte $47 ;"g prints as g 3890 .byte $48 ;"h prints as h 3900 .byte $49 ;"i prints as i 3910 .byte $4a ;"j prints as j 3920 .byte $4b ;"k prints as k 3930 .byte $4c ;"l prints as l 3940 .byte $4d ;"m prints as m 3950 .byte $4e ;"n prints as n 3960 .byte $4f ;"o prints as o 3970 .byte $50 ;"p prints as p 3980 .byte $51 ;"q prints as q 3990 .byte $52 ;"r prints as r 4000 .byte $53 ;"s prints as s 4010 .byte $54 ;"t prints as t 4020 .byte $55 ;"u prints as u 4030 .byte $56 ;"v prints as v 4040 .byte $57 ;"w prints as w 4050 .byte $58 ;"x prints as x 4060 .byte $59 ;"y prints as y 4070 .byte $5a ;"z prints as z 4080 .byte $7b ;"[SHIFT_+] prints as [SHIFT_+] 4090 .byte $7c ;"[C=*] prints as [C=*] 4100 .byte $7d ;"[SHIFT_-] prints as [SHIFT_-] 4110 .byte $7e ;"[175] prints as [175] 4120 .byte $00 ;"DEL doesn't print 4130 ; 4140 ;table "newchar" defines 8 substitute screen 4150 ;graphics, 9 bytes each - first byte is screen 4160 ;code for graphic, next 8 are bit pattern 4170 newchar .byte $5b, $0e, $18, $08, $3c, $08, $18, $0e, $00 ; left brace 4180 .byte $5d, $70, $18, $10, $3c, $10, $18, $70, $00 ; right brace 4190 .byte $5e, $00, $00, $3b, $6e, $00, $00, $00, $00 ; tilde 4200 .byte $40, $30, $18, $0c, $00, $00, $00, $00, $00 ; grave accent 4210 .byte $5c, $18, $18, $18, $00, $18, $18, $18, $00 ; vertical bar 4220 .byte $1c, $00, $60, $30, $18, $0c, $06, $03, $00 ; back slash 4230 .byte $1e, $00, $00, $18, $3c, $66, $00, $00, $00 ; caret 4240 .byte $1f, $00, $00, $00, $00, $00, $00, $00, $7f ; underline 4250 ; 4260 .file 08,"0:term.1" @//E*O*F term.tables// chmod u=rw,g=,o= term.tables exit 0
black@ee.ucla.edu (Rex Black) (01/22/87)
> From: Fred Walter <watmath!grwalter> > > > this is the source for a vt52 emulator for the c64 written by frank > prindle and played with by me. read term.doc. > > [followed by about 2200 lines of PDP-11 asm. lang.] Correct me if I'm misinformed, but, Fred baby, I believe there is this neat language called 'C'... Anybody got a PDP-11 to C translator? This s**t is about as useless as a bit-mapped boat anchor! Rex Black black@ee.ucla.edu ARPA ...!{ihnp4,ucbvax,sdcrdcf,trwspp}!ucla-cs!uclaee!black UUCP Disclaimer: The preceding was produced by a random-character generator using digitized Led Zeppelin albums played backwards as the seeds. Therefore, any opinions above represent those of the netherworld and should not be construed as reflecting on myself or the UCLA EE Dept.
javoskamp@watnot.UUCP (01/22/87)
In article <3021@brl-adm.ARPA> black@ee.ucla.edu (Rex Black) writes: >> From: Fred Walter <watmath!grwalter> >> >> this is the source for a vt52 emulator for the c64 written by frank >> prindle and played with by me. read term.doc. >> [followed by about 2200 lines of PDP-11 asm. lang.] > >Correct me if I'm misinformed, but, Fred baby, I believe there is >this neat language called 'C'... >Anybody got a PDP-11 to C translator? This s**t is about as useless >as a bit-mapped boat anchor! Sorry to spoil your fun, but since the programs supposed to run on a Commodore 64 the programs are in fact in 6502 assembler. As it said, read term.doc. It states that has been modified to use the PAL assembler for the c64. Given the machine, it's about the only reasonable way to get any speed out of a modem program. While I haven't yet had a chance to try it out, I may have a chance to download it to my machine over the weekend. Jeff Voskamp Remember, always read/try something twice (or more) before complaining that it's not working. -- The opinions expressed herein are accurate. The same cannot be said for spelling and grammar. UUCP : {allegra,decvax,utzoo,clydeo}!watmath!watnot!javoskamp CSNET : javoskamp%watnot@waterloo.CSNET
rayz@csustan.UUCP (R. L. Zarling) (01/22/87)
In article <3021@brl-adm.ARPA> black@ee.ucla.edu (Rex Black) writes: >> >> [followed by about 2200 lines of PDP-11 asm. lang.] > >Correct me if I'm misinformed, but, Fred baby, I believe there is >this neat language called 'C'... > >Anybody got a PDP-11 to C translator? This s**t is about as useless >as a bit-mapped boat anchor! > >Rex Black Many of us are grateful for Fred's contribution. I suggest that those who do not need 6502 assembly language programs (or even recognize them as distinct from PDP-11 assembly language...) might well simply use their 'n' keys. Oh, yes, I like C too. But I firmly believe in using the appropriate language for the application at hand. R. L. Zarling Professor of Computer Science Calif. State Univ. Stanislaus
sansom@trwrb.UUCP (Richard Sansom) (01/23/87)
In article <3021@brl-adm.ARPA> black@ee.ucla.edu (Rex Black) writes: >> From: Fred Walter <watmath!grwalter> >> this is the source for a vt52 emulator for the c64 written by frank >> prindle and played with by me. read term.doc. >> >> [followed by about 2200 lines of PDP-11 asm. lang.] > >Correct me if I'm misinformed, but, Fred baby, I believe there is >this neat language called 'C'... >Anybody got a PDP-11 to C translator? This s**t is about as useless >as a bit-mapped boat anchor! > >Rex Black Uh, I think that was 6502 assembly language, which just happens to be native language for the C64. Just because you don't want this stuff doesn't mean it's useless "s**t". I, for one, appreciate everything that's posted here - even when I don't need it, or won't use it. As a matter of fact, I know a couple of people who could really use a good terminal emulator for their C64s, so I'll probably be downloading it for them. -Rich -- __________ ______ ____ _____ ___ /_________//___ ||__|/____|/__/ Richard E. Sansom ___ ____/ / ____________ TRW Electronics & Defense Sector / / / /\ < | /| / One Space Park Drive, R3/1028 / / / / \ \ | / | / Redondo Beach, CA 90278 /__/ /__/ \__\|__/ |__/ ...{decvax,ucbvax,ihnp4}!trwrb!sansom