10REM Program to set up a printer buffer in a sideways RAM 20REM (C) John Robinson 1988 30: 40DIM code &800 50: 60vectors=&22A 70: 80zeropage=&00A8 90memptr1=zeropage+0 100memptr2=zeropage+2 110ramslot=zeropage+4 120thisrom=zeropage+5 130end_of_data=&C000 140ptrblk=zeropage 150ip_ptr=ptrblk+0 160op_ptr=ptrblk+2 170: 180FOR pass=4 TO 7 STEP 3 190P%=code 200O%=code 210[OPT pass 220 230.set_up_buffer 240 250\ Enter with A=RAM slot to use 260 270STA ramslot 280LDA &F4 290STA thisrom 300LDY #start_of_code DIV 256 310LDX #start_of_code MOD 256 320STY memptr1+1 330STX memptr1 340LDY #&80 350LDX #0 360STY memptr2+1 370STX memptr2 380LDY #0 390LDX #(end_of_code-start_of_code+&FF) DIV 256 400.copy_loop 410LDA thisrom 420STA &F4 430STA &FE30 440LDA (memptr1),Y 450PHA 460LDA ramslot 470STA &F4 480STA &FE30 490PLA 500STA (memptr2),Y 510INY 520BNE copy_loop 530INC memptr1+1 540INC memptr2+1 550DEX 560BNE copy_loop 570LDA thisrom 580STA &F4 590STA &FE30 600RTS 610 620.start_of_code 630] 640P%=&8000 650[OPT pass 660 670BRK:BRK:BRK 680JMP service 690EQUB &82 700EQUB copyright MOD 256 710EQUB RND(255) 720EQUS "Printer Buffer" 730.copyright 740EQUB 0 750EQUS "(C)" 760EQUB 0 770 780.service 790CMP #1 800BEQ ok 810RTS 820 830.ok 840PHP 850PHA 860TYA 870PHA 880TXA 890PHA 900SEI 910LDY #5 920.removeold_installnew 930LDA vectors,Y 940STA oldvecs,Y 950LDA newvecs,Y 960STA vectors,Y 970DEY 980BPL removeold_installnew 990LDY #6/2*3-1 1000LDX #1 1010.installextended 1020LDA newextvecs,Y 1030DEX 1040BNE not_romno 1050LDA &F4 1060LDX #3 1070.not_romno 1080STA &D9F+(vectors MOD 256)/2*3,Y 1090DEY 1100BPL installextended 1110LDY #start_of_data DIV 256 1120LDX #start_of_data MOD 256 1130STY ip_ptr+1 -ptrblk+ptrbuff 1140STX ip_ptr -ptrblk+ptrbuff 1150STY op_ptr+1 -ptrblk+ptrbuff 1160STX op_ptr -ptrblk+ptrbuff 1170.exit 1180PLA 1190TAX 1200PLA 1210TAY 1220PLA 1230PLP 1240RTS 1250 1260.insert 1270JSR ptrsdown 1280JSR ins 1290JMP ptrsup 1300 1310.remove 1320JSR ptrsdown 1330JSR rem 1340JMP ptrsup 1350 1360.countpurge 1370JSR ptrsdown 1380JSR cnp 1390.ptrsup 1400PHP 1410PHA 1420TYA 1430PHA 1440TXA 1450PHA 1460LDX #3 1470.ptrsuploop 1480LDA ptrblk,X 1490STA ptrbuff,X 1500DEX 1510BPL ptrsuploop 1520BMI exit 1530 1540.ptrsdown 1550PHP 1560PHA 1570TYA 1580PHA 1590TXA 1600PHA 1610LDX #3 1620.ptrsdownloop 1630LDA ptrbuff,X 1640STA ptrblk,X 1650DEX 1660BPL ptrsdownloop 1670BMI exit 1680 1690.oldvecs 1700.oldins 1710EQUW 0 1720.oldrem 1730EQUW 0 1740.oldcnp 1750EQUW 0 1760 1770.ptrbuff 1780EQUD 0 1790 1800.newvecs 1810EQUW &FF00+&2A/2*3 1820EQUW &FF00+&2C/2*3 1830EQUW &FF00+&2E/2*3 1840 1850.newextvecs 1860EQUW insert 1870.workspace 1880EQUB 0 1890EQUW remove 1900EQUB 0 1910EQUW countpurge 1920 1930.ins 1940PHA \ insert char 1950PHP 1960CPX #3 \ right buffer id? 1970BEQ yes1 1980PLP 1990PLA 2000JMP (oldins) \ no - exit 2010.yes1 2020PLP \ tidy stack 2030LDA ip_ptr \ save ip_ptr 2040PHA 2050LDA ip_ptr+1 2060PHA 2070LDY #0 \ inc. ip_ptr 2080JSR inc_ptr 2090JSR compare \ compare input and output pointers 2100BEQ insfail \ same=failed 2110PLA:PLA \ remove ip_ptr 2120PLA \ get back character 2130STA (ip_ptr),Y \ store in buffer 2140CLC 2150RTS \ end 2160 2170.insfail \ insert failed so 2180PLA \ restore ip_ptr 2190STA ip_ptr+1 2200PLA 2210STA ip_ptr 2220SEC 2230RTS 2240 2250.rem 2260PHP 2270CPX #3 2280BEQ yes2 2290PLP 2300JMP (oldrem) 2310.yes2 2320PLP 2330BVS examine \ V=1 means examine, not remove 2340.remsr 2350JSR compare 2360BEQ empty 2370LDY #2 2380JSR inc_ptr \ increment ouput pointer 2390LDY #0 2400LDA (op_ptr),Y \ fetch byte 2410TAY 2420CLC \ return 2430RTS 2440.empty 2450SEC \ remove failed 2460RTS 2470 2480.examine 2490LDA op_ptr \ save output pointer 2500PHA 2510LDA op_ptr+1 2520PHA 2530JSR remsr \ remove character 2540PLA 2550STA op_ptr+1 2560PLA 2570STA op_ptr 2580TYA \ character in A 2590RTS 2600 2610.cnp 2620PHP 2630CPX #3 2640BEQ yes3 2650PLP 2660JMP (oldcnp) 2670.yes3 2680PLP 2690PHP 2700BVS purge 2710BCC len 2720LDA ip_ptr 2730PHA 2740LDA ip_ptr+1 2750PHA 2760LDA #0 2770STA workspace 2780TAX 2790TAY 2800.loop1 2810JSR inc_ptr 2820JSR compare 2830BEQ finished1 2840INX 2850BNE loop1 2860INC workspace 2870BNE loop1 2880.finished1 2890PLA 2900STA ip_ptr+1 2910PLA 2920STA ip_ptr 2930LDY workspace 2940PLP 2950RTS 2960 2970.len 2980LDA op_ptr 2990PHA 3000LDA op_ptr+1 3010PHA 3020LDX #0 3030STX workspace 3040LDY #2 3050.loop2 3060JSR compare 3070BEQ finished2 3080JSR inc_ptr 3090INX 3100BNE loop2 3110INC workspace 3120BNE loop2 3130.finished2 3140PLA 3150STA op_ptr+1 3160PLA 3170STA op_ptr 3180LDY workspace 3190PLP 3200RTS 3210 3220.purge 3230LDA #start_of_data MOD 256 3240STA ip_ptr 3250STA op_ptr 3260LDA #start_of_data DIV 256 3270STA ip_ptr+1 3280STA op_ptr+1 3290PLP 3300RTS 3310 3320.inc_ptr 3330LDA ptrblk,Y 3340CLC 3350ADC #1 3360STA ptrblk,Y 3370LDA ptrblk+1,Y 3380ADC #0 3390STA ptrblk+1,Y 3400CMP #end_of_data DIV 256 3410BNE home 3420LDA ptrblk,Y 3430CMP #end_of_data MOD 256 3440BNE home 3450LDA #start_of_data DIV 256 3460STA ptrblk+1,Y 3470LDA #start_of_data MOD 256 3480STA ptrblk,Y 3490.home 3500RTS 3510 3520.compare 3530LDA ip_ptr+1 3540CMP op_ptr+1 3550BNE return 3560LDA ip_ptr 3570CMP op_ptr 3580.return 3590RTS 3600 3610.start_of_data 3620 3630\ The buffered data goes here 3640 3650] 3660end_of_code=P%-&8000+start_of_code 3670NEXT pass 3680: