;********* Internal procedures from here down ********* ; Procedure grope LEND ; LEND = FP ; {SLAVE LEND} ; while Byte (LEND) <> cr do ; LEND = LEND + 1 ; end ; end NewLend ; procedure grope LEND Jsr SetLEND ; LEND = FP Jsr SlvLEND ; SLAVE LEND Loop2 ; while @LEND <> cr do LdyIM %0 LdaIY LEND CmpIM %13 Beq EXIT1 Jsr IncLEND ; LEND = LEND + 1 Jmp Loop2 ; end while Exit1 Rts ; end proc VLdown JSR TestVLIM VLDgrope JSR IncVLIM LDA FEND CMP VLIM BNE NOTFUCKED LDA FEND + %1 CMP VLIM + %1 BNE NOTFUCKED ;--- I Think we want the FINAL VERSION ;of BOTH READLINE and SLAVE to go here. DEC VLIM JMP FUCKED NOTFUCKED LDYIM %0 LDAIY VLIM CMPIM %13 BNE VLDgrope INC Vgap FUCKED LDA Vgap CMPIM YMax ;***IM ************** BEQ VBdown RTS VBdown LDYIM %0 LDAIY VBEG JSR IncVBEG ; Preserves A CMPIM %13 BNE VBdown DEC Vgap RTS VLup JSR DecVLIM LDYIM %0 LDAIY VLIM CMPIM %13 BNE VLup DEC Vgap RTS VBup JSR TestVBEG ; return if VBEG = FBEG JSR DecVBEG VBUrep JSR DecVBEG LDYIM %0 LDAIY VBEG CMPIM %13 BNE VBUrep VBUdone JSR IncVBEG INC Vgap LDA Vgap CMPIM YMax ;***IM ************** BEQ VLup RTS ; procedure grope LBEG ; LBEG = PP ; {SLAVE LBEG} ; repeat ; LBEG = LBEG - 1 ; until Byte (LBEG) = cr ; LBEG = LBEG + 1 ; end NewLBEG ; procedure grope LBEG Jsr SetLBEG ; LBEG = PP Jsr SlvLBEG ; SLAVE LBEG Loop1 ; repeat Jsr DecLBEG ; LBEG = LBEG - 1 LdyIM %0 ; until @LBEG = cr LdaIY LBEG CmpIM %13 Bne Loop1 Jmp IncLBEG ; LBEG = LBEG + 1 ;Rts ; Procedure SetFP ; FP = LEND ; end SetFP ; procedure SetFP Ldx LEND Ldy LEND + %1 Stx FP Sty FP + %1 Rts ; Procedure SetPP ; PP = LBEG ; end SetPP Ldx LBEG Ldy LBEG + %1 Stx PP Sty PP + %1 Rts ; procedure ToFP ; PP = PP - 1 ; FP = FP - 1 ; Byte (FP) = Byte (PP) ; end ToFP ; procedure ToFP Jsr DecPP ; PP = PP - 1 Jsr DecFP ; FP = FP - 1 Jsr LoadPP ; A = @PP Jmp StoreFP ; @FP = A ;Rts ; end ; procedure ToPP ; Byte (PP) = Byte (FP) ; PP = PP + 1 ; FP = FP + 1 ; end ToPP ; procedure ToPP Jsr LoadFP ; A = @FP Jsr StorePP ; @PP = A Jsr IncPP ; PP = PP + 1 Jmp IncFP ; FP = FP + 1 ;Rts ; end ; procedure LoadPP ; A = Byte (PP) ; end LoadPP LdyIM %0 LdaIY PP Rts ; procedure LoadFP ; A = Byte (FP) ; end LoadFP LdyIM %0 LdaIY FP Rts ; procedure StorePP ; Byte (PP) = A ; end StorePP LdyIM %0 StaIY PP Rts ; procedure StoreFP ; Byte (FP) = A ; end StoreFP LdyIM %0 StaIY FP Rts ; procedure IncPP ; PP = PP + 1 ; end IncPP Inc PP Bne Skip3 Inc PP + %1 Skip3 Rts ; procedure IncFP ; FP = FP + 1 ; end IncFP Inc FP Bne Skip4 Inc FP + %1 Skip4 Rts IncVBEG Inc VBEG Bne IVB1 Inc VBEG + %1 IVB1 RTS IncVLIM Inc VLIM Bne IVL1 Inc VLIM + %1 IVL1 RTS ; procedure DecPP ; PP = PP - 1 ; end DecPP Lda PP Bne Skip5 Dec PP + %1 Skip5 Dec PP Rts ; procedure DecFP ; FP = FP - 1 ; end DecFP Lda FP Bne Skip6 Dec FP + %1 Skip6 Dec FP Rts DecVBEG Lda VBEG Bne DVB1 Dec VBEG + %1 DVB1 Dec VBEG RTS DecVLIM Lda VLIM Bne DVL1 Dec VLIM + %1 DVL1 Dec VLIM RTS ; procedure TestLBEG ; if PP=LBEG then return two levels ; end TestLBEG Lda PP Cmp LBEG Bne Skip9 Lda PP + %1 Cmp LBEG + %1 Bne Skip9 Pla Pla Skip9 Rts ; procedure TestLEND ; if FP=LEND then return two levels ; end TestLEND Lda FP Cmp LEND Bne Skip10 Lda FP + %1 Cmp LEND + %1 Bne Skip10 Pla Pla Skip10 Rts ; procedure TestFBEG ; if LBEG = FBEG then return two levels ; end TestFBEG Lda LBEG Cmp FBEG Bne Skip12 Lda LBEG + %1 Cmp FBEG + %1 Bne Skip12 Pla Pla Skip12 Rts ; procedure TestFEND ; if LEND = FEND then return two levels ; end TestFEND Lda LEND Cmp FEND Bne Skip13 Lda LEND + %1 Cmp FEND + %1 Bne Skip13 Pla Pla Skip13 Rts TestVBEG Lda FBEG Cmp VBEG Bne TVB1 Lda FBEG + %1 Cmp VBEG + %1 Bne TVB1 Pla Pla TVB1 RTS TestVLIM Lda FEND Cmp VLIM Bne TVL1 Lda FEND + %1 Cmp VLIM + %1 Bne TVL1 Pla Pla TVL1 RTS ; procedure SetLBEG ; LBEG = PP ; end SetLBEG Ldx PP Ldy PP + %1 Stx LBEG Sty LBEG + %1 Rts ; procedure SetLEND ; LEND = FP ; end SetLEND Ldx FP Ldy FP + %1 Stx LEND Sty LEND + %1 Rts ; procedure IncLBEG ; LBEG = LBEG + 1 ; end IncLBEG Inc LBEG Bne Skip14 Inc LBEG + %1 Skip14 Rts ; procedure DecLBEG ; LBEG = LBEG - 1 ; { creep into unknown territory - so perform ; automatic swapping if necessary } ; {SLAVE LBEG} ; end DecLBEG Lda LBEG Bne Skip7 Dec LBEG + %1 Skip7 Dec LBEG Jmp SlvLBEG ;Rts ; procedure IncLEND ; LEND = LEND + 1 ; {SLAVE LEND} ; { Similar comment as for Dec LBEG } ; end IncLEND Inc LEND Bne Skip15 Inc LEND + %1 Skip15 Jmp SlvLEND ;Rts ; procedure DecLEND ; LEND = LEND - 1 ; end DecLEND Lda LEND Bne Skip8 Dec LEND + %1 Skip8 Dec LEND Rts ; procedure Slave LBEG ; return if LBEG<>SBEG ; return if SBEG=FBEG ; GetTop ; end SlvLBEG Rts ; procedure Slave LEND ; return if LEND <> SLIM ; return if SLIM=FEND ; GetBot ; end SlvLEND Rts ; NOTE THAT Gap >= BlockSize and that Blocksize is optimal at 256 ; procedure MakeSpace ; return if PP+Gap <= FP {if PP<>FP ???} { Gap is big enough } ; if SBEG+BlockSize < PP then PutTop { Plenty data at top to expel } ; else if FP+BlockSize < SLIM then PutBot { ... or at bottom } ; else ERROR "Available memory too small" { no?? - no room } ; { *** Should really expel from end farthest from cursor - ; I'll change it some day to avoid the pathological case ; of thrashing the top of the screen in and out when ; displaying a page } ; end MakSpace Rts ; procedure PutTop ; WriteTopBlock ; MoveUpTop ; end PutTop Rts ; procedure GetTop ; MoveDownTop ; ReadTopBlock ; end GetTop Rts ; procedure PutBot ; WriteBotBlock ; MoveDownBot ; end PutBot Rts ; procedure GetBot ; MoveUpBot ; ReadBotBlock ; end GetBot Rts ; procedure Initialise ; Byte (LOMEM) = cr ; LOMEM = LOMEM + 1 ; PP = LOMEM ; LBEG = PP ; FBEG = LBEG ; VBEG = LBEG ; SBEG = FBEG ; FP = PP + GAP { Guarantee the minimum gap } ; {HAVE TO THINK ABOUT THIS} ; FEND = FP ; LEND = FEND ; VLIM = LEND ; Byte (HIMEM) = cr ; SLIM = HIMEM ; end Init JSR PSTR = "Welcome to CO-ED V0.1" = %13,%10,%0 [ SYSTEM LDXIM $80 LDAIM $40 STA $0080 LDAIM $01 STA $0081 JSR OSFIND PHA ] [ BBC LDAIM %0 TAY JSR OSFIND ;Close all open files. LDXIM $40 LDYIM $01 TXA JSR OSFIND PHA LDAIM %132 JSR OSBYTE STX HIMEM STY HIMEM + %1 LDA HIMEM BNE T2 DEC HIMEM + %1 T2 DEC HIMEM ] PLA BNE WELCOME JSR PSTR = "CO-ED Fails - file not found." = %13,%10,%0 RTS WELCOME STA INFILE LDAIM $00 STA DPEND {Data Pending = true} LDAIM %1 STA ScrollOneShot ;Forced scroll = false LDAIM %0 STA Vgap [ BBC LDAIM %225 LDXIM %128 LDYIM %0 ; NORMAL - 128 to 143 JSR OSBYTE LDAIM %228 LDXIM %144 ; SHIFTED - 144 to 159 JSR OSBYTE LDAIM %227 LDXIM %160 ; CONTROL - 160 to 175 JSR OSBYTE LDAIM %4 LDXIM %2 ; CURSOR KEYS ARE SOFT JSR OSBYTE LDAIM %229 LDXIM %1 LDYIM %0 ; ESC BECOMES ASCII KEY JSR OSBYTE ] [ BBC LDAIM LOMEM STA PTR LDAIM LOMEM/ STA PTR + %1 ] [ SYSTEM LDAIM $00 STA PTR LDAIM $30 STA PTR + %1 ] LDYIM %0 LDAIM %13 STAIY PTR [ BBC INC PTR BNE T99 INC PTR + %1 T99 LDA PTR ] [ SYSTEM LDAIM $01 ] STA PP STA LBEG STA FBEG STA VBEG STA SBEG [ BBC LDA PTR + %1 ] [ SYSTEM LDAIM $30 ] STA PP + %1 STA LBEG + %1 STA FBEG + %1 STA VBEG + %1 STA SBEG + %1 [ BBC LDA HIMEM ] [ SYSTEM LDAIM $FF ] STA FP STA FEND STA LEND STA VLIM STA SLIM [ BBC LDA HIMEM + %1 ] [ SYSTEM LDAIM $BF ] STA FP + %1 STA FEND + %1 STA LEND + %1 STA VLIM + %1 STA SLIM + %1 LDAIM %13 LDYIM %0 STAIY FEND JSR RDLine JSR DecVLIM ;:::PAST EOF::: LDAIM YMax - %2 ;***** Change when it becomes dynamic... STA TEMP BLOOP LDA TEMP BEQ ENCORE LDX LEND LDY LEND + %1 STX VLIM STY VLIM + %1 JSR MovDown DEC TEMP JMP BLOOP ENCORE LDA TEMP CMPIM YMax ;***** Change when it becomes dynamic... BEQ INCORE JSR MovUp INC TEMP JMP ENCORE INCORE JSR MovUp JSR Left LDAIM %12 JSR OSWRCH JSR GETPAGE RTS PSYM LDA X CMPIM XMax+%1 ;*** IM *********** BCS PSNO LDA Y CMPIM YMax ;>>>FRIG -SHOULDN'T HAPPEN <<< BCS PSNO LDYIM %0 LDAIY CURRENT; GET OLD CHARACTER STA TEMP LDA Sym ; REPLACE WITH NEW ONE STAIY CURRENT INC CURRENT BNE NOCURRY INC CURRENT + %1 NOCURRY LDA Sym CMP TEMP ; COMPARE THEM BEQ PSNO ; AND PRINT IF DIFFERS... LDAIM %31 JSR OSWRCH LDA X JSR OSWRCH LDA Y JSR OSWRCH LDA Sym JSR OSWRCH PSNO RTS ; {On startup, set page image to all spaces; this means ; DisplayPage can be used straight to display the initial ; page} ; procedure DisplayPage DispPage ; while VBEG < SLIM do MoveDownTop ;! Assumed ; PTR = VBEG {Slaved I hope. Must fix later...} LDX VBEG STX PTR LDY VBEG + %1 STY PTR + %1 ; Y = YMin { = 0 unless this editor changes a lot} LDAIM YMin ;***IM ************ STA Y LDAIM XMin ;***IM************ STA X ;@@@ INIT CURRENT TO START OF PAGE @@@ LDA PAGE STA CURRENT LDA PAGE + %1 STA CURRENT + %1 ; X = XMin { ditto } ; repeat DiREP ; PTR = FP if PTR = PP LDA PP CMP PTR BNE RR4 LDA PP + %1 CMP PTR + %1 BNE RR4 LDX FP STX PTR LDY FP + %1 STY PTR + %1 LDX X ; Note cursor pos... STX XX LDY Y STY YY RR4 ; {Also note X and Y and use to set cursor!!} ; exit if PTR = VLIM ; {SLAVE PTR???} LDA VLIM CMP PTR BNE YY1 LDA VLIM + %1 CMP PTR + %1 BNE YY1 JMP DiEXIT YY1 LDYIM %0 LDAIY PTR CMPIM %13 BNE YY2 ;PAD LINE WITH SPACES LDAIM %32 STA Sym PADLOOP LDA X CMPIM XMax + %1 ;***TESTING BCS FOR BCC*** BCS PADDONE ; until col. XMAX JSR PSYM; PSYM stops after XMax anyway INC X ; so a few extra won't hurt. JMP PADLOOP PADDONE JSR PSYM ; for luck LDA Y CMPIM YMax BEQ NoBLOB ; OH GOD NOT AGAIN. INC Y ; THIS SCHEME MAY CAUSE TROUBLE WITH LONG LINES AND SIDEWAYS SCROLL.... LDAIM %0 STA X JMP DiEND YY2 STA Sym JSR PSYM INC X ; if Byte (PTR) = cr then begin ; WipeLine {using global X, Y} ; SetCursor and return if Y = YMax ; Y = Y + 1 ; X = 0 ; end ; else begin ; PSym (Byte (PTR)) {using global X, Y} ; { Psym draws the character if it is different from ; the one below and stores its character in the page ; image ready for the next update. It also knows ; about XMax and doesn't draw off the screen. ; When we implement (IF...) sideways scroll (for P.B.) ; PSym will do the work of adding the offset - thus ; making it transparent to the rest of the editor ; (Except of course the input routine...) } ; X = X + 1 ; end DiEND INC PTR BNE UU1 INC PTR + %1 UU1 JMP DiREP DiEXIT LDAIM %255 ;BLOB CHARACTER {defined elsewhere} STA Sym JSR PSYM NoBLOB LDAIM %32 STA Sym INC X SHITLOOP POOP2 LDA X CMPIM XMax + %1 BCC PAD2 JSR PSYM INC X JMP POOP2 PAD2 JSR PSYM; kill this when sober... LDAIM %0 STA X LDA Y CMPIM YMax ; I can't stand any more of these... BEQ SCursor INC Y JMP SHITLOOP SCursor LDAIM %31 JSR OSWRCH LDA XX JSR OSWRCH LDA YY JSR OSWRCH RTS ; until false ; { End of file. } ; Put (BLODGE) {at last X, Y set after drawing last character} ; repeat ; WipeLine ; X = 0 ; return if Y = YMax ; Y = Y + 1 ; until false ; SetCursor ; end [ FALSE DispPage LDAIM %30 JSR OSWRCH LDX FBEG STX PTR LDY FBEG + %1 STY PTR + %1 DiREP LDA PP CMP PTR BNE SS4 LDA PP + %1 CMP PTR + %1 BNE SS4 LDX FP STX PTR LDY FP + %1 STY PTR + %1 LDAIM '^ JSR OSWRCH SS4 LDYIM $0 LDAIY PTR CMPIM %13 BNE SS6 JSR OSWRCH LDAIM %10 SS6 JSR OSWRCH LDA PTR CMP FEND BNE SS9 LDA PTR + %1 CMP FEND + %1 BNE SS9 RTS SS9 INC PTR BNE SS11 INC PTR + %1 SS11 JMP DiREP Rts ] ; procedure WriteTopBlock ; {Expel bytes from SBEG onwards to file #1} ; end WrTopBlock Rts ; procedure WriteBotBlock ; {Expel bytes from SLIM backwards to file #2} ; end WrBotBlock Rts ; procedure MoveUpTop ; {Move up data from SBEG+256 to SBEG, ; and adjust pointers appropriately} ; end MvUpTop Rts ; procedure MoveDownBot ; {Move down data from SLIM-257 to SLIM-1??, ; similarly adjusting respective pointers} ; {I.e. FBEG, VBEG, LBEG, PP} ; end MvDnBot Rts ; procedure MoveDownTop ; {Reverse of MoveUpTop, except that may need ; to push down bottom too, to make space...} ; {I.e. FP, LEND, VLIM, FEND} ; end MvDnTop Rts ; procedure MoveUpBot ; {Likewise and also...} ; end MvUpBot Rts ;*************** SERVICE ROUTINES **************** ; Print STRing following JSR PSTR instruction, ; terminated by a NULL in data. PSTR PLA STA RETN PLA STA RETN + %1 LDYIM %0 LP1 JSR INCRETN LDAIY RETN BEQ DONE JSR OSWRCH JMP LP1 DONE JSR INCRETN JMI RETN INCRETN INC RETN BNE SKIP INC RETN + %1 SKIP RTS PHEX TYA JSR OUTHEX TXA OUTHEX PHA LSRA LSRA LSRA LSRA JSR OUTNIB PLA ANDIM $F OUTNIB CMPIM $A BCC NOADD ADCIM %6 NOADD ADCIM '0 JMP OSWRCH ; CLAIM FIXED SPACE FOR PAGE IMAGE ; (THE EASY WAY...) GETPAGE LDAIM IMAGE STA PAGE STA PTR LDAIM IMAGE/ STA PAGE + %1 STA PTR + %1 LDYIM %0 WIPELOOP LDAIM %32 STAIY PTR INC PTR BNE EEERRRTTT INC PTR + %1 EEERRRTTT LDA PTR CMPIM LOMEM BNE WIPELOOP LDA PTR + %1 CMPIM LOMEM/ BNE WIPELOOP RTS IMAGE = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " = " " LOMEM END ; OF CO-ED