        TTL     => MoreComms

Error_Code ROUT

        Push    "lr"
        MOV     r1, r0    ; pointer
        MOV     r0, #0    ; base
        SWI     XOS_ReadUnsigned
        LDR     r3, =GeneralMOSBuffer
        STR     r2, [r3], #4

        MOV     r0, r1                  ; GSTrans the string into buffer
        MOV     r1, r3
        MOV     r2, #252
        SWI     XOS_GSTrans
        LDR     r0, =GeneralMOSBuffer
        MOV     r1, #0
        STRB    r1, [r0, #255]          ; Force termination within buffer

        ADD     r2, r0, #4
10      LDRB    r14, [r2], #1           ; Ensure zero terminated
        CMP     r14, #space
        BHS     %BT10
        STRB    r1, [r2, #-1]

        LDR     r0, =GeneralMOSBuffer
        Pull    "lr"
        ORRS    pc, lr, #V_bit


Eval_Code ROUT
             Push  "lr"
             LDR    R1, =GeneralMOSBuffer
             MOV    R2, #256
             SWI    XOS_EvaluateExpression
             Pull  "PC", VS
             SWI    XOS_WriteS
             =     "Result is a",0
             ALIGN
             Pull  "PC", VS
             CMP    R1, #0
             ADREQ  R0, %FT01
             ADRNE  R0, %FT02
             SWI    XOS_Write0
             Pull  "PC", VS
             SWI    XOS_WriteS
             =     ", value : ",0
             ALIGN
             Pull  "PC", VS
             LDREQ  R1, =GeneralMOSBuffer
             MOVEQ  R0, R2
             MOVEQ  R2, #256
             SWIEQ  XOS_BinaryToDecimal
             MOV    R5, #-1
03           ADD    R5, R5, #1
             CMP    R5, R2
             BEQ    %FT04
             LDRB   R0, [R1, R5]
             CMP    R0, #&7F
             MOVEQ  R0, #"?"-"@"   ; preversion!!
             CMP    R0, #31
             ADDLE  R0, R0, #"@"
             SWILE  XOS_WriteI+"|"
             Pull  "PC", VS
             CMP    R0, #"|"
             CMPNE  R0, #""""
             CMPNE  R0, #"<"
             SWIEQ  XOS_WriteI+"|"
             SWIVC  XOS_WriteC
             BVC    %BT03

04           SWIVC  XOS_NewLine
             Pull  "PC"
01
    =    "n integer",0
02
    =    " string",0

    ALIGN

;****************************************************************************
; Coupla utility commands

Time_Code    ROUT
     Push   "lr"
     LDR     R1, =GeneralMOSBuffer
     MOV     R0, #0
     STRB    R0, [R1]
     MOV     R0, #14
     SWI     XOS_Word
     MOVVC   R0, R1
     MOVVC   R1, #24
     SWIVC   XOS_WriteN
     SWIVC   XOS_NewLine
     Pull   "PC"


Ignore_Code  ROUT
     Push   "lr"
     MOVS    R4, R1
     MOV     R1, R0
     MOV     R0, #10+ (1:SHL:30)
     SWINE   XOS_ReadUnsigned
     Pull   "PC", VS
     MOV     R6, R2        ; maybe number
     BL      CheckEOL
     BNE     %FT01

     CMP     R4, #0
     MOV     R0, #&B6
     MOVEQ   R1, #255
     MOVNE   R1, #0
     MOV     R2, #0
     SWI     XOS_Byte
     MOV     R0, #6
     MOV     R1, R6
     SWINE   XOS_Byte
     Pull   "PC"

01   ADRL    R0, ErrorBlock_BadNumb
     SETV
     Pull   "PC"

;*****************************************************************************

ROMModules_Code ROUT
     Push   "lr"
     ADRL    R0, romm_helpstr
     MOV     r1, #0
     SWI     XOS_PrettyPrint
     Pull   "PC", VS
     MOV     R1, #0
     MOV     R2, #-1
01   MOV     R0, #ModHandReason_EnumerateROM_Modules
     SWI     XOS_Module
     Pull   "lr", VS
     MOVVSS  PC, lr

; R2 has area indicator, R1 is number, R3 is name ptr, R4 status
; copy info into buffer and prettyprint.
     MOV     R5, R1
     MOV     R6, R2
     MOV     R0, R1
     LDR     R1, =GeneralMOSBuffer
     MOV     R2, #256
     SWI     XOS_ConvertCardinal2
     SUB     R12, R1, R0          ; characters in buffer
02   CMP     R12, #3
     SWILT   XOS_WriteI+" "
     Pull   "PC", VS
     ADDLT   R12, R12, #1
     BLT     %BT02
     MOV     R0, #" "
     BL      %FT20               ; add space
     CMP     R6, #0
     ADRMIL  R0, rommpossr
     ADRPLL  R0, rommposp
     BL      %FT21               ; add string
     MOVS    R0, R6
     SWIPL   XOS_ConvertCardinal1
     MOV     R0, #TAB
     BL      %FT20               ; tab to col. 16
     MOV     R0, R3
     BL      %FT21               ; copy name in
     MOV     R3, R0              ; string length
     MOV     R0, #TAB
03   CMP     R3, #24
     ADDLT   R3, R3, #8
     BLLT    %FT20
     BLT     %BT03
     CMP     R4, #0
     ADRMIL  R0, rommstu
     ADREQL  R0, rommstd
     ADRGTL  R0, rommsta
     CMP     R4, #2
     ADREQL  R0, rommsta
     BL      %FT21
     MOV     R0, #13
     BL      %FT20
     MOV     R0, #0
     BL      %FT20
     LDR     R0, =GeneralMOSBuffer
     MOV     r1, #0
     SWI     XOS_PrettyPrint
     Pull   "PC", VS
     MOV     R1, R5
     MOV     R2, R6
     B       %BT01

; R1 buffer ptr, R2 bufflen left

20   SUBS    R2, R2, #1
     STRPLB  R0, [R1], #1
     MOVS    PC, lr
21
     Push   "R0, lr"
     MOV     R12, R0
22   LDRB    R0, [R12], #1
     CMP     r0, #TokenEscapeChar
     BEQ     %FT23
     CMP     R0, #0
     BLNE    %BT20
     BNE     %BT22
     Pull   "R0, lr"
     SUB     R0, R12, R0       ; length of string
     SUB     R0, R0, #1
     MOVS    PC, lr

23   BL      %BT20
     LDRB    r0, [r12], #1
     BL      %BT20
     B       %BT22

;*****************************************************************************

RMEnsure_Code ROUT
     Push    "r0, r1, lr"
     MOV      r1, r0             ; name pointer
     MOV      r0, #ModHandReason_LookupName
     SWI      XOS_Module
     MOVVS    r10, r0           ; module handler will build a nice error
     BVS      RMEDoCommand      ; module not found
     LDR      r0, [stack]       ; now find version number

01   LDRB     r6, [r0], #1
     CMP      r6, #" "
     BNE      %BT01
     BL       RMEGetVerno
     MOV      r6, r1
     LDR      r0, [r3, #Module_HelpStr]
     ADD      r0, r0, r3
     MOV      r5, #0            ; char count
02   LDRB     r1, [r0], #1
     CMP      r0, #0
     BEQ      RMEDoCommand      ; spastic verno
     ADD      r5, r5, #1
     CMP      r1, #TAB
     ADDEQ    r5, r5, #7
     BICEQ    r5, r5, #7
     CMP      r5, #16           ; hit verno col yet?
     BLT      %BT02
finddigit
     LDRB     r1, [r0], #1
     CMP      r1, #TAB
     CMPNE    r1, #31
     BLT      RMEDoCommand
     SUB      r1, r1, #"0"
     CMP      r1, #9
     BHI      finddigit
     SUB      r0, r0, #1
     BL       RMEGetVerno       ; module version
     CMP      r1, r6
     Pull    "r0, r1, PC", GE
     MOV      r10, #0
RMEDoCommand
     Pull    "r0, r1"
     CMP      r1, #2
     BEQ      BuildRMEnsureError
04   LDRB     r1, [r0], #1
     CMP      r1, #" "
     BNE      %BT04
05   LDRB     r1, [r0], #1
     CMP      r1, #" "
     BEQ      %BT05
06   LDRB     r1, [r0], #1
     CMP      r1, #" "
     BNE      %BT06
     SUB      r0, r0, #1
03   SWI      XOS_CLI
     Pull     PC

BuildRMEnsureError
     MOVS     r0, r10
     Pull     lr, NE
     ORRNES   pc, lr, #V_bit
     ADR      r0, ErrorBlock_ModuleTooOld
     BL       GetOscliBuffer
     MOV      r10, r5
     LDR      r2, [r0], #4
     STR      r2, [r5], #4
     BL       rmecopystr
     MOV      r6, r0

     LDR      r2, [r3, #Module_Title]     ; r3 still module pointer
     ADD      r0, r2, r3
     BL       rmecopystr
     MOV      r0, r6
     BL       rmecopystr
     STRB     r2, [r5]                   ; terminate
     B        BuildRMEnsureError

rmecopystr
     LDRB     r2, [r0], #1
     CMP      r2, #32
     STRGEB   r2, [r5], #1
     BGE      rmecopystr
     MOV      pc, lr

     MakeErrorBlock ModuleTooOld

RMEGetVerno     ; string pointer in r0, result in r1
                ; result is: high halfword = intpart, low = fractpart
     Push    "lr"
     MOV      r1, #0
10   LDRB     r12, [r0], #1
     CMP      r12, #" "
     BEQ      %BT10
11   SUB      r12, r12, #"0"
     CMP      r12, #9
     ORRLS    r1, r12, r1, LSL #4    ; just keep nibbles - we only need the
     LDRLSB   r12, [r0], #1          ; result to be ordered, not continous
     BLS      %BT11
     MOV      r5, #0
     CMP      r12, #"."-"0"
     BNE      %FT13
     MOV      r4, #16
12   SUBS     r4, r4, #4
     BMI      %FT13
     LDRB     r12, [r0], #1
     SUB      r12, r12, #"0"
     CMP      r12, #9
     ORRLS    r5, r5, r12, LSL r4
     BLS      %BT12
13   ORR      r1, r5, r1, LSL #16
     Pull     PC

     LNK  Convrsions
