;> Screen
REDRAW AND R7,UPDATE,#ABORT ;seperate out the abortable bit
 BIC UPDATE,UPDATE,#ABORT
 LDRB R0,[ARGP,#OLDUPDATE]
 CMP UPDATE,R0
 MOVCC UPDATE,R0
 MOV R0,#NONE
 STRB R0,[ARGP,#OLDUPDATE]
 TEQ UPDATE,#BOTHSCREEN
 BEQ REDR1A
 TEQ UPDATE,#THELOT
 BNE REDR1
 LDRB R6,[ARGP,#TUTMODE]
 TEQ R6,#"0"
 TEQNE R6,#"3"
 BEQ REDR1A
 SWI WRITEI+26
 STMFD SP!,{R14}
 BL SELREV
 TEQ R6,#"T"
 BNE NOTREDRAWT
 BL VSTRNG
 = "Twin 'T' mode. Shift f5 to change mode. Twin is at &"
 = 0
 BL SETSTART
 MOV R8,R1
 BL WORDHX
 BL VSTRNG
 [ WIDTH=80
 = ". ",0
 |
 = ". You are using the wonderful ARTHUR 132 column mode. ",0
 ]
 B REDRAWTIME
NOTREDRAWT TEQ R6,#"D"
 BEQ BANNERD
 BL VSTRNG
 [ ARTHUR=1
 [ WIDTH=80
 = "c/s-f1c/s-f2c/s-f3c/s-f4c/s-f5c/s-f6c/s-f7c/s-f8c/s-f9c/s-f10"
 = "       Load viAppend         Pop    Push   Get   Auto   Task  Connect"
 = "        *path to file        Buffer Buffer Mail  TaskBotBottomto buff"
 = "ctl-f1ctl-f2ctl-f3ctl-f4ctl-f5ctl-f6ctl-f7ctl-f8ctl-f9ctl-f10"
 = "Expand Close   Next  Modula2 Enter Format  Send  Change Task  Toggle "
 = "Window Window  Line  Structs Char  Para    Mail  LFCR StatusWindow "
 = "shf-f1shf-f2shf-f3shf-f4shf-f5shf-f6shf-f7shf-f8shf-f9shf-f10"
 = "Insert/Insert Change Exit to Set    Clear Marked Marked Clear Display"
 = " Over   file  MarginsLanguag Mode   Marks Move   Delete text  NewLine"
 = "f1f2f3f4f5f6f7f8f9f10"
 = "Command Load   Save  Find & Global  Mark  Marked  Print Bytes  Goto  "
 = "line    file   file  ReplaceReplace Place Copy    text  free   line  "
 = ""
 |
 = "c/s-f1c/s-f2c/s-f3  c/s-f4c/s-f5c/s-f6c/s-f7  c/s-f8c/s-f9c/s-f10 "
 = "            Load via    Append                      Pop        Push       Get        Auto task    Task     Connect to  "
 = "             *path      to file                    Buffer     Buffer      Mail        Bottom     Bottom      buffer    "
 = "ctl-f1ctl-f2ctl-f3  ctl-f4ctl-f5ctl-f6ctl-f7  ctl-f8ctl-f9ctl-f10 "
 = "  Expand     Close     Next error     Modula2       Enter     Format      Send        Change     Task        Toggle    "
 = "  Window     Window       Line       Structures   Character  Paragraph    Mail        LFCR     Status      Window    "
 = "shift-f1shift-f2shift-f3  shift-f4shift-f5shift-f6shift-f7  shift-f8shift-f9shift-f10 "
 = " Insert or   Insert      Change        Exit to   Set screen    Clear     Marked       Marked     Clear       Display   "
 = " Overtype     file       Margins      Language      Mode       Marks      Move        Delete     text        NewLines  "
 = "f1f2f3  f4f5f6f7  f8f9f10 "
 = "  Command     Load        Save         Find &      Global      Mark      Marked        Print     Bytes      Goto line  "
 = "   line       file        file         Replace     Replace     Place      Copy         text      free        or mark   "
 = "     "
 ]
 |
 [ WIDTH=80
 = "c/s-f0c/s-f1c/s-f2c/s-f3c/s-f4c/s-f5c/s-f6c/s-f7c/s-f8c/s-f9"
 = "Connect       Load viAppend         Pop    Push   Get   Auto   Task  "
 = "to buff        *path to file        Buffer Buffer Mail  TaskBotBottom"
 = "ctl-f0ctl-f1ctl-f2ctl-f3ctl-f4ctl-f5ctl-f6ctl-f7ctl-f8ctl-f9"
 [ RELEASE=0
 = "Toggle Expand Close   Next  Modula2 Enter Format  Send  Change Task  "
 = "Window Window Window  Line  Structs Char  Para    Mail  LFCR Status"
 |
 = "Toggle Expand Close   Next          Enter Format  Send  Change Task  "
 = "Window Window Window  Line          Char  Para    Mail  LFCR Status"
 ]
 = "shf-f0shf-f1shf-f2shf-f3shf-f4shf-f5shf-f6shf-f7shf-f8shf-f9"
 = "DisplayInsert/Insert Change Exit to Set    Clear Marked Marked Clear "
 = "NewLine Over   file  MarginsLanguag Mode   Marks Move   Delete text  "
 = "f0f1f2f3f4f5f6f7f8f9"
 = " Goto  Command Load   Save  Find & Global  Mark  Marked  Print Bytes "
 = " line  line    file   file  ReplaceReplace Place Copy    text  free  "
 = ""
 |
 = "c/s-f0c/s-f1c/s-f2c/s-f3c/s-f4c/s-f5c/s-f6c/s-f7c/s-f8c/s-f9"
 = "   Connect                Load via     Append                    Pop        Push         Get       Auto        Task      "
 = "  to buffer                *path      to file                   Buffer      Buffer       Mail    Task Bottom  Bottom     "
 = "ctl-f0ctl-f1ctl-f2ctl-f3ctl-f4ctl-f5ctl-f6ctl-f7ctl-f8ctl-f9"
 [ RELEASE=0
 = "   Toggle      Expand      Close        Next      Modula-2      Enter      Format       Send       Change      Task      "
 = "   Window      Window      Window       Line     Structures   Character  Paragraph      Mail       LFCR      Status    "
 |
 = "   Toggle      Expand      Close        Next                    Enter      Format       Send       Change      Task      "
 = "   Window      Window      Window       Line                  Character  Paragraph      Mail       LFCR      Status    "
  ]
 = "shf-f0shf-f1shf-f2shf-f3shf-f4shf-f5shf-f6shf-f7shf-f8shf-f9"
 = "   Display     Insert/     Insert      Change      Exit to       Set        Clear      Marked      Marked       Clear    "
 = "   NewLine    Overtype      file       Margins    Language      Mode        Marks       Move       Delete       text     "
 = "f0f1f2f3f4f5f6f7f8f9"
 = "    Goto      Command       Load        Save      Find and     Global       Mark       Marked       Print       Bytes    "
 = "    line       line         file        file      Replace      Replace      Place       Copy        text        free     "
 = ""
 ]
 ]
 = 0
 BL SELFWD
 B REDR2
BANNERD BL VSTRNG
 [ ARTHUR=1
 [ WIDTH=80
 = "c/s-f1c/s-f2c/s-f3c/s-f4c/s-f5c/s-f6c/s-f7c/s-f8c/s-f9c/s-f10"
 = "       *pathldAppend         Pop    Push  GetMailAutoBotTskBotConnect"
 = "ctl-f1ctl-f2ctl-f3ctl-f4ctl-f5ctl-f6ctl-f7ctl-f8ctl-f9ctl-f10"
 = "Expand Close   Next  Struct  Char  Format  Mail  LFCR  Task Toggle "
 = "shf-f1shf-f2shf-f3shf-f4shf-f5shf-f6shf-f7shf-f8shf-f9shf-f10"
 = "Ins/OvrInsert MarginsExit to Mode  Clr Mrk Move  Delete Clr TxNewLine"
 = "f1f2f3f4f5f6f7f8f9f10"
 = "Command Load   Save   Find  Global  Mark   Copy   Print  Bytes Goto  "
 = ""
 |
 = "c/s-f1c/s-f2c/s-f3 c/s-f4c/s-f5c/s-f6c/s-f7 c/s-f8c/s-f9c/s-f10"
 = "            *path load   Append                   Pop buffer  Push buffer Get mail   Auto bottomTask bottom  Connect   "
 = "ctl-f1ctl-f2ctl-f3 ctl-f4ctl-f5ctl-f6ctl-f7 ctl-f8ctl-f9ctl-f10"
 = "Expand win  Close wind  Next line    Mod2 struct  Enter char  Format para Send mail    LFCR    Task stat  Toggle win "
 = "shift-f1shift-f2shift-f3 shift-f4shift-f5shift-f6shift-f7 shift-f8shift-f9shift-f10"
 = " Insrt/Ovr    Insert     Margins     Exit lang     Set Mode   Clear Marks Mark Move  Marked del Clear text   Newlines  "
 = "f1f2f3 f4f5f6f7 f8f9f10"
 = " *Command   Load file   Save file   Find/replace    Global    Mark place  Mark copy  Print text Bytes free   Goto line "
 = "  "
 ]
 |
 [ WIDTH = 80
 = "c/s-f0c/s-f1c/s-f2c/s-f3c/s-f4c/s-f5c/s-f6c/s-f7c/s-f8c/s-f9"
 = "Connect       *pathldAppend         Pop    Push  GetMailAutoBotTskBot"
 = "ctl-f0ctl-f1ctl-f2ctl-f3ctl-f4ctl-f5ctl-f6ctl-f7ctl-f8ctl-f9"
 [ RELEASE=0
 = "Toggle Expand Close   Next  Struct  Char  Format  Mail  LFCR Task  "
 |
 = "Toggle Expand Close   Next          Char  Format  Mail  LFCR Task  "
 ]
 = "shf-f0shf-f1shf-f2shf-f3shf-f4shf-f5shf-f6shf-f7shf-f8shf-f9"
 = "NewLineIns/OvrInsert MarginsExit to Mode  Clr Mrk Move  Delete Clr Tx"
 = "f0f1f2f3f4f5f6f7f8f9"
 = " Goto  Command Load   Save   Find  Global  Mark   Copy   Print Bytes "
 = ""
 |
 = "c/s-f0c/s-f1c/s-f2c/s-f3c/s-f4c/s-f5c/s-f6c/s-f7c/s-f8c/s-f9"
 = "Connect bffr             *path load Append file              Pop buffer Push buffer   Get mail  Auto bottom  Task bottom "
 = "ctl-f0ctl-f1ctl-f2ctl-f3ctl-f4ctl-f5ctl-f6ctl-f7ctl-f8ctl-f9"
 [ RELEASE=0
 = "Toggle wind Expand wind  Close wind  Next error  M2 structs  Enter char Format para  Send mail     LFCR    Task status "
 |
 = "Toggle wind Expand wind  Close wind  Next error              Enter char Format para  Send mail     LFCR    Task status "
  ]
 = "shf-f0shf-f1shf-f2shf-f3shf-f4shf-f5shf-f6shf-f7shf-f8shf-f9"
 = "  Newlines  Insert/over Insert file Change margn Exit lang    Set mode   Clear mark Marked move Marked delet Clear text  "
 = "f0f1f2f3f4f5f6f7f8f9"
 = " Goto line   * command   Load file   Save file  Find/replace   Global    Mark place Marked copy   Print out  Bytes free  "
 = ""
 ]
 ]
 = 0
 BL PATOUT
 = &FF,&C0,&FE,&06,&06,&06,&06,&06
 = &FF,&03,&7F,&60,&6F,&68,&69,&69
 = &00,&40,&40,&40,&C0,&00,&80,&80
 = &00,&00,&00,&01,&01,&00,&19,&31
 = &00,&00,&00,&80,&80,&00,&9B,&9C
 = &00,&00,&00,&00,&00,&00,&C0,&60
 BL VSTRNG
 = "Two Window Editor  1987 Acorn Computers. "
 [ TERM=CR
 = "CR ver"
 |
 = "      "
 ]
 = "  Shift: screen up   "
 [ WIDTH=132
 = "                                                    "
 ]
 = 0
 ALIGN
 BL PATOUT
 = &06,&06,&06,&07,&00,&03,&00,&00
 = &69,&69,&69,&E9,&08,&F8,&00,&00
 = &98,&BC,&E7,&C3,&00,&00,&00,&00
 = &61,&C1,&81,&01,&00,&00,&00,&00
 = &98,&98,&98,&98,&00,&00,&00,&00
 = &60,&60,&60,&60,&00,&00,&00,&00
 [ RELEASE=0
 SWI WRITEI+"a"
 SWI WRITEI+" "
 BL PATOUT
 = &3F,&61,&D1,&BF,&B0,&B9,&B6,&E2
 = &00,&80,&80,&3C,&47,&C6,&CE,&78
 = &00,&00,&1E,&33,&73,&3F,&03,&06
 = &00,&1E,&33,&3E,&F8,&0F,&00,&00
 = &01,&07,&0C,&38,&E0,&80,&00,&00
 = &C0,&60,&20,&00,&00,&00,&00,&00
 BL VSTRNG
 = "prog         "
 |
 BL VSTRNG
 = "       Version 1.00  "
 ]
;------------------------------< last - is end of date
 = "    Made on 26th March 1987    Control: text start"
 [ WIDTH=132
 = "    This new version of Twin works using the ARTHUR "
 ]
 = "TAB performs tabulation controlled by shift TAB.      Shift: word l/r  "
 [ WIDTH=132
 = "    MODEs 16 and 17 to give a 132 column display.   "
 ]
 = "Control TAB expands TABs in text.         "
 [ RELEASE=0
 [ STYLE=1
 = "          "
 |
 = "JGT style "
 ]
 |
 = "          "
 ]
 = "    Control: line l/r"
 [ WIDTH=132
 = "                                                    "
 ]
 = "COPY deletes the character above the cursor.          Shift:screen down"
 [ WIDTH=132
 = "    Twin's normal facilities are unchanged.         "
 ]
 = "Shift COPY for soft keys & cursor editing, ESCAPE out.    Control: text end  "
 [ WIDTH=132
 = "    This program will self destruct in 30000 hours. "
 ]
 = "Control COPY deletes the current line (to next RETURN)   "
 [ WIDTH=132
 = "                                                    "
 ]
 = 0
 ALIGN
REDRAWTIME BL SELFWD
 MOV R0,#1
 SUB R1,SP,#256
 SWI WORD
 STMFD SP!,{R8}
 LDR R8,[R1]
 LDRB R6,[R1,#4]
 BL PRINTTIME
 LDMFD SP!,{R8}
REDR2 LDMFD SP!,{R14}
REDR1A STMFD SP!,{R14}
 BL REDRMN ;redraw this window
 ADD R6,ARGP,#AREA0
 TEQ R6,AP
 ADDEQ R6,ARGP,#AREA1
 LDRB R14,[R6,#ONSCREEN]
 TEQ R14,#0
 BEQ DECWNP
 STMFD SP!,{AP}
 MOV AP,R6
 BL REDRMN ;then the other window
 LDMFD SP!,{AP}
 B DECWNP ;then get my window
;single window redraw from now on. Updates >= to fullscreen are fullscreen
REDR1 STMFD SP!,{R14}
 BL REDRMN
DECWNP LDMFD SP!,{R14}
DECWIN LDRB R0,[AP,#SLINE]
 TEQ R0,#0
 BNE DECWN1
 LDRB R0,[AP,#ELINE]
 LDRB R2,[ARGP,#MAXY]
 TEQ R0,R2
 SWIEQ WRITEI+26
 MOVEQ PC,R14
DECWN1 SWI WRITEI+28
 SWI WRITEI+0
 LDRB R0,[AP,#ELINE]
 SWI WRITEC
 SWI WRITEI+WIDTH-1
 LDRB R0,[AP,#SLINE]
 SWI WRITEC
 MOV PC,R14
REDRMN TEQ UPDATE,#NONE
 MOVEQ PC,R14
 STMFD SP!,{R14}
 BL ABORTQ
 LDMNEFD SP!,{PC}
 TEQ UPDATE,#HARDDN
 BEQ SCRLDN
 TEQ UPDATE,#HARDUP
 BEQ SCRLUP
 CMP UPDATE,#FULLSCREEN
 BCC REDR4 ;branch if mode doesn't require top of screen doing
 LDRB R0,[AP,#Y]
 BL LINEBK ;get R4 pointing at first char on screen
 LDRB R1,[AP,#Y]
 SUB R1,R1,R0
 STRB R1,[AP,#Y] ;adjust cursor a little!
 TEQ R1,#0
 BEQ REDR4 ;nothing at the top of the screen
 LDRB R6,[AP,#SLINE]
 ADD R5,R6,R1
 BL UPDTLN
 LDMNEFD SP!,{PC} ;aborted
REDR4 LDR R4,[AP,#GE]
 LDRB R6,[AP,#SLINE]
 LDRB R1,[AP,#Y]
 ADD R6,R6,R1
 LDRB R5,[AP,#ELINE]
 BL UPDTLN
 LDMFD SP!,{PC}
;scroll screen up by one line for cursor down
SCRLUP LDRB R5,[AP,#Y]
 BL DECSCL
 SWI WRITEI+31
 SWI WRITEI+0
 LDRB R0,[AP,#ELINE]
 LDRB R1,[AP,#SLINE]
 ADD R2,ARGP,#SCRIM
 ADD R14,R1,R2
 ADD R2,R0,R2
 SUB R0,R0,R1
 BNE SCLUP1 ;did declare window
 SWI WRITEC
 SWI WRITEI+10
SCLUP0 LDRB R1,[R14,#1]
 STRB R1,[R14],#1
 TEQ R14,R2
 BNE SCLUP0
 MOV R1,#0
 STRB R1,[R14]
 SUB R0,R0,R5
 SUB R0,R0,#1
 BL LINEFW
 LDRB R5,[AP,#ELINE]
 SUB R6,R5,#1
 TEQ R0,#0 ;can move all these lines forward?
 BEQ SCROLL
 MOV R2,#0
 MOV R0,R6
 BL WIPENOW
 LDMFD SP!,{R14}
 B STATUS
SCLUP1 SUB R0,R0,#1
 SWI WRITEC
 SWI WRITEI+10
 SUB R2,R2,#1
SCLUP3 LDRB R1,[R14,#1]
 STRB R1,[R14],#1
 TEQ R14,R2
 BNE SCLUP3
 MOV R1,#0
 STRB R1,[R14]
 SUB R0,R0,R5
 BL LINEFW
 LDRB R5,[AP,#ELINE]
 SUB R6,R5,#1
 TEQ R0,#0 ;can move all these lines forward?
 BEQ SCLUP2
 MOV R2,#0
 MOV R0,R6
 LDMFD SP!,{R14}
 B WIPENOW
SCLUP2 LDMFD SP!,{R14}
 B UPDTLN
;declare scroll area, EQ status if fullscreen
DECSCL LDRB R0,[AP,#SLINE]
 TEQ R0,#0
 BNE DECSL1
 LDRB R0,[AP,#ELINE]
 LDRB R2,[ARGP,#MAXY]
 TEQ R0,R2
 SWIEQ WRITEI+26
 MOVEQ PC,R14
DECSL1 SWI WRITEI+28
 SWI WRITEI+0
 LDRB R0,[AP,#ELINE]
 SUB R0,R0,#1
 SWI WRITEC
 SWI WRITEI+WIDTH-1
 LDRB R0,[AP,#SLINE]
 SWI WRITEC
 MOV PC,R14
;scroll screen down by one line for cursor up
SCRLDN LDRB R0,[AP,#Y]
 BL LINEBK ;guarenteed move back by Y lines
 BL DECSCL
 SWI WRITEI+30
 SWI WRITEI+11
 LDRB R6,[AP,#SLINE]
 ADD R5,R6,#1
 BNE SCLDN2 ;branch if window declared
 ADD R0,ARGP,#SCRIM
 ADD R1,R6,R0
 LDRB R2,[AP,#ELINE]
 ADD R2,R2,R0
SCRLD4 LDRB R0,[R2,#-1]
 STRB R0,[R2],#-1
 TEQ R2,R1
 BNE SCRLD4
 MOV R0,#0
 STRB R0,[R2]
SCROLL BL UPDTLN
 LDMFD SP!,{R14}
 B STATUS
SCLDN2 ADD R0,ARGP,#SCRIM
 ADD R1,R6,R0
 LDRB R2,[AP,#ELINE]
 ADD R2,R2,R0
 SUB R2,R2,#1
SCRLD5 LDRB R0,[R2,#-1]
 STRB R0,[R2],#-1
 TEQ R2,R1
 BNE SCRLD5
 MOV R0,#0
 STRB R0,[R2]
 B SCLUP2
;R4 -> first char to be output, R5 absolute screen line of end of print+1
;R6 absolute screen position of start, R7 abortable flag. R7 bit 31 also
;used to determine if fwd or rev currently selected
UPDTLN TST R7,#1
 MOVNE PC,R14 ;if aborted exit
 STMFD SP!,{R14}
 MOV R0,#0
 TEQ UPDATE,#TOCRLONG
 TEQNE UPDATE,#TOCRSHORT
 TEQNE UPDATE,#CSRONWARDS
 BNE UPDTL0
 LDRB R0,[AP,#X] ;get current X
 ADD R4,R4,R0
UPDTL0 SWI WRITEI+26
 SWI WRITEI+31
 SWI WRITEC
 MOV R2,R0
 MOV R0,R6
 SWI WRITEC
 SUB R3,R4,R2 ;start of output on this line
 B UPDTL1
UPDTL2 BL CHOUTOPT
 ADD R2,R2,#1
 CMP R2,#WIDTH
 BEQ UPDTL3
UPDTL1 LDRB R0,[R4],#1
 TEQ R0,#TERM
 BNE UPDTL2
 LDR R1,[AP,#END] ;check if end of world term
 CMP R4,R1
 BHI UPDTL4
 TEQ UPDATE,#TOCRSHORT
 TEQEQ R2,#WIDTH-1
 MOVEQ UPDATE,#CSRONWARDS ;if X=WIDTH-1 IF newline then alter tocrshort to csronward
 TEQ UPDATE,#TOCRLONG
 TEQEQ R2,#0
 MOVEQ UPDATE,#CSRONWARDS ;if X=0 IF newline then alter tocrlong to csronward
 BL CROUT
 BICNE R7,R7,#&80000000
 ADDNE R2,R2,#1
 BL FINALFWD
 MOV R0,R6
 BL WIPENOW
 BL UPDTMK
 TEQ UPDATE,#TOCRLONG
 TEQNE UPDATE,#TOCRSHORT
 LDMEQFD SP!,{PC} ;exit if reached newline
 B UPDTLQ
UPDTL3 ADD R14,R6,#SCRIM ;address in SCRIM of line
 STRB R2,[ARGP,R14] ;maximum length
 BL UPDTMK
UPDTLQ BL ABORTQ
 LDMNEFD SP!,{PC}
 MOV R0,#0
 ADD R6,R6,#1
 CMP R5,R6
 BHI UPDTL0
 BL FINALFWD
 TEQ R7,R7
 LDMFD SP!,{PC}
UPDTL4 MOV R0,#"*"
 BL CHOUTIOPT
 ADD R2,R2,#1
 BL FINALFWD
 MOV R0,R6
 BL WIPENOW
 BL UPDTMK
 TEQ UPDATE,#TOCRLONG
 TEQNE UPDATE,#TOCRSHORT
 LDMEQFD SP!,{PC}
 LDRB R0,[AP,#ELINE]
 SUBS R0,R0,#1 ;bottom Y of window
 TEQ R0,R6 ;reached end already?
 LDMEQFD SP!,{PC}
 ADD R2,R0,#SCRIM
 SWI WRITEI+28
 SWI WRITEI+0
 SWI WRITEC
 SWI WRITEI+WIDTH-1
 ADD R0,R6,#1
 SWI WRITEC
 SWI WRITEI+12
 ADD R0,R0,#SCRIM
 MOV R1,#0
UPDTL5 STRB R1,[ARGP,R0]
 ADD R0,R0,#1
 CMP R0,R2
 BCC UPDTL5
 LDMFD SP!,{PC}
;NE status if prefetch aborting
ABORTQ TST R7,#ABORT
 MOVEQ PC,R14
 TST R7,#1
 MOVNE PC,R14 ;aborted already
 MOV R0,#&81
 MOV R1,#0
 MOV R2,#0
 SWI BYTE
 TEQ R2,#&FF
 MOVEQ PC,R14
 LDRB R0,[ARGP,#ESCFLG]
 CMP R0,#&80
 BCS ESCAPE
 MOV R0,UPDATE
 CMP R0,#CSRONWARDS
 BNE ABORTQ1
 CMP R1,#&7F
 MOVCS R0,#FULLSCREEN
 B ABORTQ2
ABORTQ1 MOVCC R0,#CSRONWARDS ;if none, tocrlong, tocrshort then csronwards
 TEQNE R0,#HARDUP
 TEQNE R0,#HARDDN
 MOVEQ R0,#FULLSCREEN ;if csronwards, hardup, harddn then fullscr
ABORTQ2 STRB R0,[ARGP,#OLDUPDATE]
 AND R7,R7,#&80000000
 ORR R7,R7,R1,LSL #8
 ORR R7,R7,#ABORT+1 ;aborted: NE
FINALFWD TEQ R7,#0
 MOVPL PC,R14
 BIC R7,R7,#&80000000
 B SELFWD
;update marks on line
UPDTMK LDRB R1,[AP,#MARKS]
 SUBS R1,R1,#1
 MOVCC PC,R14 ;no marks so quit quickly
 STMFD SP!,{R14}
UPDTM8 ADD R14,AP,R1,LSL #2
 STMFD SP!,{R4}
 LDR R4,[R14,#MARKTB]
 BL MARKADR
 MOV R14,R4
 LDMFD SP!,{R4}
 CMP R14,R4
 BCS UPDTM1 ;past end of this line
 SUBS R0,R14,R3
 BCC UPDTM1 ;before start of this line
 SWI WRITEI+26
 SWI WRITEI+31
 SWI WRITEC
 ADD R14,R6,#SCRIM
 CMP R0,R2 ;test X posn of mark with line length
 ADD R0,R0,#1
 STRCSB R0,[ARGP,R14] ;if mark past end of line, update length
 MOV R0,R6
 SWI WRITEC
 ADD R0,R1,#"0"+1
 BL CHOUTI
 BIC R7,R7,#&80000000
UPDTM1 SUBS R1,R1,#1
 BCS UPDTM8
 LDMFD SP!,{PC}
;output character R0. NE if written, EQ if not
CHOUTOPT CMP R0,#" "
 BCC CHOUT1OPT
 CMP R0,#&7F
 MOVEQ R0,#"?"
 BEQ CHOUTIOPT
 TEQ R7,#0
 SWIMI WRITEI+17
 SWIMI WRITEI+7
 SWIMI WRITEI+17
 SWIMI WRITEI+128
 SWI WRITEC
 BIC R7,R7,#&80000000
 MOV PC,R14
CHOUT1OPT ORR R0,R0,#"@"
CHOUTIOPT TEQ R7,#0
 SWIPL WRITEI+17
 SWIPL WRITEI+0
 SWIPL WRITEI+17
 SWIPL WRITEI+7+128
 SWI WRITEC
 ORR R7,R7,#&80000000
 MOV PC,R14
;output character R0. NE if written, EQ if not
CHOUT CMP R0,#" "
 BCC CHOUT1
 CMP R0,#&7F
 SWINE WRITEC
 MOVNE PC,R14
 MOV R0,#"?"
CHOUTI SWI WRITEI+17
 SWI WRITEI+0
 SWI WRITEI+17
 SWI WRITEI+7+128
 SWI WRITEC
SELFWD SWI WRITEI+17
 SWI WRITEI+7
 SWI WRITEI+17
 SWI WRITEI+128
 MOV PC,R14
CHOUT1 CMP R0,#TERM
 ORRNE R0,R0,#"@"
 BNE CHOUTI
CROUT LDRB R0,[AP,#SHOWCR]
 TEQ R0,#0
 MOVNE R0,#""
 BNE CHOUTI
 MOV PC,R14
;output both window's status lines
STATAL STMFD SP!,{AP,R14}
 ADD AP,ARGP,#AREA0
 LDRB R0,[AP,#ONSCREEN]
 TEQ R0,#0
 BEQ STATA1
 LDR R0,[SP]
 MOV R1,#0
 TEQ R0,AP
 MOVEQ R1,#1
 BL STATOT
STATA1 ADD AP,ARGP,#AREA1
 LDRB R0,[AP,#ONSCREEN]
 TEQ R0,#0
 BEQ STATA2
 LDR R0,[SP]
 MOV R1,#0
 TEQ R0,AP
 MOVEQ R1,#1
 BL STATOT
STATA2 LDMFD SP!,{AP,R14}
 B DECWIN
;subroutine to call if modifying text
MODTXT LDRB R1,[AP,#MODIFY]
 TST R1,#1 ;if bottom bit already set then exit early
 MOVNE PC,R14
MODSTT LDRB R1,[AP,#MODIFY]
 TEQ R1,#4
 MOVEQ PC,R14 ;discarded!
 MOV R1,#1
 STRB R1,[AP,#MODIFY]
;output this window's status
STATUS MOV R1,#1
STATOT LDRB R0,[AP,#ELINE]
;output status on line n (R0), selected (R1)
 STMFD SP!,{R0,R1,R14}
 SWI WRITEI+26
 SWI WRITEI+31
 SWI WRITEI+0
 SWI WRITEC
 TEQ R1,#0
 BLNE SELREV
 LDRB R0,[AP,#BUFFNO]
 SWI WRITEC
 LDRB R0,[AP,#PUSHNO]
 TEQ R0,#"0"
 SWIEQ WRITEI+" "
 SWINE WRITEC
 LDRB R2,[AP,#INSERT]
 TEQ R2,#0
 BNE STAT1
 BL VSTRNG
 = "Over   ",0
 B STAT2
STAT1 BL VSTRNG
 = "Insert ",0
 ALIGN
STAT2 LDRB R2,[AP,#MARKS]
 CMP R2,#1
 BEQ STAT2A
 BHI STAT2B
 LDRB R2,[AP,#TABMOD]
 TEQ R2,#0
 BNE STAT2C
 BL VSTRNG
 = "TAB words ",0
 B STAT4
STAT2C BL VSTRNG
 = "TAB cols  ",0
 B STAT4
STAT2A BL VSTRNG
 = "One mark  ",0
 B STAT4
STAT2B BL VSTRNG
 = "Two marks ",0
 ALIGN
STAT4 LDRB R0,[AP,#TASKQ]
 TEQ R0,#0
 BNE STATUSTASK
 LDRB R2,[ARGP,#ERRCTL]
 TEQ R2,#255
 BNE STAT0
 BL VSTRNG
 = "Cursor Editing",0
 MOV R2,#2+7+10+14
 B STAT6B
STATUSTASK BL VSTRNG
 = "Task running in this window ",0
 MOV R2,#28+2+7+10
 B STAT6B
STAT0 LDRB R2,[AP,#MODIFY]
 TEQ R2,#0
 BNE STAT4A
 BL VSTRNG
 = "Original """,0
 B STAT4B
GETMTABLE ADR R3,MTABLE
 MOV PC,R14
CDAYS * 10000*6*6*24
LYTABLE & 365*24*60*60*100*4+CDAYS ;year*3+leap year
YTABLE & 365*24*60*60*100+CDAYS ;leap year
 & CDAYS ;days
MTABLE & 31*CDAYS
 = "Jan",0
 & 28*CDAYS
 = "Feb",0
 & 31*CDAYS
 = "Mar",0
 & 30*CDAYS
 = "Apr",0
 & 31*CDAYS
 = "May",0
 & 30*CDAYS
 = "Jun",0
 & 31*CDAYS
 = "Jul",0
 & 31*CDAYS
 = "Aug",0
 & 30*CDAYS
 = "Sep",0
 & 31*CDAYS
 = "Oct",0
 & 30*CDAYS
 = "Nov",0
 & 31*CDAYS
 = "Dec",0
TTABLE & 100000*6*6 ;tens of hours
 & 10000*6*6 ;hours
 & 10000*6 ;tens of minutes
 & 1000*6 ;minutes
 & 1000 ;tens of seconds
 & 100 ;seconds
 & 10
 & 1
STAT4C BL VSTRNG
 = "LF  CR """,0
 B STAT4B
STAT4D BL VSTRNG
 = "Discarded""",0
 B STAT4B
STAT4A TEQ R2,#2
 BEQ STAT4C
 TEQ R2,#4
 BEQ STAT4D
 BL VSTRNG
 = "Modified """,0
 ALIGN
STAT4B ADD R2,AP,#NAMBUFF
 ADD R8,R2,#WIDTH-49
STAT5 LDRB R0,[R2],#1
 TEQ R0,#CR
 BEQ STAT5DONE
 SWI WRITEC
 CMP R2,R8
 BNE STAT5
 SWI WRITES
 = 127,127,127,127,127," etc",0
 ALIGN
STAT5DONE SUB R2,R2,AP
 SUB R2,R2,#NAMBUFF-26-19-2
 LDR R8,[AP,#FLLOAD]
 CMN R8,#1
 BEQ STAT6A
 CMN R8,#256
 BCC STAT6A
 ADD R2,R2,#1
 BL VSTRNG
 = """ ",0
 LDR R8,[AP,#FLEXEC] ;get time
 LDRB R6,[AP,#FLLOAD]
 BL PRINTTIME
 B STAT6B
PRINTTIME STMFD SP!,{R0,R1,R2,R3,R7,R14}
 LDR R3,YTABLE+4
 ADDS R8,R8,R3
 ADC R6,R6,#0 ;add a day so that 1900 is a leap year
 MVN R1,#3 ;years (-4)
 LDR R2,LYTABLE
DATEO0 ADD R1,R1,#4
 SUBS R8,R8,R2
 SBCS R6,R6,#2
 BCS DATEO0
 ADDS R8,R8,R2
 ADC R6,R6,#2
 LDR R2,YTABLE
 SUBS R8,R8,R2
 SBCS R6,R6,#0
 BCC DATEY0
 SUB R2,R2,R3 ;change from leap year to year
DATEO1 ADD R1,R1,#1
 SUBS R8,R8,R2
 SBCS R6,R6,#0
 BCS DATEO1
DATEY0 ADD R8,R8,R2 ;restore if overshot
 ADR R4,MTABLE ;pointer to month
 LDR R2,[R4],#8
 SUBS R8,R8,R2
 BCC DATEM0 ;january?
 LDR R2,[R4],#8
 TST R1,#3
 ADDEQ R2,R2,R3 ;if feb in leap year then 29 days
 SUBS R8,R8,R2
 BCC DATEM0 ;febuary?
DATEO4 LDR R2,[R4],#8
 SUBS R8,R8,R2
 BCS DATEO4
DATEM0 ADD R8,R8,R2        
 LDR R2,YTABLE+4
 MOV R3,#0 ;days
DATEO3 ADD R3,R3,#1
 SUBS R8,R8,R2
 BCS DATEO3
 ADD R8,R8,R2
 ADR R6,TTABLE
 BL DIGIT
 BL DIGIT
 SWI WRITEI+":"
 BL DIGIT
 BL DIGIT
 SWI WRITEI+":"
 BL DIGIT
 BL DIGIT
 SWI WRITEI+" "
 MOV R8,R3
 BL DIGIT
 BL DIGIT
 SWI WRITEI+"-"
 LDRB R0,[R4,#-4]
 SWI WRITEC
 LDRB R0,[R4,#-3]
 SWI WRITEC
 LDRB R0,[R4,#-2]
 SWI WRITEC
 SWI WRITEI+"-"
 MOV R8,R1
 SUB R6,R6,#8
 BL DIGIT
 BL DIGIT
 LDMFD SP!,{R0,R1,R2,R3,R7,PC}
;print digit derived from r8 and current TABLE entry
DIGIT MOV R0,#"0"
 LDR R7,[R6],#4
DIGIT1 SUBS R8,R8,R7
 ADDCS R0,R0,#1
 BCS DIGIT1
 ADD R8,R8,R7 ;(went too far)
 SWI WRITEC
 MOV PC,R14 
STAT6A SWI WRITEI+""""
 CMN R8,#1
 TEQNE R8,#0
 BNE STAT6W
 LDR R0,[AP,#FLEXEC]
 CMN R0,#1
 BNE STAT6W
 BL VSTRNG
 = " **Command File** ",0
 B STAT6B
STAT6W BL WORDSP
 LDR R8,[AP,#FLEXEC]
 BL WORDSP
STAT6B BL SLWIPE
STAT6C LDMFD SP!,{R0,R1,R14}
 TEQ R1,#0
 MOVNE PC,R14
 RSB R2,R0,#32
 MOV R2,R2,LSL #5
 SUB R0,R2,#32
 SWI WRITEI+25
 SWI WRITEI+4
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEC
 MOV R0,R0,LSR #8
 SWI WRITEC
 SWI WRITEI+25
 SWI WRITEI+1
 SWI WRITEI+254
 SWI WRITEI+4
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+25
 SWI WRITEI+1
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+28
 SWI WRITEI+0
 SWI WRITEI+25
 SWI WRITEI+17
 SWI WRITEI+2
 SWI WRITEI+251
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+25
 SWI WRITEI+1
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+228
 SWI WRITEI+255
 MOV PC,R14
SELREV SWI WRITEI+17
 SWI WRITEI+0
 SWI WRITEI+17
 SWI WRITEI+7+128
 MOV PC,R14
PROMPT MOV R0,#0
PRMPTX SWI WRITEI+31
 SWI WRITEC
 SUB R2,R0,#1
 LDRB R1,[AP,#ELINE]
 LDRB R0,[AP,#SLINE]
 SUB R0,R1,R0
 STMFD SP!,{R0}
 SWI WRITEC
 SWI WRITEI+17
 SWI WRITEI+0
 SWI WRITEI+17
 SWI WRITEI+7+128
 BIC R14,R14,#&FC000003
 MOV R0,R14
 SWI WRITE0
 SUB R1,R0,R14
 ADD R2,R2,R1
 MOV R14,R0
 ADD R14,R14,#3
 BIC R14,R14,#3
 STMFD SP!,{R14,R2}
 BL SELFWD
 LDRB R0,[AP,#ELINE]
 BL SWIPE
 BL DECWIN
 LDMFD SP!,{R14,R2}
 SWI WRITEI+31
 MOV R0,R2
 SWI WRITEC
 LDMFD SP!,{R0}
 SWI WRITEC
 MOV PC,R14
INFORR SWI WRITEI+31
 SWI WRITEI+WIDTH-18
 LDRB R1,[AP,#ELINE]
 LDRB R0,[AP,#SLINE]
 SUB R0,R1,R0
 SWI WRITEC
 SWI WRITEI+17
 SWI WRITEI+0
 SWI WRITEI+17
 SWI WRITEI+7+128
 SWI WRITEI+" "
 BIC R14,R14,#&FC000003
 MOV R0,R14
 SWI WRITE0
 SUB R1,R0,R14
 ADD R2,R1,#13
 MOV R14,R0
 ADD R14,R14,#3
 BIC R14,R14,#3
QWIPE MOV R0,#&86
 SWI BYTE
 MOV R2,R1
SLWIPE STMFD SP!,{R14}
 LDRB R0,[AP,#ELINE]
 BL SWIPE
 BL SELFWD
 BL DECWIN
 LDMFD SP!,{PC}
;start clear in R2, end clear WIDTH-1, update to WIDTH-1, line number R0
SWIPE STMFD SP!,{R0,R14}
 ADD R14,R0,#SCRIM
 CMP R2,#WIDTH
 BCS SWIPE1
 LDRB R0,[ARGP,#WIPESTYLE]
 CMP R0,#0
 BNE SWIPESIMPLE
 SWI WRITEI+31
 MOV R0,R2
 SWI WRITEC
 LDR R0,[SP]
 SWI WRITEC
 SWI WRITES
 = 23,8,5,6,0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 B SWIPE1
SWIPESIMPLE SWI WRITEI+28
 MOV R0,R2
 SWI WRITEC
 LDR R0,[SP]
 SWI WRITEC
 SWI WRITEI+WIDTH-1
 SWI WRITEC
 SWI WRITEI+12
SWIPE1 MOV R0,#WIDTH
 STRB R0,[ARGP,R14]
 LDMFD SP!,{R0,PC}
;start clear in R2, end clear in scrim,R0, absolute line number in R0
WIPENOW STMFD SP!,{R0,R14}
 ADD R14,R0,#SCRIM
 LDRB R0,[ARGP,R14]
 CMP R2,R0
 BCS WIPEN1
 LDRB R0,[ARGP,#WIPESTYLE]
 CMP R0,#0
 BNE WIPESIMPLE
 SWI WRITEI+26
 SWI WRITEI+31
 MOV R0,R2
 SWI WRITEC
 LDR R0,[SP]
 SWI WRITEC
 SWI WRITES
 = 23,8,5,6,0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 B WIPEN1
WIPESIMPLE SWI WRITEI+28
 MOV R0,R2
 SWI WRITEC ;left X
 LDR R0,[SP]
 SWI WRITEC ;bottom Y
 LDRB R0,[ARGP,R14] ;right X from scrim
 SUB R0,R0,#1
 SWI WRITEC
 LDR R0,[SP]
 SWI WRITEC ;top Y = bottom Y
 SWI WRITEI+12
WIPEN1 STRB R2,[ARGP,R14]
 LDMFD SP!,{R0,PC}
BIGCUR SWI WRITEI+23
 SWI WRITEI+0
 SWI WRITEI+10
 SWI WRITEI+&60
 B CURPAD
NMLCUR SWI WRITEI+23
 SWI WRITEI+0
 SWI WRITEI+10
 SWI WRITEI+&67
 B CURPAD
CUROFF SWI WRITEI+23
 SWI WRITEI+1
 SWI WRITEI+0
 B CURPAD
CURON SWI WRITEI+23
 SWI WRITEI+1
 SWI WRITEI+1
CURPAD SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 SWI WRITEI+0
 MOV PC,R14
PATOUT BIC R2,R14,#&FC000003
 BL PATA
 BL PATA
 BL PATA
 BL PATA
 BL PATA
 BL PATA
 BL VSTRNG
 = 23,255,-1,-1,-1,-1,-1,-1,-1,-1,0
 MOV R14,R2
 B CURPAD
PATA LDR R0,[R2],#4
 SWI WRITEI+23
 SWI WRITEI+255
 SWI WRITEC
 MOV R0,R0,ROR #8
 SWI WRITEC
 MOV R0,R0,ROR #8
 SWI WRITEC
 MOV R0,R0,ROR #8
 SWI WRITEC
 LDR R0,[R2],#4
 SWI WRITEC
 MOV R0,R0,ROR #8
 SWI WRITEC
 MOV R0,R0,ROR #8
 SWI WRITEC
 MOV R0,R0,ROR #8
 SWI WRITEC
 SWI WRITEI+255
 MOV PC,R14
WORDSP SWI WRITEI+" "
;print R8
WORDHX STMFD SP!,{R0,R2,R14}
 MOV R2,#32-4
WORDLP MOV R0,R8,LSR R2
 AND R0,R0,#15
 CMP R0,#9
 ORRLS R0,R0,#"0"
 ADDHI R0,R0,#"A"-10
 SWI WRITEC
 SUBS R2,R2,#4
 BPL WORDLP
 LDMFD SP!,{R0,R2,PC}
SETARGP ADR ARGP,ZEEND
 MOV PC,R14
ESCHAM ADR R12,ZEEND
 MOV R11,R11,LSL #1
 STRB R11,[R12,#ESCFLG]
 MOV PC,R14
EVTHAM ADR R11,ZEEND
 LDRB R11,[R11,#TASK]
 TEQ R11,#1
 BEQ EVTHAM1
 MOV PC,R14
ZEEND
ZELEN * ZEEND-ORIGIN
 END
