; EDITOR PROGRAM.›; EDITS ONE SCREEN OF CHARACTERS.›; USES THE ATARI SCREEN EDITOR, E:.›; SAVES THE SCREEN FULL OF CHARACTERS›; BY USING THE FORCED READ MODE.›; BLANK LINES ARE NOT SAVED.›; THE SAVE AND LOAD COMMANDS›; CAN USE ANY VALID FILE SPEC.›››››CURLOC: MACRO CURSOR X,CURSOR Y› LDA #[%2]› STA ROWCRS› LDA #LOW [%1]› STA COLCRS› LDA #HIGH [%1]› STA COLCRS+1›ENDM››I/OMSG: MACRO BUFFER ADDRESS,IOCB #,COMMAND› LDX #[%2]*16› LDA #[%3]› STA ICCOM,X› LDA #LOW [%1]› STA ICBAL,X› LDA #HIGH [%1]› STA ICBAH,X› LDA #LOW $400› STA ICBLL,X› LDA #HIGH $400› STA ICBLH,X› JSR CIOV›ENDM››SCREEN = 0 ; USE IOCB 0 FOR SCREEN›EDITOR = SCREEN›REDSCR = 4 ; FOR FORCED READ SCREEN›DISK = 5 ; FOR DISK R/W›OPNLIN = 5 ; LINE # FOR OPEN MESSAGE›OPTLIN = 9 ; LINE # FOR OPTION SELECT›ININDX = INBUFF›CPINDX = $00CB›› ORG $4000›››START›› LDA #$9B› LDY #0›ERALOP› STA DATBUF,Y› STA DATBUF+$100,Y› STA DATBUF+$200,Y› STA DATBUF+$300,Y› INY› BNE ERALOP›› STY LENGTH› STY LENGTH+1›››››ININPT›› I/OMSG CLEARS,SCREEN,PUTREC› CURLOC 2,OPNLIN› I/OMSG OPENMS,SCREEN,PUTREC›› I/OMSG DATFIL,EDITOR,GETREC› LDY ICBLL,X ; LDY WITH BUFFER LENGHT LOW,LENGHT FROM FROM EDITOR WILL BE LESS THAN 121› LDA #' '› STA DATFIL-1,Y ; PUT SPACE AT END OF INPUT STRING,NEEDED FOR MATCH› LDA #$9B› STA DATFIL,Y ; PUT END OF LINE AT END+1 OF INPUT STRING› LDA #HIGH ININPT› STA RUNADD+1› LDA #LOW ININPT› STA RUNADD ; SET RUN ADDRESS TO INPUT STRING› LDA #HIGH DATFIL› STA ININDX+1› LDA #LOW DATFIL› STA ININDX ; STORE INPUT BUFFER ADDRESS AT INPUT INDEX› LDA #HIGH CPCOMM› STA CPREST+1› LDA #LOW CPCOMM› STA CPREST ; STORE COMMAND BUFFER ADDRESS AT COMMAND RESET ADDRESS. THIS LETS A COMMAND CHANGE BUFFERS›CPZERO› LDA CPREST+1› STA CPINDX+1› LDA CPREST› STA CPINDX ; STORE COMMAND RESET ADDRESS AT COMMAND INDEX› LDY #0›COMPAR› LDA (ININDX),Y› CMP (CPINDX),Y› BEQ ENDCPS ; BRANCH IF THEY MATCH› INY› CMP #$9B› BNE SPATEST› JMP (RUNADD)›SPATES› CMP #' '› BNE NEXTCP› INC ININDX ; IF A SPACE THEN IGNOR NON MATCH AND TEST NEXT CHARACTER› BNE YYZERO› INC ININDX›YYZERO› LDY #0› BEQ COMPAR›NEXTCP› LDA (CPINDX),Y› INY› CMP #$9B› BNE NEXTCP ; BRANCH IF NOT END OF COMMAND› INY› INY ; SKIP OVER COMMAND ADDRESS› LDA (CPINDX),Y› CMP #$9B› BNE NTCMND› I/OMSG COMMIS,EDITOR,PUTREC› JMP ININPT ; IF ERROR THEN GET ANOTHER INPUT STRING›NTCMND› TYA ; Y REGESTER NOW POINTS TO NEXT COMMAND STRING› LDY #0 ; ZERO Y TO POINT TO BEGINING OF INPUT AND COMMAND› CLC› ADC CPINDX› STA CPINDX› BCC COMPAR› INC CPINDX› BNE COMPAR ; ADD POINTER TO COMMAND INDEX AND BRANCH BACK TO TEST NEXT COMMAND STRING›ENDCPS› INY ; POINT TO NEXT INPUT CHARACTER› LDA (CPINDX),Y› CMP #$9B› BNE COMPAR ; IF NOT END OF COMMAND STRING THEN TEST NEXT CHARACTER›INTPDO› TYA› CLC› ADC ININDX› STA ININDX› BCC DOINTP› INC ININDX+1 ; ADD POINTER TO INPUT INDEX›DOINTP› CLC ; CLEAR CARRY,CARRY SET IS AN ERROR› JSR DOINTR ; DO COMMAND› BCC CPZERO› I/OMSG COMERR,EDITOR,PUTREC› JMP ININPT ; IF ERROR THEN RESTART›DOINTR› INY› INY› LDA (CPINDX),Y› PHA› DEY› LDA (CPINDX),Y› PHA› RTS›;›;›CPREST ; COMMAND RESET ADDRESS› DS 2›RUNADD ; JUMP ADDRESS OF PROGRAM› DS 2›DATFIL ; BUFFER FOR STORING COMMAND STRING.› DS 512›COMMIS› DB 'NO SUCH COMMAND',$9B›COMERR› DB 'COMMAND ERROR (INCORECT VALUE ?)',$9B›;›;› DS $0100-LOW *O›CPCOMM› DB 'EDIT ',$9B› DW EDIT-1› DB 'LOAD ',$9B› DW LOAD-1› DB 'SAVE ',$9B› DW SAVE-1› DB 'EXIT ',$9B› DW EXIT-1› DB $9B›;››››››››EDIT› I/OMSG EDITMS,SCREEN,PUTREC›› JSR FIVSEC›› LDX #REDSCR*16› LDA #OPEN› STA ICCOM,X› LDA #LOW SCRNAM› STA ICBAL,X› LDA #HIGH SCRNAM› STA ICBAH,X› LDA #OPNIN+1 ;OPEN INPUT FORCED READ› STA ICAX1,X› LDA #0› STA ICAX2,X› JSR CIOV››; DISPLAY DATBUF›› LDX #SCREEN*16› LDA #PUTCHR› STA ICCOM,X› LDA #LOW DATBUF› STA ICBAL,X› LDA #HIGH DATBUF› STA ICBAH,X›› SEC ; REMOVE TRAILING EOL, IF ANY› LDA LENGTH› SBC #1› STA ICBLL,X› LDA LENGTH+1› SBC #0› STA ICBLH,X›› BPL DISBUF› LDA #0 ; IF LENGHT WAS 0 MAKE IT 0› STA ICBLL,X› STA ICBLH,X››DISBUF› LDA #$7D ;CLEAR SCREEN,OUTPUT ONLY IF LENGTH=0› JSR CIOV››EDLIN› LDA #$9B› LDY #0›ERSLOP› STA DATBUF,Y› STA DATBUF+$100,Y› STA DATBUF+$200,Y› STA DATBUF+$300,Y› INY› BNE ERSLOP››; EDIT THE SCREEN››EDLINE› LDX #SCREEN*16› LDA #GETREC› STA ICCOM,X› LDA #LOW BUFEND› STA ICBAL,X› LDA #HIGH BUFEND› STA ICBAH,X› LDA #0› STA ICBLL,X› STA ICBLH,X› JSR CIOV› CPY #128 ; BREAK› BEQ RELINE› CPY #136 ; END OF FILE› BNE EDLINE››RELINE› CURLOC 2,0››; READ THE SCREEN›› I/OMSG DATBUF,REDSCR,GETREC› LDA #22› STA COUNT ;TWENTY THREE MORE STRINGS›REDLIN› LDA ICBLH,X› BNE INCADR› LDA ICBLL,X› CMP #2› BCC BUFLEN ; IGNORE NULL STRINGS›INCADR› CLC› LDA ICBAL,X› ADC ICBLL,X› STA ICBAL,X› LDA ICBAH,X› ADC ICBLH,X› STA ICBAH,X›BUFLEN› SEC› LDA #LOW [BUFEND]› SBC ICBAL,X› STA ICBLL,X› LDA #HIGH [BUFEND]› SBC ICBAH,X› STA ICBLH,X› JSR CIOV› DEC COUNT› BPL REDLIN››CLOSEF›› CLC› LDA ICBAL,X› ADC ICBLL,X› STA ICBAL,X› LDA ICBAH,X› ADC ICBLH,X› STA ICBAH,X›› SEC› LDA ICBAL,X› SBC #LOW [DATBUF]› STA LENGTH› LDA ICBAH,X› SBC #HIGH [DATBUF]› STA LENGTH+1›› LDA #CLOSE› STA ICCOM,X› JSR CIOV›› CLC› RTS›››››››››EXIT›› PLA› PLA ;PULL THIS RETURN ADDRES›› JMP (DOSVEC) ;RETURN TO DOS›››››››››SAVE› JSR GFNAME›› LDX #DISK*16›› LDA #OPEN› STA ICCOM,X› LDA #LOW DSKNAM› STA ICBAL,X› LDA #HIGH DSKNAM› STA ICBAH,X› LDA #OPNOT› STA ICAX1,X› LDA #0› STA ICAX2,X› JSR CIOV›› TYA› BPL FILWRT› PHA› LDA #CLOSE› STA ICCOM,X› JSR CIOV› PLA› CMP #165› BNE ERRIO› I/OMSG BADNAM,SCREEN,PUTREC› JSR FIVSEC› JMP SAVE››ERRIO› I/OMSG IOERR,SCREEN,PUTREC› JSR FIVSEC› CLC› RTS››FILWRT› LDX #DISK*16› LDA #PUTCHR› STA ICCOM,X› LDA #LOW DATBUF› STA ICBAL,X› LDA #HIGH DATBUF› STA ICBAH,X› LDA LENGTH› STA ICBLL,X› LDA LENGTH+1› STA ICBLH,X› LDA #'*' ;OUTPUT * IF LENGTH IS ZERO› JSR CIOV›CLOSWF› LDA #CLOSE› STA ICCOM,X› JSR CIOV› CLC› RTS››››››››LOAD›› JSR GFNAME›› LDX #DISK*16›› LDA #OPEN› STA ICCOM,X› LDA #LOW DSKNAM› STA ICBAL,X› LDA #HIGH DSKNAM› STA ICBAH,X› LDA #OPNIN› STA ICAX1,X› LDA #0› STA ICAX2,X› JSR CIOV›› TYA› BPL FILRED› PHA› LDA #CLOSE› STA ICCOM,X› JSR CIOV› PLA› CMP #165› BNE ERIO› I/OMSG BADNAM,SCREEN,PUTREC› JSR FIVSEC› JMP LOAD››ERIO› CMP #170› BNE EROIO› I/OMSG NOFIND,SCREEN,PUTREC› JSR FIVSEC› CLC› RTS››EROIO› I/OMSG IOERR,SCREEN,PUTREC› JSR FIVSEC› CLC› RTS››FILRED›› LDA #$9B› LDY #0›CLRLOP› STA DATBUF,Y› STA DATBUF+$100,Y› STA DATBUF+$200,Y› STA DATBUF+$300,Y› INY› BNE CLRLOP›› I/OMSG DATBUF,DISK,GETCHR› LDA ICBLL,X› STA LENGTH› LDA ICBLH,X› STA LENGTH+1›CLOSRF› LDA #CLOSE› STA ICCOM,X› JSR CIOV› CLC› RTS››GFNAME› I/OMSG DISKMS,SCREEN,PUTREC› LDA #GETREC› STA ICCOM,X› LDA #LOW DSKNAM› STA ICBAL,X› LDA #HIGH DSKNAM› STA ICBAH,X› LDA #16› STA ICBLL,X› LDA #0› STA ICBLH,X› JSR CIOV› RTS››FIVSEC› LDA #$FF› STA CH› LDA #LOW [5*60]› STA CDTMV3› LDA #HIGH [5*60]› STA CDTMV3+1› STA CDTMF3›WFIVE› LDA CH› CMP #$FF› BNE WDONE› LDA CDTMF3› BNE WFIVE›WDONE› LDA #$FF› STA CH› RTS››SCRNAM ; DEVICE NAME FOR SCREEN› DB 'E:',$9B›DSKNAM ; DEVICE NAME FOR I-O› DS 16›OPENMS› DB ' THE COMMANDS ARE: EDIT LOAD SAVE EXIT',$9B›EDITMS› DB $7D,' RETURN BY PRESSING BREAK CURSOR MUST NOT BE ON LAST LINE',$9B›DISKMS› DB $7D,' ENTER FILE NAME',$9B›NOFIND› DB $FD,$7D,' COULD NOT FIND DISK FILE',$9B›IOERR› DB $FD,$7D,'I-O ERROR',$9B›BADNAM› DB $FD,$7D,'INCORRECT FILE NAME',$9B›CLEARS› DB $7D,$9B›COUNT› DS 1›LENGTH› DS 2›DATBUF› DS $400›BU