10 OPEN 1,8,15,"S0:T-HELP!": CLOSE 1 11 OPEN 2,8,1,"0:T-HELP!" 12 SYS 700 13 .OPT O2 14 .BAS 15 REM THE TRANSACTOR HELP UTILITY 16 REM NICK SULLIVAN AND CHRIS ZAMARA 17 REM OCTOBER 1986 18 REM (C) 1986 THE TRANSACTOR 19 REM OKAY TO COPY, NOT TO SELL 20 : 21 REM DO NOT ALTER THE LENGTH OF ANY 22 REM LINE AFTER PROGRAM IS ASSEMBLED 23 : 24 A=00000: REM 5 DIGIT LINK BASE ADDR 25 SYS"INIT",A: CLR 26 GOTO 340 27 : 50 DATA "[199]ETTING [211]TARTED " 51 DATA "[208]RINTING [217]OUR [212]EXT " 52 DATA "[193]VOYDING [211]PELLING [197]RRORS " 53 DATA "[199]ETTING [198]INISHED " 54 DATA " " 55 DATA " [212]HE FIRST FOUR DATA " 56 DATA "LINES ABOVE ARE A SAMPLE " 57 DATA "MENU THAT WILL BE SHOWN " 58 DATA "WHEN HELP IS INVOKED. " 59 DATA " [213]P TO 20 MENU ITEMS MAY" 60 DATA "BE USED. [198]OR EACH ONE, " 61 DATA "THERE MUST BE A MATCHING " 62 DATA "FILE ON DISK, WITH A " 63 DATA "FILENAME OF THE FORM: " 64 DATA " HELP-? " 65 DATA "WHERE THE '?' REPRESENTS " 66 DATA "AN ALPHABETIC CHARACTER. " 67 DATA " [212]HE ABOVE MENU ITEMS " 68 DATA "REQUIRE FILENAMES HELP-A " 69 DATA "THROUGH HELP-D. " 70 : 100 SL=25+1: REM 25 CHARS PER MENU ITEM 110 S=PEEK(45)+256*PEEK(46)-20*SL-1 120 READ A$ 130 IF LEFT$(A$,1)=CHR$(32) GOTO 200 140 FOR I=1 TO SL-1 150 POKE S+I,ASC(MID$(A$,I)) 160 NEXT I 170 POKE S+I,0 180 N=N+1: S=S+SL: IF N<20 GOTO 120 190 : 200 A=122: GOSUB 330: Z=A 210 A=123: GOSUB 330: Z=Z+256*A+11 220 : 230 POKE Z+0, N 240 POKE Z+1,09 :REM BORDER 250 POKE Z+2,09 :REM BACKGROUND 260 POKE Z+3,00 :REM CURSOR 270 PRINT "DONE!": GOTO 340 280 : 290 REM SUBROUTINE CALCULATES ADDR OF 300 REM CHRGET PTR AT COLON IN LINE 330 310 REM (NO SPACES ALLOWED IN 330) 320 : 330 A=PEEK(A):RETURN 340 END 350 : 1000 CHROUT = $FFD2 ;KERNAL ADDRESSES 1010 CHKIN = $FFC6 1020 GETIN = $FFE4 1030 SETLFS = $FFBA 1040 SETNAM = $FFBD 1050 OPEN = $FFC0 1060 CLOSE = $FFC3 1070 CLRCHN = $FFCC 1080 SCNKEY = $FF9F 1090 ; 1100 SUB = 256 ;TEMP SUBRTNS BASE 1110 PROG = $DA00 ;PRG2 CODE START 1120 ; 1130 ;THE NEXT FOUR BYTES CAN BE SET 1140 ;FROM BASIC WITH RUN 100 1150 ; 1160 NUMTOP .BYTE 4 ;# OF HELP FILES 1170 BORD .BYTE 9 ;HELP BORD COLOUR 1180 BACK .BYTE 9 ;HELP BGND COLOUR 1190 CURS .BYTE 0 ;HELP TEXT COLOUR 1200 ; 1210 ; 1220 ESCAPE RTS 1230 ; 1240 INIT =* 1250 ;CALLED FROM BASIC ON RUN 1260 JSR $AEFD ;CHECK COMMA 1270 JSR $AD8A ;EVALUATE ADDRESS 1280 JSR $B7F7 ;CONV TO INTEGER 1290 LDX $0290 ;TEXT KEYLOG NOW 1300 CPX $E0 ; IN ROM 1310 BCC ESCAPE ; NO 1320 STX OUT1+2 ;SAVE OLD KEYLOG 1330 LDX $028F ; VECTOR 1340 STX OUT1+1 1350 TAX ;TEST VAR A = 0 1360 BNE IN2 ; NO 1370 ; 1380 IN1 SEC ;MAKE ROOM FOR TOP 1390 LDA $37 ; OF BASIC SUBRTNS 1400 SBC #END-START 1410 STA $37 1420 TAY 1430 LDA $38 1440 SBC #0 1450 STA $38 1460 ; 1470 IN2 STY NEWLOG ;INSTALL NEW 1480 STA NEWLOG+1 ; KEYLOG VECTOR 1490 STY $22 ;SET UP TO COPY 1500 STA $23 ; LINK CODE 1510 TAX ;SET UP JUMP TO 1520 TYA ; OLD KEYLOG-LINK 1530 CLC ; KEYLOG-LINK 1540 ADC #OUT-START 1550 STA OJMP 1560 BCC IN3 1570 INX 1580 ; 1590 IN3 STX OJMP+1 1600 LDY #END-(START+1) 1610 ; 1620 IN4 LDA START,Y ;COPY LINK CODE TO 1630 STA ($22),Y ; ITS NEW HOME 1640 DEY 1650 BPL IN4 1660 LDY #2 1670 ; 1680 IN8 LDA BORD,Y ;SET UP VIDEO 1690 STA HLPVID+15,Y ; PREFERENCES 1700 DEY 1710 BPL IN8 1720 LDA NUMTOP ;SAVE # OF HELP 1730 STA NTSAVE ; FILES AVAILABLE 1740 SEI ;CONFIG 100% RAM 1750 LDA #$34 ; (NO I/O, ROMS) 1760 STA 1 1770 LDA #END ; TO $DA00 RAM 1790 STA $22 1800 STY $23 1810 LDA #PROG 1830 STA $24 1840 STY $25 1850 LDY #0 1860 LDX #>$E0FF-PROG;# PAGES TO COPY 1870 ; 1880 IN9 LDA ($22),Y 1890 STA ($24),Y 1900 INY 1910 BNE IN9 1920 INC $23 1930 INC $25 1940 DEX 1950 BNE IN9 1960 JSR END ;VECSET IN LOW RAM 1970 LDA #$37 ;CONFIG FOR BASIC 1980 STA 1 1990 CLI 2000 LDA $37 ;DECREMENT TOP 2010 BNE IN10 ; OF BASIC DUE TO 2020 DEC $38 ; BASIC VAL() BUG 2030 ; 2040 IN10 DEC $37 2050 RTS 2060 ; 2070 ; 2080 ;THE NEXT 2 ROUTINES ARE STORED IN 2090 ;'NORMAL' RAM, EITHER AT THE TOP 2100 ;OF BASIC, OR AT AN ADDRESS 2110 ;SPECIFIED BY THE USER 2120 ; 2130 ; 2140 START =* 2150 ;SWITCH OUT ROM, DO NEW KEYSCAN 2160 SEI 2170 LDA 1 2180 PHA 2190 LDA #$34 2200 STA 1 2210 JMP SCAN 2220 ; 2230 ; 2240 OUT =* 2250 ;RESTORE ROMS, DO ROM KEYSCAN 2260 PLA 2270 STA 1 2280 OUT1 JMP $FFFF 2290 ; 2300 END =* 2310 ; 2320 ; 2330 ;VECSET AND HLPVID ARE NEEDED BY 2340 ;BOTH INIT CODE AND HELP CODE 2350 ; 2360 ; 2370 VECSET =* 2380 ;SAVE OLD VECTOR, INSTALL NEW ONE 2390 LDA $028F 2400 LDY $0290 2410 STA PROG+(OLDLOG-VECSET) 2420 STY PROG+(OLDLOG+1-VECSET) 2430 LDA PROG+(NEWLOG-VECSET) 2440 LDY PROG+(NEWLOG+1-VECSET) 2450 ; 2460 VCS1 STA $028F 2470 STY $0290 2480 RTS 2490 ; 2500 ; 2510 ;THE FOLLOWING TABLE WILL BE POKED 2520 ;INTO VIDEO CHIP ON ENTERING HELP 2530 ; 2540 ; 2550 HLPVID =* 2560 .BYTE $1B,$0A,$AA,$65,$00,$C8 2570 .BYTE $00,$17,$79,$F0,$00,$00 2580 .BYTE $00,$00,$00,$F9,$F9 2590 ; 2600 ; 2610 ;THE VARIABLES IN THE FOLLOWING 2620 ;TABLE ARE DEFINED BELOW 2630 ; 2640 ; 2650 HCURS .BYTE 0 2660 ; 2670 USRTXT .BYTE 0 2680 USRCOL .BYTE 0 2690 USRSCR .BYTE 0 2700 USRBNK .BYTE 0 2710 ; 2720 NTSAVE .BYTE 0 2730 ; 2740 OJMP .WORD 0 2750 ; 2760 OLDLOG .WORD 0 2770 NEWLOG .WORD 0 2780 ; 2790 *=*+2 2800 ; 2810 ; 2820 ;'SCAN' IS THE ADDRESS OF THE 2830 ;ACTUAL PROGRAM CODE IN D-BLOCK 2840 ;RAM, AS CALCULATED BY ASSEMBLER 2850 ; 2860 ; 2870 SCAN = PROG+(*-VECSET) 2880 ; 2890 ;END 1ST ASSEMBLY 2900 .END 2910 : 2920 : 2930 PRINT: REM COSMETIC NEWLINE 2940 : 2950 : 2960 REM THE OUTPUT FROM THE SECOND 2970 REM ASSEMBLY IS APPENDED TO THAT 2980 REM FROM THE FIRST 2990 : 3000 OPEN 2,8,2,"0:T-HELP!,P,A" 3010 : 3020 SYS 700 3030 *= $DA00 3040 .OPT O2 3050 ; 3060 CHROUT = $FFD2 ;KERNAL ADDRESSES 3070 CHKIN = $FFC6 3080 GETIN = $FFE4 3090 SETLFS = $FFBA 3100 SETNAM = $FFBD 3110 OPEN = $FFC0 3120 CLOSE = $FFC3 3130 CLRCHN = $FFCC 3140 SCNKEY = $FF9F 3150 ; 3160 SUB = $100 ;TEMP SUBRTNS BASE 3170 FLASH = $140 ;SCREENFLASH ADDR 3180 DESLEN = 25+1 ;# BYTES/DESC 3190 ; 3200 ;MOST OF THE ACTUAL DATA FOR THE 3210 ;FOLLOWING STORAGE AREA IS WRITTEN 3220 ;HERE BY THE FIRST PART OF THE 3230 ;PROGRAM. IT IS DUPLICATED HERE 3240 ;BECAUSE WE NEED TO TELL PAL ABOUT 3250 ;THE VARIOUS ADDRESSES 3260 ; 3270 VECSET *=*+18 ;VECTOR SWAP 3280 VCS1 *=*+7 ; ROUTINE 3290 HLPVID *=*+17 ;HELP VIDEO PREFS 3300 HCURS *=*+1 ;HELP CRSR COLOUR 3310 USRTXT *=*+1 ;TEXT COLOUR SAVE 3320 USRCOL *=*+1 ;COLOUR UNDER CRSR 3330 USRSCR *=*+1 ;SCREEN PAGE 3340 USRBNK *=*+1 ;16K VIDEO BANK 3350 NTSAVE *=*+1 ;# OF HELP FILES 3360 OJMP *=*+2 ;EXIT ROUTINE ADDR 3370 OLDLOG *=*+2 ;OLD KEYLOG ADDR 3380 NEWLOG *=*+2 ;NEW KEYLOG ADDR 3390 ; 3400 *=*+2 ;SKIP LOAD ADDRESS 3410 ; 3420 SCAN =* 3430 ;NEW KEYSCAN ROUTINE 3440 LDA $CB ;TEST LAST KEY 3450 CMP #$39 ; WAS LEFT ARROW 3460 BEQ SCA2 ; YES 3470 ; 3480 SCA1 JMP (OJMP) ;OLD KEYLOG LINK 3490 ; 3500 SCA2 LDX $028D ;TEST (SHIFT)CTRL 3510 CPX #4 3520 BCC SCA1 ; NO 3530 CPX #6 3540 BCS SCA1 ; NO 3550 LDA #$40 ;PUT 'NO KEY' IN 3560 STA $CB ; LAST KEY PRESSED 3570 LDA OLDLOG ;RESTORE VEC SO 2D 3580 LDY OLDLOG+1 ; PRESS WON'T BOMB 3590 JSR VCS1 3600 CPX #4 ;TEST UNSHIFTED 3610 BEQ SCA3 ; YES 3620 LDX #$30 ;LONG FLASH COUNT 3630 BNE SCA7 ;FLASH AND EXIT 3640 ; 3650 SCA3 LDX #$10 ;SHORT FLASH COUNT 3660 ; 3670 SCA4 LDA $98 ;TEST # OPEN FILES 3680 BEQ SCA5 ; ZERO - OK 3690 CMP #1 3700 BNE SCA6 ; > ONE - EXIT 3710 LDA $0259 ;CURRENT LF # 3720 JSR HASH ;GET UNIQUE LF # 3730 STA FILE 3740 LDA $026D ;CURRENT SECADD 3750 JSR HASH ;GET UNIQUE SECADD 3760 STA SECADD 3770 ; 3780 SCA5 JMP HELP 3790 ; 3800 SCA6 JSR VECSET ;INSTALL NEW K'LOG 3810 ; 3820 SCA7 LDY #ENDFLA;COPY FLASH ROUT'N 3830 ; 3840 SCA8 LDA FLA,Y 3850 STA FLASH,Y 3860 DEY 3870 BPL SCA8 3880 JSR FLASH ;DO FLASH 3890 JMP SCA1 ;EXIT HELP PGM 3900 ; 3910 ; 3920 HASH =* 3930 ;SELECT NON-CONFLICTING FILE OR SA 3940 AND #$7E ;CLEAR BITS 0, 7 3950 ORA #4 ;SET BIT 2 3960 EOR #2 ;CLEAR BIT 1 3970 RTS 3980 ; 3990 ; 4000 ;THIS ROUTINE IS COPIED TO THE 4010 ;STACK WHEN NEEDED, AND RUN THERE 4020 ; 4030 ; 4040 FLA =* 4050 ;FLASH SCREEN 4060 LDA #$37 ;SWITCH IN I/O ETC 4070 STA 1 4080 ; 4090 FLA1 CPX $D012 ;WAIT FOR RASTER 4100 BNE FLA1 4110 INC $D020 ;BUMP COLOURS 4120 INC $D021 4130 DEX ;TEST FINISHED 4140 BNE FLA1 ; NO - REFLASH 4150 LDA #$34 ; YES - EXIT 4160 STA 1 4170 RTS 4180 ; 4190 ENDFLA = *-(FLA+1) 4200 ; 4210 ; 4220 ;THE NEXT SUBROUTINES ARE COPIED 4230 ;FROM D-BLOCK RAM TO $100 EVERY 4240 ;TIME HELP IS USED 4250 ; 4260 ; 4270 SUBR =* 4280 ;COPY BYTE FROM RAM ADDR (SUBR+5) 4290 ;TO D-BLOCK RAM ADDR (SUBR+12) 4300 LDX #$37 ;ROMS IN 4310 STX 1 4320 LDA $FFFF ;ADDR SET ON CALL 4330 LDX #$34 ;ROMS OUT 4340 STX 1 4350 STA $FFFF ;ADDR SET ON CALL 4360 INC SUB+5 ;BUMP FETCH ADDR 4370 BNE SB1 4380 INC SUB+6 4390 ; 4400 SB1 INC SUB+12 ;BUMP STASH ADDR 4410 BNE SB2 4420 INC SUB+13 4430 ; 4440 SB2 RTS 4450 ; 4460 ; 4470 ZUBR =* 4480 ;COPY BYTE FROM D-BLOCK RAM ADDR 4490 ;(ZUBR+1) TO RAM ADDR (ZUBR+8) 4500 LDA $FFFF ;ADDR SET ON CALL 4510 LDX #$37 ;ROMS IN 4520 STX 1 4530 STA $FFFF ;ADDR SET ON CALL 4540 LDX #$34 ;ROMS OUT 4550 STX 1 4560 INC ZUB+1 ;BUMP FETCH ADDR 4570 BNE ZB1 4580 INC ZUB+2 4590 ; 4600 ZB1 INC ZUB+8 ;BUMP STASH ADDR 4610 BNE ZB2 4620 INC ZUB+9 4630 ; 4640 ZB2 RTS 4650 ; 4660 ;CALC ABSOLUTE ADDRESS OF ZUBR 4670 ZUB = SUB+ZUBR-SUBR 4680 ; 4690 ; 4700 OPN =* 4710 ;OPEN A HELP FILE (HELP-A, ETC) 4720 STA FILNAM+5 ;LAST FILNAM CHAR 4730 LDA FILE ;OPEN LF,8,SA... 4740 PHA 4750 LDY SECADD 4760 LDX #$37 4770 STX 1 4780 LDX #8 4790 JSR SETLFS 4800 LDX #FILNAM 4820 LDA #6 4830 JSR SETNAM 4840 JSR OPEN 4850 PLA 4860 TAX ;OPEN INPUT CHAN 4870 JSR CHKIN 4880 ; 4890 OF1 SEI ;(ROM DID CLI) 4900 LDX #$34 ;ROMS OUT 4910 STX 1 4920 RTS 4930 ; 4940 ;CALC ABSOLUTE ADDRESS OF OPN 4950 OPNFIL = SUB+OPN-SUBR 4960 ; 4970 ; 4980 ;HELP FILENAME - LAST CHAR VARIES 4990 FNAM .ASC "HELP-?" 5000 ; 5010 ;CALC ABSOLUTE ADDRESS OF FNAM 5020 FILNAM = SUB+FNAM-SUBR 5030 ; 5040 ; 5050 GET =* 5060 ;GET BYTE FROM HELP FILE 5070 LDX #$37 ;ROMS IN 5080 STX 1 5090 JSR GETIN ;GET THE BYTE 5100 CLC ;RELOCATABLE JMP 5110 BCC OF1 5120 ; 5130 ;CALC ABSOLUTE ADDRESS OF GET 5140 GETBYT = SUB+GET-SUBR 5150 ; 5160 ; 5170 CLS =* 5180 ;CLOSE HELP FILE 5190 LDA FILE 5200 PHA 5210 LDX #$37 ;ROMS IN 5220 STX 1 5230 JSR CLRCHN ;CLOSE THE FILE 5240 PLA 5250 JSR CLOSE 5260 CLC ;RELOCATABLE JMP 5270 BCC OF1 5280 ; 5290 ;CALC ABSOLUTE ADDRESS OF CLS 5300 CLSFIL = SUB+CLS-SUBR 5310 ; 5320 ; 5330 KEY =* 5340 ;GET ASCII BYTE, RETURN IN .A 5350 ;RETURN SHIFT KEY REGISTER IN .Y 5360 LDA #$37 ;ROMS IN 5370 STA 1 5380 JSR SCNKEY ;SCAN KYBD MATRIX 5390 LDY $CB ;GET KEYCODE 5400 LDA $EB81,Y ;CONV TO ASCII 5410 LDY $028D ;SHIFT KEY REGISTER 5420 ; 5430 KY1 CLC ;RELOCATABLE JMP 5440 BCC OF1 5450 ; 5460 ;CALC ABSOLUTE ADDRESS OF KEY 5470 KEYCHK = SUB+KEY-SUBR 5480 ; 5490 ; 5500 PUT =* 5510 ;PRINT A CHARACTER TO THE SCREEN 5520 LDX #$37 5530 STX 1 5540 JSR CHROUT 5550 CLC ;RELOCATABLE JMP 5560 BCC OF1 5570 ; 5580 ;CALC ABSOLUTE ADDRESS OF PUT 5590 PUTBYT = SUB+PUT-SUBR 5600 ; 5610 ; 5620 ;CALC # OF SUBROUTINE BYTES 5630 SUBSIZ = *-SUBR 5640 ; 5650 ; 5660 ;NEXT COMES THE ACTUAL CODE THAT 5670 ;EXECUTES IN D-BLOCK RAM. THE 5680 ;FIRST SECTION SWAPS OUT THE USER 5690 ;ENVIRONMENT, & INSTALLS A NEW ONE 5700 ; 5710 ; 5720 HELP =* 5730 ;THE HELP UTILITY MAINLINE 5740 LDA #0 ;COPY $0000-01FF 5750 LDY #$D0 ; TO $D000-D1FF 5760 LDX #2 5770 JSR COPY 5780 LDA #4 ;COPY $0400-07FF 5790 LDY #$D2 ; TO $D200-D5FF 5800 TAX 5810 JSR COPY 5820 TSX ;SAVE USER STK PTR 5830 STX STKSAV 5840 LDX #$FF ;PUT OUR STK PTR 5850 TXS ; FAR FROM SUBRTNS 5860 LDY #SUBSIZ ;COPY SUBROUTINES 5870 ; INTO STACK PAGE 5880 HE1 LDA SUBR,Y 5890 STA SUB,Y 5900 DEY 5910 CPY #$FF 5920 BNE HE1 5930 INY ;COPY COLOUR RAM 5940 STY SUB+5 ; ($D800-$DBFF) 5950 STY SUB+12 ; TO RAM BENEATH 5960 LDA #4 ; ($D600-$D9FF) 5970 STA 2 5980 LDX #$D8 5990 STX SUB+6 6000 LDX #$D6 6010 STX SUB+13 6020 ; 6030 HE2 JSR SUB 6040 DEY 6050 BNE HE2 6060 DEC 2 6070 BNE HE2 6080 LDA #<$D011 ;COPY VIDEO REGS 6090 LDY #>$D011 ; TO A SAVE BUFFER 6100 STA SUB+5 6110 STY SUB+6 6120 LDA #VIDBUF 6140 STA SUB+12 6150 STY SUB+13 6160 LDY #16 6170 STY $CC 6180 ; 6190 HE3 JSR SUB 6200 DEY 6210 BPL HE3 6220 LDA $0286 ;SAVE COLOUR OF 6230 LDY $0287 ; TEXT AND OF CHAR 6240 LDX $0288 ; UNDER CURSOR, 6250 STA USRTXT ; AND SCREEN PAGE 6260 STY USRCOL 6270 STX USRSCR 6280 LDA #4 6290 STA $0288 ;SCREEN AT PAGE 4 6300 LDA #<$DD00 ;SAVE USER'S VIDEO 6310 LDY #>$DD00 ; BANK NUMBER 6320 STA SUB+5 ; (THE HARD WAY) 6330 STY SUB+6 6340 STA ZUB+8 6350 STY ZUB+9 6360 LDA #USRBNK 6380 STA SUB+12 6390 STY SUB+13 6400 JSR SUB 6410 LDA USRBNK 6420 ORA #3 6430 JSR ZUB+3 6440 LDA #HLPVID ; PREFERENCES INTO 6460 STA ZUB+1 ; VIC CHIP 6470 STY ZUB+2 6480 LDA #<$D011 6490 LDY #>$D011 6500 STA ZUB+8 6510 STY ZUB+9 6520 LDY #16 6530 ; 6540 HE4 JSR ZUB 6550 DEY 6560 BPL HE4 6570 LDA HCURS ;OUR TEXT COLOUR 6580 STA $0286 6590 ; 6600 HE5 LDA #HLPTXT 6620 JSR PRSTR 6630 LDA #13 ;TWO RETURNS 6640 JSR PUTBYT 6650 JSR PUTBYT 6660 LDA #NAMES ; TOPIC STRINGS 6680 STA 3 6690 STY 4 6700 LDA #0 ;TOPIC # 6710 STA 2 6720 ; 6730 HE6 CLC ;CONV TOPIC # TO 6740 ADC #"A" ; CHAR AND PRINT 6750 JSR PUTBYT 6760 LDA #$20 ;PRINT SPACE 6770 JSR PUTBYT 6780 LDA 3 ;PRINT TOPIC STR 6790 LDY 4 6800 JSR PRSTR 6810 CLC 6820 LDA 3 ;CALC ADDRESS OF 6830 ADC #DESLEN ; NEXT STRING 6840 STA 3 6850 BCC HE7 6860 INC 4 6870 ; 6880 HE7 LDA #13 ;PRINT RETURN 6890 JSR PUTBYT 6900 INC 2 6910 LDA 2 6920 CMP NTSAVE ;TEST ALL PRINTED 6930 BNE HE6 ; NO 6940 ; 6950 HE8 JSR KEYCHK ;GET A CHARACTER 6960 CPY #2 ;TEST LOGO PRESSED 6970 BEQ HE9 ; YES 6980 TAX ;SAVE CHARACTER 6990 SEC ;CONV KEYPRESS TO 7000 SBC #"A" ; HELP TOPIC # 7010 BCC HE8 ; INVALID 7020 CMP NTSAVE 7030 BCS HE8 ; INVALID 7040 TXA ;RETRIEVE CHAR 7050 JSR PRTFIL ;PRINT THE FILE 7060 JMP HE5 ;REPRINT MENU 7070 ; 7080 HE9 LDA #VIDBUF ; VIDEO 7100 STA ZUB+1 7110 STY ZUB+2 7120 LDA #<$D011 7130 LDY #>$D011 7140 STA ZUB+8 7150 STY ZUB+9 7160 LDY #16 7170 ; 7180 HE10 JSR ZUB 7190 DEY 7200 BPL HE10 7210 INY ;COPY FROM D-RAM 7220 STY ZUB+1 ; ($D700-$DAFF) 7230 STY ZUB+8 ; TO COLOUR RAM 7240 LDX #$D6 ; ($D800-$DBFF) 7250 STX ZUB+2 7260 LDX #$D8 7270 STX ZUB+9 7280 LDA #4 7290 STA 2 7300 ; 7310 HE11 JSR ZUB 7320 DEY 7330 BNE HE11 7340 DEC 2 7350 BNE HE11 7360 LDA USRTXT 7370 LDY USRCOL 7380 LDX USRSCR 7390 STA $0286 7400 STY $0287 7410 STX $0288 7420 LDA #USRBNK 7440 STA ZUB+1 7450 STY ZUB+2 7460 LDA #<$DD00 7470 LDY #>$DD00 7480 STA ZUB+8 7490 STY ZUB+9 7500 JSR ZUB 7510 LDX STKSAV ;RESTORE STACK PTR 7520 TXS 7530 LDX #3 ;SAVE 4 0-PG BYTES 7540 ; 7550 HE11A LDA $D022,X 7560 STA $07F8,X 7570 DEX 7580 BPL HE11A 7590 LDA #$D0 ;RESTORE 3 PGS LOW 7600 STA $D023 ; RAM FROM $D000 7610 LDY #0 ; (DOUBLING VECS 7620 STY $D022 ; $22 - $25 IN 7630 STY $D024 ; D-RAM IMAGE) 7640 STY $D025 7650 LDX #2 7660 BNE XCOPY 7670 ; 7680 HE12 LDX #3 ;PUT ZP BYTES BACK 7690 HE14 LDA $07F8,X 7700 STA $22,X 7710 DEX 7720 BPL HE14 7730 LDY #4 ;RESTORE $400-$7FF 7740 LDA #$D2 ; FROM $D200-$D5FF 7750 LDX #4 7760 JSR COPY 7770 JSR VECSET ;SET UP OUR VECTOR 7780 HE15 JMP (OJMP) ;EXIT VIA ROM 7790 ; 7800 ; 7810 ;THE NEXT ROUTINE COPIES PAGES OF 7820 ;MEMORY. ENTER WITH SOURCE PAGE IN 7830 ;.A, TARGET PAGE IN .Y, # OF PAGES 7840 ;TO COPY IN .X. 'COPY' IS THE 7850 ;NORMAL VERSION; 'XCOPY' IS A 7860 ;KLUDGE TO AVOID USING THE STACK 7870 ;COPYING INTO PAGE 1 OF MEMORY. 7880 ; 7890 ; 7900 XCOPY =* 7910 ;COPY MEMORY, BRANCH BACK TO HE12 7920 SEC 7930 .BYTE $24 ;'BIT' (SKIP CLC) 7940 ; 7950 COPY =* 7960 ;COPY MEMORY, RETURN VIA RTS 7970 CLC 7980 STA $23 ;SOURCE HI 7990 STY $25 ;TARGET HI 8000 LDY #0 8010 STY $22 ;SOURCE LO 8020 STY $24 ;TARGET LO 8030 CP1 LDA ($22),Y 8040 STA ($24),Y 8050 INY 8060 BNE CP1 8070 INC $23 8080 INC $25 8090 DEX ;PAGE COUNTER 8100 BNE CP1 8110 BCS HE12 ;XCOPY ESCAPE 8120 RTS 8130 ; 8140 ; 8150 PRTFIL =* 8160 ;PRINT A HELP FILE 8170 JSR OPNFIL ;OPEN THE FILE 8180 ; 8190 PRT1 LDA #$93 ;CLEAR SCREEN 8200 JSR PUTBYT 8210 LDA #23 ;INIT LINE COUNT 8220 STA LINCNT 8230 ; 8240 PRT2 LDA #40 ;INIT COLUMN COUNT 8250 STA COLCNT 8260 ; 8270 PRT3 JSR GETBYT ;GET DISK BYTE 8280 JSR PUTBYT ;PRINT IT 8290 LDX $90 ;TEST STATUS 8300 BNE PRT6 ; EOF 8310 CMP #13 ;TEST CR 8320 BEQ PRT4 ; YES 8330 DEC COLCNT ;TEST END OF LINE 8340 BNE PRT3 ; NO 8350 ; 8360 PRT4 DEC LINCNT ;TEST END OF PAGE 8370 BNE PRT2 ; NO 8380 JSR SPCSTR ;'SPC TO CONTINUE' 8390 LDA #HT1 8410 JSR PRSTR 8420 ; 8430 PRT5 JSR KEYCHK ;GET A KEY 8440 CPY #2 ;TEST LOGO PRESSED 8450 BEQ PRT8 ; YES 8460 CMP #$20 ;TEST SPC PRESSED 8470 BNE PRT5 ; NO 8480 BEQ PRT1 ; YES 8490 ; 8500 PRT6 JSR SPCSTR ;'SPC TO CONTINUE' 8510 ; 8520 PRT7 JSR KEYCHK ;GET A KEY 8530 CMP #$20 ;TEST SPC PRESSED 8540 BNE PRT7 ; NO 8550 ; 8560 PRT8 JMP CLSFIL ;CLOSE AND EXIT 8570 ; 8580 ; 8590 SPCSTR =* 8600 ;PRINT 'PRESS SPACE TO CONTINUE' 8610 LDA #SPCTXT 8630 ; 8640 PRSTR =* 8650 ;PRINT STRING ADDRESSED IN .A/.Y 8660 STA $22 8670 STY $23 8680 LDY #0 8690 ; 8700 PRS1 LDA ($22),Y 8710 BEQ PRS2 8720 JSR PUTBYT ;PRINT CHARACTER 8730 INY 8740 BNE PRS1 8750 ; 8760 PRS2 RTS 8770 ; 8780 ; 8790 ;MESSAGES - NO ROOM FOR 8800 ;ANYTHING TOO FANCY HERE 8810 ; 8820 ; 8830 HLPTXT =* 8840 .BYTE 13,8,147 8850 .ASC "[200]ELP! [200]ELP!" 8860 .BYTE 13,13,18 8870 .ASC "[211]ELECT A TOPIC" 8880 ; 8890 ;NEXT MSG IS PART OF HLPTXT, BUT 8900 ;CAN ALSO BE ADDRESSED SEPARATELY 8910 ; 8920 HT1 =* 8930 .BYTE 18 8940 .ASC " ([204][207][199][207] KEY TO EXIT)" 8950 .BYTE 146,0 8960 ; 8970 SPCTXT =* 8980 .BYTE 13,18 8990 .ASC "[211][208][193][195][197] TO CONTINUE" 9000 .BYTE 146,0 9010 ; 9020 ; 9030 ;UNINITIALIZED DATA AREA 9040 ; 9050 ; 9060 STKSAV .BYTE 0 ;OLD STACK PTR 9070 LINCNT .BYTE 0 ;LINES PER PAGE 9080 COLCNT .BYTE 0 ;CHARS PER LINE 9090 FILE .BYTE 2 ;LOGICAL FILE # 9100 SECADD .BYTE 2 ;SECONDARY ADDRESS 9110 ; 9120 VIDBUF *=*+17 ;VIDEO SAVE AREA 9130 ; 9140 ; 9150 ;A WHOLE BUNCH OF EMPTY BYTES 9160 ;FOR THE HELP TOPIC STRINGS 9170 ; 9180 ; 9190 NAMES =* 9200 *= NAMES+(20*DESLEN)-1 9210 .BYTE 0 9220 ;