; SCREDIT (C) 1984 RON HODGE›;›; ASSEMBLED ON MAC65› .OPT NO LIST› .OPT OBJ›;›;----------------------------›; PROGRAM EQUATES›;----------------------------›DLIST = $0600›PLBAS = $3000 PM BASE›PB0 = $3400 PLYR 0 BASE›HXTXT = $743C CHR UNDER CRSR›CHDIS = $742D›SCREEN = $6000 1ST SCRN BYTE›SCRSIZ = 5120 SCRN SIZE›CHRSET = $5400 CHR SET LOC›CHRSIZ = 512 CHR SET SIZE›;›;----------------------------›; ZERO PAGE EQUATES›;----------------------------›;›OPT = $80 MENU OPTION›STAT = $81 I/O ERR STATUS›XSAV = $82 TEMP X VALUE›MODFLG = $83 MENU/EDIT STATUS›SCBIT = $F0 SCROL BIT CTR›CHR = $F1 DISP CHAR›SCRN = $F2 PTR TO SCRN›SCRNH = $F3›SCRLO = $F4 SCRL BYTE CTR›SCRHI = $F5›PMLO = $F6 PTR TO PM0›PMHI = $F7›COL = $F8 CURSOR COLUMN›ROW = $F9 ROW›TEMP0 = $FA TEMP POINTER›TEMP1 = $FB›VOFF = $FC VRT OFFSET P0›HORP0 = $FD HPOSP0 SHADOW›SCFLG = $FE SCROL IF <>0›; POS = RITE SCROL›; NEG = LEFT SCROL›TXTCLR = $FF TXT WINDOW COLR›;›;----------------------------›; CONSTANTS›;----------------------------›;›RITPM = 200 RITEMOST P0 POS›LFTPM = 48 LEFT "›BOTPM = 191 BOT›TOPPM = 47 TOP›ROWM = 9 BOTTOM ROW›COLM = 19 RITE COLUMN›WIDTH = 255 CURSOR WIDTH›HITE = 16 HITE›START = 6 CONSOL VALUES›SELECT = 5›OPTION = 3›HOR = 8 HOR DISTANCE›RETURN = $0C›ESC = $1C›TAB = $2C›DEL = $34›INSERT = $37›CLR = $36›COLON = $3A›SPACE = $20›EOF = $88 END OF FILE›EOL = $9B END OF LINE›BUFLEN = 40›EDEV = $10 DEVICE NUM'S›SDEV = $20›KDEV = $30›DDEV = $40›;›;----------------------------›; SYSTEM EQUATES›;----------------------------›;›CH = $02FC KEY PRESSED›POKMSK = $10›IRQEN = $D20E›VDSLST = $0200›SIZEP0 = $D008›COLPF2 = $02C6›HSCROL = $D404›PMBASE = $D407›COLOR0 = $02C4 COL REG 0›COLOR1 = $02C5›COLOR4 = $02C8›SDLSTL = $0230 PTR TO DLIST›SDLSTH = $0231›CHBAS = $02F4 CHAR SET›SDMCTL = $022F SCRN CONTROL›DMACTL = $D400›GRACTL = $D01D GRAPH CONTROL›HPOSP0 = $D000›GPRIOR = $026F›STICK0 = $0278 J/STICK0›PCOLR0 = $02C0›CONSOL = $D01F›XITVBV = $E462›TRIG0 = $0284›CHBASE = $D409 CHAR SET ADR›WSYNC = $D40A›NMIEN = $D40E›ATACHR = $02FB›CRSINH = $02F0 CURS ON/OFF›COLCRS = $55 CURSOR COLUMN›ROWCRS = $54 ROW›TABMAP = $02A3 TAB SET POS'S›RAMTOP = 106›;›;----------------------------›; CIO ADDRESSES›;----------------------------›;›ICCOM = $0342 COMMAND ADDR›ICBAL = $0344 BUFF ADDR LO›ICBAH = $0345 BUFF ADDR HI›ICAX1 = $034A AUX BYTE 1›ICAX2 = $034B AUX BYTE 2›CIOV = $E456 CENTRAL I/O›ICBLL = $0348 BUF LENGTH LO›ICBLH = $0349 BUF LENGTH HI›;›;----------------------------›; CIOV COMMANDS›;----------------------------›;›OPEN = 3›CLOSE = 12›GETCHR = 7 GET CHARACTER›GETREC = 5 GET RECORD›PUTCHR = 11 PUT CHARACTER›PUTREC = 9 PUT RECORD›OPDIR = 6 OPEN DIRECTORY›WRITE = 8 AUX COMMAND›READ = 4 AUX COMMAND›;----------------------------›;› *= $4000›;------------------------------›; START OF SCREEN MENU ROUTINE›;------------------------------›MENU›;› JSR CLSALL CLOSE DEVICES› JSR MODE0 OPEN S: & E:› JSR OPNKBD OPEN KEYBOARD›A1› JSR CRSROFF› JSR SCRPRT PRINT MENU› JSR GETOPT GET OPTION› JSR DOOPT DO THE OPTION› LDA OPT› CMP #'5 EXIT OPTION ?› BCC A1 NOT IF <5› BNE A2 IT'S 6› JSR CLSALL CLOSE DEVICES› JMP INIT GO TO EDITOR›A2› JSR CLSALL› JSR DOS›; RETURN ONLY IF NO DOS ON DISK› JSR NODOS ANNOUNCE NO DOS› JMP MENU THEN START OVER›;------------------------------›; OPEN S:, E: AND K: DEVICES›;------------------------------›MODE0›; OPEN SCRN TO MODE 0› LDX #SDEV› LDA #OPEN› STA ICCOM,X› LDA # SCOLON› STA ICBAH,X› LDA #8 AUX COMMAND› STA ICAX1,X SET TO 'WRITE'› LDA #0 GR. MODE› STA ICAX2,X› JSR CIOV›OPENED›; OPEN THE E: DEVICE› LDX #EDEV› LDA #OPEN› STA ICCOM,X› LDA # ECOLON› STA ICBAH,X› LDA #12 AUX COMMAND› STA ICAX1,X› LDA #0› STA ICAX2,X› JSR CIOV›;› LDA #0 CHANGE COLORS› STA COLOR1› LDA #154› STA COLPF2› STA COLOR4› RTS ›OPNKBD› LDX #KDEV OPEN KEYBOARD› LDA #OPEN› STA ICCOM,X› LDA # KCOLON› STA ICBAH,X› LDA #4› STA ICAX1,X› LDA #0› STA ICAX2,X› JSR CIOV› SEI TURN OFF BRK KEY› LDA POKMSK› AND #$7F STRIP HI BIT› STA POKMSK› STA IRQEN› CLI › RTS ›;›;------------------------------›; PRINT THE MENU SCREEN›;------------------------------›SCRPRT› LDA #0 CLR 8 TAB POS'S› STA TABMAP› LDA #$40 TAB AT 10› STA TABMAP+1›PRTMSG› LDX #15›B1› LDY MSG,X HI ADDR› LDA MSG-1,X GET LO ADDR› STX XSAV SAVE X› JSR PRINT› LDX XSAV› DEX › DEX › BPL B1› RTS›PRINT›; ENTER WITH A=LSB OF MSG›; Y=MSB OF MSG› LDX #0› STA ICBAL,X› TYA › STA ICBAH,X› LDA #PUTREC› STA ICCOM,X› LDA #40 JUST TO BE SAFE› STA ICBLL,X› TXA › STA ICBLH,X› JSR CIOV› RTS ›;›;------------------------------›; GET THE OPTION FM K: DEVICE›;------------------------------›GETOPT› JSR POS2412 POSITION CRSR›GETKEY› LDA #GETCHR GET THE KEY› LDX #KDEV› LDY #1› JSR DOCIO›PRT1› LDA #$9B FORCE EOL AS 2ND› STA BUFF+1 CHAR IN BUFFER› LDA # BUFF IS PRINTED.› JSR PRINT PRINT SELECTION› JSR PRTBLK SKIP A LINE›;› LDA BUFF IS KEY OK ?› CMP #$20 IS IT SPACE ?› BEQ GETOPT› CMP #'1 KEY <1 ?› BCC PRTQUE YES, ASK KEY AGAIN› CMP #'6+1 KEY >6 ?› BCS PRTQUE› RTS ›PRTQUE›; PRINT QUESTION AGAIN AFTER›; WRONG KEY IS PRESSED› LDA #$FD BUZZER CHAR› STA BUFF› LDA # BUFF› JSR PRINT› JSR POS2412 PLACE CRSR› LDA #$20 SPACE› STA BUFF› JMP PRT1 CLR AND CONTINUE›;›;------------------------------›; PRINT THE DIRECTORY ON SCRN›;------------------------------›GETDIR› LDX #DDEV OPEN DIRECTORY› LDA #OPEN› STA ICCOM,X› LDA #OPDIR› STA ICAX1,X› LDA # DIRNAM› STA ICBAH,X› JSR CIOV›GET1› LDA #GETREC GET DIRECTORY› LDX #DDEV› LDY #40› JSR DOCIO› TYA › BPL PRTDIR› STY STAT SAVE STATUS› LDX #DDEV› JMP DEVOFF›PRTDIR›; PRINT DIRECTORY ONE FILE›; AT A TIME›;› LDX #SDEV› LDA # BUFF-5› STA ICBAH,X› LDA #PUTREC› STA ICCOM,X› LDA #40› JSR DOCIO2› JMP GET1›DOCIO›; THIS ROUTINE IS USED TO GET›; THE DISK DIR AND TO PRINT IT›; ENTER WITH X=DEVICE #›; A=COMMAND›; Y=BUFF LENGTH LSB› STA ICCOM,X› LDA # BUFF HI BYTE› STA ICBAH,X› TYA ›DOCIO2› STA ICBLL,X› LDA #0› STA ICBLH,X› JSR CIOV› RTS ›;›;------------------------------›; ROUTE THE OPTIONS›;------------------------------›;›DOOPT› LDA BUFF GET 1ST CHAR› STA OPT SAVE OPTION› CMP #'4 IS IT LOAD/SAVE?› BCC ASKNAM YES, IF <4› BNE C1 ELSE 5 IF NOT 4› JSR GETDIR GET DIRECTORY› JMP PRSKEY›C1› RTS RETURN W/OPT=5›ASKNAM› CMP #'2 SAVE OPTION ?› BNE D1 NO› LDA # SFNAM OF FILE TO SAVE› JSR PRINT› JMP GETNAM›D1› LDA # LFNAM› JSR PRINT›GETNAM› JSR PRTBLK› LDA #9 POSITION CRSR› STA COLCRS› JSR CRSRON TURN CRSR ON› LDA #GETREC› LDX #EDEV› LDY #15 GET 15 CHAR ONLY› JSR DOCIO› JSR CRSROFF TURN CRSR OFF› TYA › BPL E1› CPY #EOF EOF ERROR?› BEQ E1 YEP, SO IT'S OK› JMP ERROR PRINT ERROR MSG›E1› LDA BUFF› CMP #'D IF D 1/ST CHAR ?› BEQ E2› LDY #165 FILENAME ERROR› JMP ERROR›E2› LDA OPT IS IT CHAR OR› CMP #'3 SCRN FILE ?› BNE SCRFIL SCRN FILE IF <>3›;›;------------------------------›; GET CHAR SET›;------------------------------›;›CHRIO› LDX #DDEV› JSR DEVOFF› LDY #READ› JSR OPN› TYA › BPL GETSET› JMP ERROR›GETSET› LDA #GETCHR LOAD CHAR SET› LDX #DDEV› STA ICCOM,X› LDA # CHRSET› STA ICBAH,X› LDA # CHRSIZ› STA ICBLH,X› JSR DOSCRN2› LDY STAT› JMP ERRTST TEST FOR ERROR›;›;------------------------------›; LOAD OR SAVE SCREEN FILE›;------------------------------›;›SCRFIL› LDX #DDEV TURN OFF DISK› JSR DEVOFF› LDA OPT GET OPTION› CMP #'1 LOAD SCRN ?› BNE F1 NO› LDY #READ YES› BNE F2 ALWAYS›F1› LDY #WRITE›F2› JSR OPN OPEN DISK DRIVE› TYA › BPL SCRIO› JMP ERROR›SCRIO› LDA OPT› CMP #'1› BNE G1› LDA #GETCHR› BNE G2 ALWAYS›G1› LDA #PUTCHR›G2› JSR DOSCRN› STY STAT SAVE ERR STATUS›;›;------------------------------›; TEST FOR DISK I/O ERROR›; AND CONFIRM GOOD LOAD/SAVE›;------------------------------›;›ERRTST› TYA TEST FOR ERROR› BPL H2› JMP ERROR›H2› LDA OPT› CMP #'2 SAVE OR LOAD ?› BNE H3 LOAD IF #<> 2› LDA # SVOK› JSR PRINT› JMP PRSKEY›H3› LDA # LDOK› JSR PRINT VERIFY LOAD IS OK› JMP PRSKEY GET NEXT OPTION›ERROR›; THIS ROUTINE PRINTS THE›; ERROR CODES ON SCREEN.› LDX #2 CLR ERRR BUFFER› LDA #SPACE OF PREV ERRORS›I1› STA ERRR+11,X› DEX › BPL I1› JSR BIN2ASC CONVERT ERROR› LDA #$9B› LDY #12› STA ERRR,Y FORCE EOL› JSR PRTBLK› LDA # ERRR PRINT ERROR› JSR PRINT› JMP PRSKEY GET NEXT OPTION›OPN›; THIS ROUTINE OPENS THE DISK›; DRIVE FOR LOAD/SAVE OF SCRNS›; OR CHAR SETS.›; ENTER WITH Y = AUX (R OR W)› LDX #DDEV› LDA #OPEN› STA ICCOM,X› LDA # BUFF› STA ICBAH,X› TYA Y = READ OR› STA ICAX1,X WRITE AUX COMM.› LDA #0› STA ICAX2,X› JSR CIOV› STY STAT› RTS ›DOSCRN›; THIS ROUTINE LOADS OR SAVES›; THE SCRN.›; ENTER WITH ACC = PUTCHR OR›; = GETCHR› LDX #DDEV› STA ICCOM,X› LDA # SCREEN› STA ICBAH,X› LDA # SCRSIZ› STA ICBLH,X›DOSCRN2› JSR CIOV› STY STAT› JSR DEVOFF› RTS ›BIN2ASC›; THIS ROUTINE CONVERTS THE Y›; REGISTER ERROR INTO DECIMAL›; ASCI AND PUTS IT IN THE›; I/O BUFFER.›; ENTER WITH Y=ERROR #› STY STAT SAVE ERROR› TYA › LDY #9 ERRR BUFF INDEX› LDX #0›J1› CMP #100 LESS THAN 100 ?› BCC SAV100› SBC #100 COUNT THE 100'S› INX COUNT # OF 100'S› JMP J1›SAV100› JSR SAVERR CONVERT #› LDX #0›K1› CMP #10 COUNT THE 10'S› BCC SAV10› SBC #10 SUB TIL <10› INX › JMP K1›SAV10› JSR SAVERR CONVERT IT› CLC › ADC #$30 CONVERT 1'S› STA ERRR,Y PUT IN BUFFER› INY › RTS ›SAVERR› PHA › TXA GET # TO CONVERT› ADC #$30 CONVERT IT› STA ERRR,Y PUT IN BUFFER› INY › PLA RESTORE ACC› RTS DO TIL DONE›DEVOFF›; TURN OFF DEVICE›; ENTER WITH X=DEVICE #› LDA #CLOSE CLOSE COMMAND› STA ICCOM,X› JSR CIOV› RTS ›POS2412› LDA #24 POS 24,12› STA COLCRS› LDA #0› STA COLCRS+1› LDA #12› STA ROWCRS› RTS ›PRSKEY› JSR PRTBLK› LDA # PRES START KEY› JSR PRINT› LDA #6›L1› CMP CONSOL RETURN WHEN IT'S› BNE L1 PRESSED› RTS ›PRTBLK› LDA # BLNK› JSR PRINT› RTS ›CRSROFF› LDX #1 TURN CRSR OFF› STX CRSINH› RTS ›CRSRON› LDX #0 TURN CRSR ON› STX CRSINH› RTS ›CLSALL›; CLOSE ALL DEVICES EXC 0› LDX #EDEV› JSR DEVOFF› LDX #SDEV› JSR DEVOFF› LDX #KDEV› JSR DEVOFF› LDX #DDEV› JMP DEVOFF›DOS› JMP ($0A)› RTS ›NODOS›; ANNOUNCE NO DOS ON DISK› LDA # NONE› JSR PRINT› JMP PRSKEY›;›;------------------------------›; DEVICE NAMES›;------------------------------›ECOLON .BYTE "E:",EOL›SCOLON .BYTE "S:",EOL›KCOLON .BYTE "K:",EOL›DIRNAM .BYTE "D:*.*",0›;›;------------------------------›; MESSAGES›;------------------------------›CRIT› .BYTE 125,29,29,127,30,30,30,30› .BYTE "SCREDIT (C) 1984 RON HODGE",EOL›OPT1› .BYTE 29,29,127› .BYTE "1- LOAD SCREEN",EOL›OPT2› .BYTE 127,'2- SAVE SCREEN",EOL›OPT3› .BYTE 127,'3- LOAD CHAR SET",EOL›OPT4› .BYTE 127,'4- D1: DIRECTORY",EOL›OPT5› .BYTE 127,'5- EXIT TO EDITOR",EOL›OPT6› .BYTE 127,'6- EXIT TO DOS",EOL›QUES› .BYTE 29,127› .BYTE "WHICH OPTION ? ",EOL›SFNAM› .BYTE 29,127› .BYTE "NAME OF FILE TO ÓÁÖÅ ?",EOL›LFNAM› .BYTE 29,127› .BYTE "NAME OF FILE TO ÌÏÁÄ ?",EOL›LDOK› .BYTE 29,127› .BYTE "LOAD COMPLETED",EOL›SVOK› .BYTE 29,127› .BYTE "SAVE COMPLETED",EOL›PRES› .BYTE 127› .BYTE "PRESS ÓÔÁÒÔ TO CONTINUE",EOL›ERRR› .BYTE 127› .BYTE "ÅÒÒÏÒ: ",EOL›NONE› .BYTE 127› .BYTE "ÅÒÒÏÒ: NO DOS ON DISK",EOL›BLNK› .BYTE " ',EOL›MSG› .WORD QUES,OPT6,OPT5,OPT4,OPT3,OPT2,OPT1,CRIT›SPACES› .BYTE 32,32,32,32,32›BUFF› .BYTE 0,0,0,0,0,0,0,0,0,0› .BYTE 0,0,0,0,0,0,0,0,0,0› .BYTE 0,0,0,0,0,0,0,0,0,0› .BYTE 0,0,0,0,0,0,0,0,0,0›;›;------------------------------›; START OF SCREEN EDITOR›;------------------------------›;›INIT› LDY #15 INIT ZERO PAGE›AA1› LDA ZPAG,Y› STA $F0,Y› DEY › BPL AA1›COLOR› LDY #4›BB1› LDA HUES,Y› STA COLOR0,Y› DEY › BPL BB1› LDA # >CHRSET› STA CHBAS›CLRPM› LDA #0› LDY #$FF›CC1› STA PB0,Y› DEY › BNE CC1› STA SCBIT SET HSCROL REG› STA HSCROL› STA MODFLG 0 = IN EDIT MODE›COLPL› LDA #$5A› STA PCOLR0 PINK CURSOR›PMPOS› LDA #LFTPM› STA HPOSP0› STA HORP0› LDA #0› STA HPOSP0+1› STA HPOSP0+2› STA HPOSP0+3›SETPRI› LDA #1 ALL PLAYRS,THEN› STA GPRIOR THEN ALL PF's› LDA #0› STA SIZEP0 SET P0 DBL WIDTH› LDA #WIDTH› JSR DRWPM DRAW CURSOR›SETPMB› LDA # >PLBAS› STA PMBASE›ENBL› LDA #3› STA GRACTL ENABLE PM's›CLRWND› LDY #161 CLR TEXT WINDOW› LDA #0›DD1› STA $73FF,Y› DEY › BNE DD1›SETDISP› SEI TURN OFF INT› LDA #0 TURN OFF SCRN› STA SDMCTL› LDY #47›EE1› LDA SDLIST,Y› STA DLIST,Y› DEY › BPL EE1› LDA # DLIST› STA SDLSTH› LDA #62 SINGLE LINE DISP› STA SDMCTL› LDA # DLI› STA VDSLST+1› CLI ›VBLSET› LDY # VBLRTN› LDA #7 DEFERRED VBL› JSR $E45C› LDA #$C0 ENABLE DLI'S› STA NMIEN AND VERT BLANKS›;› JSR OPNKBD OPEN KEYBOARD› JMP MAIN›;›;------------------------------›; VERTICAL BLANK ROUTINE›;------------------------------›;›; VBL ROUTINE READS THE J/S›; AND SCROLLS THE SCREEN IF J/S›; IS MOVED. THE SCROLL FLAG›; (SCFLG) IS SET IF SCROLLING›; IS UNDERWAY, SO THE MAIN›; ROUTINE SIMPLY LOOPS WHILE›; SCREEN IS SCROLLING.›;›VBLRTN› LDA MODFLG EXIT IF IN› BNE FF2 MENU MODE› LDX SCFLG SCROLLING ?› BEQ FF1 NO› LDA $14 SLOW DOWN SCROL› AND #1 TO EVERY OTHER› BNE FF2 FRAME› JSR SCROL› JMP XITVBV›FF1› LDA TRIG0 IS TRIG PRESSED?› BEQ FF2 YES› JSR CHKJS READ J/S,ADJ SCFLG›FF2› JMP XITVBV END OF VBL !›;›;------------------------------›; MAIN ROUTINE›;------------------------------›;›MAIN› LDA $14 JIFFY ELAPSED ?›GG1› CMP $14› BEQ GG1 NO› LDA SCFLG SCROLLING ?› BNE MAIN YES;SO LOOP BACK›CHKTRG› LDA TRIG0 TRIGGER PUSHED ?› BNE CHEK NO, CHEK CONSOL› LDA STICK0› CMP #7 PUSHED RITE?› BNE HH1› JSR CRSRIT› JMP WAIT›HH1› CMP #11 LEFT ?› BNE HH2› JSR CRSLFT› JMP WAIT›HH2› CMP #14 UP ?› BNE HH3› JSR CRSUP› JMP WAIT›HH3› CMP #13 DOWN ?› BNE CHEK› JSR CRSDWN› JMP WAIT›CHEK› LDA CONSOL› CMP #OPTION OPTION PRESSED ?› BNE JJ1› JSR CHGPRI CHANGE PRIORITIES› JMP CLIK›JJ1› CMP #SELECT SELECT PRESSED ?› BNE JJ2› JSR SHWCHR SHOW CHAR› JSR SHWHEX SHOW HEX VALUE› JMP CLIK›JJ2› CMP #START START PRESSED ?› BNE CHEKEY› JSR FLIPCH FLIP CHAR SETS›CLIK› LDA #4› STA CONSOL CLIK› JMP WAIT WAIT1›CHEKEY› LDA CH GET KEY› CMP #$FF ANY PRESSED ?› BEQ KK4 NO›KK1› CMP #ESC ESCAPE KEY ?› BNE KK2 NO› JMP CHGMOD YEP,GOTO MENU›KK2› JSR CMPCHR PRINTABLE CHAR ?› BCS KK4 NOT IF CARRY SET› JSR TSTARW CRSR CHAR ?› BCS KK5 YES,IF CARRY SET› JSR GETCH ELSE GET CHAR› JSR CONVERT CHG ASCI TO DISP› JSR PUTCHAR AND PUT ONSCRN› JMP WAIT›KK4› JMP MAIN›KK5› LDA #$FF› STA CH› JMP CLIK›WAIT› LDA #$FF CLR THE KEYBOARD› STA CH› LDX #4 # OF JIFFIES›LL1› LDA $14 GET FRAME COUNT›LL2› CMP $14› BEQ LL2› DEX WAIT TIL 4 FRAMES› BNE LL1 HAVE ELAPSED› JMP MAIN THEN LOOP TO MAIN›;›;------------------------------›; PROCESS KEYBOARD›;------------------------------›;›GETCH›; THIS ROUTINE ACCEPTS INPUT›; FROM THE KEYBOARD› LDX #KDEV› LDA #0 BUFFER LENGTH=0› STA ICBLL,X SO CHAR RETURNS› STA ICBLH,X IN ACC› LDA #GETCHR› STA ICCOM,X› JSR CIOV› RTS ›CONVERT›; CONVERT ATASCI TO INTERNAL›; CODE. ENTER W/ATASCI IN ACC› TAY › ROL A› ROL A› ROL A› ROL A› AND #3› TAX › TYA › AND #$9F› ORA AT2INT,X› STA CHR SAVE INT CODE› RTS ›PUTCHAR› JSR SETMP› LDY #0› LDA CHR› STA (TEMP0),Y›;›;------------------------------›; MOVE CURSOR WITH/WRAP AROUND›;------------------------------›;›CRSRIT› LDY COL› CPY #COLM ON RITE COLUMN ?› BEQ MM1 IS IT = OR > ?› BCS MM1 YEP› INC COL NO, UPDATE COL› INC SCRN AND ADDR UNDER› BNE MM3 CURSOR› INC SCRN+1›MM3› LDA HORP0 MOVE CURSOR› CLC › ADC #HOR› STA HORP0› STA HPOSP0› RTS ›MM1› LDA #0› STA COL WRAP CURSOR› LDA #LFTPM PUT IN LEFTMOST› STA HORP0 POSITION› STA HPOSP0› LDA SCRN CHANGE SCRN PTR› SEC › SBC #19› STA SCRN› BCS MM2› LDA SCRN+1› SBC #0› STA SCRN+1›MM2› RTS ›CRSLFT› LDY COL ON LEFT COLUMN ?› BEQ NN1 YES› DEC COL NO, JUST DEC IT› LDA SCRN AND SCRN POINTER› BNE NN2› DEC SCRN+1›NN2› DEC SCRN› LDA HORP0 MOVE CURSOR› SEC › SBC #HOR› STA HORP0› STA HPOSP0› RTS ›NN1› LDA #19› STA COL WRAP AROUND CURSOR› CLC › ADC SCRN› STA SCRN› LDA SCRN+1› ADC #0› STA SCRN+1› LDA #RITPM› STA HORP0› STA HPOSP0› RTS ›CRSUP› LDY ROW ON TOP ROW ?› BEQ PP1 YES› DEC ROW NO› DEC SCRN+1 MOV UP 2 PAGES› DEC SCRN+1› LDA #0 ERASE CRSR› JSR ERPM› STY VOFF› LDA #WIDTH› JSR DRWPM› RTS ›PP1› LDA #ROWM› STA ROW WRAP AROUND CURSOR› LDA SCRN+1 CHANGE SCRN PTR› CLC › ADC #18› STA SCRN+1› LDA #0› JSR ERPM ERASE CRSR› LDY #BOTPM› STY VOFF› LDA #WIDTH› JSR DRWPM› RTS ›CRSDWN› LDY ROW ON BOTTOM ROW ?› CPY #ROWM› BEQ QQ1› BCS QQ1 YES› INC ROW NO› INC SCRN+1 MOV DWN 2 PAGES› INC SCRN+1› LDA #0› JSR ERPM› LDA VOFF› CLC › ADC #HITE› STA VOFF› LDA #WIDTH› JSR DRWPM› RTS ›QQ1› LDA #0› STA ROW WRAP AROUND CURSOR› LDA SCRN+1 CHANGE SCRN PTR› SEC › SBC #18 ROWS*2› STA SCRN+1› LDA #0› JSR ERPM ERASE CRSR› LDY #TOPPM› STY VOFF› LDA #WIDTH› JSR DRWPM› RTS ›;------------------------------›; READ JOYSTICK FOR SCROLLING›;------------------------------›CHKJS› LDA STICK0 GET J/S› CMP #7 PUSHED RITE ?› BNE RR1› JSR CHKLF CAN WE SCROL LFT ?› BCS RR2 NO› LDA #8› STA SCBIT› LDA #$80› STA SCFLG› RTS ›RR1› CMP #11 PUSHED LEFT ?› BNE RR2› JSR CHKRT CAN WE SCROL RIT ?› BCS RR2› LDA #0› STA SCBIT› LDA #20› STA SCFLG›RR2› RTS ›ERPM›DRWPM›; ENTER WITH ACC = 0 TO ERASE›; OR ACC = WIDTH TO DRAW CRSR› LDY VOFF› LDX #HITE›SS1› STA (PMLO),Y› DEY › DEX › BNE SS1› RTS ›;›;------------------------------›; FINE SCROLL A BYTE AT A TIME›;------------------------------›;›CHKLF› LDY SCRLO TEST FOR EAST MAX› CPY #225 IS LOBYTE >225 ?› BCC TT1 NO› LDA SCRHI YES;IS HYBYTE=0?› BNE TT2 NO; DON'T SCROL›TT1› INC SCRLO› BNE TT3› INC SCRHI›TT3› CLC › RTS ›TT2› SEC › RTS ›CHKRT› LDY SCRLO› CPY #6› BCC UU1 CHEK HI BYTE IF <6› DEC SCRLO› CLC › RTS ›UU1› LDX SCRHI› BEQ UU2 DON'T SCROL IF 0› DEC SCRLO ELSE DEC LO CTR› BPL UU3› DEC SCRHI›UU3› CLC › RTS ›UU2› SEC › RTS ›SCROL› TXA › BPL RITSC RITE SCROL›LFTSC› DEC SCBIT DEC SCROL BIT› BEQ LFTLP› LDA SCBIT› STA HSCROL› RTS ›LFTLP› LDX #28 PT TO HIEST LO LMS›V1› INC DLIST+3,X› BNE V2› INC DLIST+4,X ELSE INC HIBYT›V2› DEX DLI INS› DEX LMS HI› DEX LMS LO› BPL V1› LDA #0› STA SCFLG› INC SCRN UPDATE SCREEN› BNE V3› INC SCRN+1›V3› LDA #8› STA SCBIT› STA HSCROL› RTS ›RITSC› INC SCBIT› LDY SCBIT› CPY #8› BCS RITLP› LDA SCBIT› STA HSCROL› RTS ›RITLP› LDX #28›WW1› LDA DLIST+3,X RESET LO BY› BNE WW2› DEC DLIST+4,X DEC HIBYTE›WW2› DEC DLIST+3,X› DEX DLI› DEX LMS HI› DEX LMS LO› BPL WW1› LDA #0› STA SCFLG› LDA SCRN› BNE WW3› DEC SCRN+1›WW3› DEC SCRN› LDA #0› STA SCBIT› STA HSCROL› RTS ›;›;------------------------------›; MISC ROUTINES›;------------------------------›;›CHGPRI› LDA #1› CMP GPRIOR› BNE XX1› LDA #4› STA GPRIOR› RTS ›XX1› STA GPRIOR› RTS ›SHWHEX›; DISP CHAR UNDER CRSR IN HEX› LDY #0› LDA (TEMP0),Y› PHA › LSR A MOV LEFT NIB TO RITE› LSR A› LSR A› LSR A› JSR HEX› PLA › AND #$0F CONVERT LEFT NIBBLE›HEX› CLC › ADC #16› CMP #26› BCC YY1› CLC › ADC #7›YY1› STA HXTXT,Y› INY › RTS ›DLI›; THIS DISPLAY LIST INTERRUPT›; OCCURS JUST BEFORE THE FIRST›; TEXT WINDOW MODE LINE.› PHA › LDA #$E0 RESTORE CHAR SET› STA WSYNC› STA CHBASE› LDA TXTCLR TXT WINDOW COLOR› STA COLPF2 PUT IN HDWR REG.› PLA › RTI ›;›SETMP›; THIS COMPENSATES FOR SHIFT›; OF CHAR BY SCROL REG› LDA SCRN COPY PTR› STA TEMP0› LDA SCRN+1› STA TEMP1› LDA SCBIT› BEQ ZZ3 XIT IF NO ADJ NEC› LDA TEMP0 8, SO INC PTR› BNE ZZ2› DEC TEMP1›ZZ2› DEC TEMP0›ZZ3› RTS ›SHWCHR› JSR SETMP› LDY #0› LDA (TEMP0),Y› AND #63› STA CHDIS› RTS ›SDLIST› .BYTE $70,$70,$70 ; 3*8 BLNK LINES› .BYTE $57,$00,$60 ; 1 LINE GR.2› .BYTE $57,$00,$62 ; 2› .BYTE $57,$00,$64 ; 3› .BYTE $57,$00,$66 ; 4› .BYTE $57,$00,$68 ; 5› .BYTE $57,$00,$6A ; 6› .BYTE $57,$00,$6C ; 7› .BYTE $57,$00,$6E ; 8› .BYTE $57,$00,$70 ; 9› .BYTE $D7,$00,$72 ; 10 W/DLI› .BYTE $42,$00,$74 ; TEXT WINDOW› .BYTE $42,$28,$74› .BYTE $42,$50,$74› .BYTE $42,$78,$74› .BYTE $41 ; JVB› .WORD DLIST›HUES› .BYTE 40,202,148,70,0›ZPAG›; THIS TABLE LOADS ZERO PAGE›; VARIABLES› .BYTE 8 SCBIT SCROL BIT CTR› .BYTE $FF CHR DISP CHAR› .BYTE 2 SCRN PTR TO SCRN› .BYTE $60 SCRN+1› .BYTE 5 SCRLO SCRL BYTE CTR› .BYTE 0 SCRHI SCRL HI› .BYTE PB0 PMHI "› .BYTE 0 COL CURSOR COLUMN› .BYTE 0 ROW " ROW› .BYTE 0 TEMP0› .BYTE 0 TEMP1› .BYTE TOPPM VOFF VRT OFFSET P0› .BYTE LFTPM HPOSP0 SHADOW› .BYTE 0 SCFLG <>=SCROLLING› .BYTE 148 TXTCLR TXT WIN COLR›FLIPCH› LDA # >CHRSET› CMP CHBAS› BEQ A1A› STA CHBAS› RTS ›A1A› LDA #$E0› STA CHBAS› RTS ›CMPCHR› PHA › AND #$3F STRIP HI NIBBLE› LDY #5›BA1› CMP BADCH,Y› BEQ BA2› DEY › BPL BA1› PLA › CLC › RTS ›BA2› PLA › SEC PRINTABLE CHAR› RTS ›BADCH›; KEYS TO WEED OUT AND IGNORE› .BYTE RETURN,ESC,TAB,DEL,INSERT,CLR›TSTARW›; TEST FOR CONTROL ARROW CHAR› CMP #$8F RETURN W/CARRY› BNE TS1 SET IF CRSR MOVED› JSR CRSDWN› SEC › RTS ›TS1› CMP #$8E› BNE TS2› JSR CRSUP› SEC › RTS ›TS2› CMP #$86› BNE TS3› JSR CRSLFT› SEC › RTS ›TS3› CMP #$87› BNE TS4› JSR CRSRIT› SEC ›TS4› RTS ›CHGMOD›; THIS ROUTINE EXITS TO THE›; MENU.› LDA #$FF TURN OFF VBL› STA MODFLG› LDX #KDEV TURN OFF KEYBOARD› JSR DEVOFF› LDA #0› STA GRACTL TURN OFF PM'S› STA HPOSP0› LDA #34› STA SDMCTL› STA DMACTL› JMP MENU›AT2INT›; ATASCI TO INTERNAL CONVERSION› .BYTE $40,$00,$20,$60› .END›