10REM 102-column mode, using hardware configuration 20REM * command version 30REM Some monitors may need slight adjustment of the horizontal size for 40REM correct display using this program. 50REM (C) John Robinson 1989 60: 70DIM code &140 80origin=&BB0 90: 100characters=102 110lines=INT(&5000/(characters*8)) 120zp=&A8 130curMode=&355 140osbyte=&FFF4 150osargs=&FFDA 160gsinit=&FFC2 170oswrch=&FFEE 180wrchv=oswrch!1 AND &FFFF 190: 200FOR pass=4 TO 7 STEP 3 210P%=origin 220O%=code 230[OPT pass 240 250.newtable 260] 270FOR line=0 TO lines-1 280[OPT pass AND 6 290EQUB (line*characters*8) DIV 256 300EQUB (line*characters*8) MOD 256 310] 320NEXT line 330[OPT pass 340 350.table6845 360EQUB 1:EQUB characters 370EQUB 2:EQUB (characters DIV 2)+57 380EQUB 4:EQUB 34 390EQUB 6:EQUB lines 400EQUB 7:EQUB ((lines+1) DIV 2)+17 410EQUB 9:EQUB 8 420EQUB 0 430.table_4_6845 440EQUB 1:EQUB characters/2 450EQUB 2:EQUB ((characters DIV 2)+57) DIV 2 460EQUB 4:EQUB 34 470EQUB 6:EQUB lines 480EQUB 7:EQUB ((lines+1) DIV 2)+17 490EQUB 9:EQUB 8 500EQUB 0 510 520.goldv EQUB &4C 530.oldv EQUW 0 540 550.newmodeflag EQUB 0 560 570.newstart 580LDA #1 590LDX #zp 600LDY #0 610JSR osargs 620LDY zp+1 630LDX zp 640STY &F3 650STX &F2 660CLC 670LDY #0 680JSR gsinit 690BEQ no_bad_syntax 700BRK 710EQUB 254 720EQUS "Syntax: *Wide"+STR$characters 730EQUB 0 740.no_bad_syntax 750LDA #&90 760LDX #0 770LDY #1 780JSR osbyte 790LDY wrchv+1 800LDX wrchv 810STY oldv+1 820STX oldv 830LDY #newwrch DIV 256 840LDX #newwrch MOD 256 850STY wrchv+1 860STX wrchv 870LDA #22 880JSR oswrch 890LDA #0 900JSR oswrch 910RTS 920 930.newwrch 940PHA 950TXA 960PHA 970TYA 980PHA 990TSX 1000LDA &103,X 1010LDX newmodeflag 1020BEQ checknewmode 1030JSR goldv 1040LDX #0 1050STX newmodeflag 1060ORA #0 1070BEQ do_XtraWide 1080CMP #4 1090BNE exit 1100.do_XtraWide 1110JSR setUpXtraWide 1120.exit 1130PLA 1140TAY 1150PLA 1160TAX 1170PLA 1180RTS 1190.checknewmode 1200LDX &DA+&190 1210BNE execexit 1220CMP #22 1230BNE execexit 1240STA newmodeflag 1250.execexit 1260JSR goldv 1270JMP exit 1280 1290.setUpXtraWide 1300LDA curMode 1310BNE mode4table 1320TAX 1330BEQ redefine_6845 1340.mode4table 1350LDX #table_4_6845-table6845 1360.redefine_6845 1370LDA table6845,X 1380BEQ finished_6845 1390STA &FE00 1400INX 1410LDA table6845,X 1420STA &FE01 1430INX 1440BNE redefine_6845 1450.finished_6845 1460LDY #characters*8 DIV 256 1470LDX #characters*8 MOD 256 1480LDA curMode 1490BEQ noDiv2 1500TYA Mode 4; Lines are half as long, so we must divide new line 1510LSR A length by 2 1520TAY 1530TXA 1540ROR A 1550TAX 1560.noDiv2 1570STY &353 1580STX &352 1590STY &34D 1600STX &34C 1610LDA #0 1620STA &361 Not a graphics mode any more 1630LDA #lines-1 1640STA &309 1650LDA #characters-1 1660LDX curMode 1670BEQ nochangechars 1680LDA #(characters DIV 2)-1 1690.nochangechars 1700STA &30A 1710LDY #newtable DIV 256 1720LDX #newtable MOD 256 1730STY &E1 1740STX &E0 1750RTS 1760 1770] 1780NEXT pass 1790: 1800save$="*SAVE Wide"+STR$characters+" "+STR$~code+" "+STR$~O%+" "+STR$~(newstart OR &FFFF0000)+" "+STR$~(origin OR &FFFF0000) 1810PRINT save$;" ? (Y/N) "; 1820IF (GET OR &20)=ASC "y" THEN PRINT "Yes":OSCLI save$:PRINT "OK" ELSE PRINT "No" 1830: