Commit d7d18819 authored by Ben Avison's avatar Ben Avison
Browse files

Shock horror - a new feature for the Wimp! And some housekeeping too.

Detail:
  * Added new functionality for menu trees: submenus can now be opened by
    clicking on their parent menu item. This is particularly aimed at
    touchscreen devices, and is configurable via the new *Configure keyword
    WimpClickSubmenu.
  * Change to the menu inactivity timeout behaviour after auto-opening of
    submenus (either by hovering over the parent menu item or by the new
    click-to-open functionality): although all hover operations are still
    ignored for this period, any click operations *will* now be obeyed.
  * Corrected numerous misleading comments in the menu handling code.
  * Added some suspiciously absent ALIGNs in the *Configure keyword handlers.
  * Uses new ASCII case-forcing macros so there are now fewer warnings
    printed during assembly (and it should run faster now too).
  * Added an AREA directive so that objasm's -ABS switch is no longer needed.
  * Standardised ErrMem token across all Messages files that use English.
Admin:
  Tested on a desktop machine.
  Requires HdrSrc 1.06.

Version 4.57. Tagged as 'Wimp-4_57'
parent 3d5ff774
......@@ -43,8 +43,8 @@ LD = link
CP = copy
RM = remove
WIPE = -wipe
ASFLAGS = -ABSolute -NOWarn -depend !Depend ${THROWBACK} ${OPTS} -o $@
LDFLAGS = -bin -o $@
ASFLAGS = -NOWarn -depend !Depend ${THROWBACK} ${OPTS} -cpu 3 -o $@
LDFLAGS = -rmf -o $@
CPFLAGS = ~cfr~v
WFLAGS = ~cfr~v
......@@ -102,7 +102,6 @@ ${OBJECT}: ${SOURCE}
${TARGET}: ${OBJECT}
${LD} ${LDFLAGS} ${OBJECT}
SetType $@ Module
Access $@ rw/r
${EXP_HDR}.Wimp: hdr.Wimp
......
......@@ -78,6 +78,7 @@
Option UTF8, true ; support for UTF-8 alphabet (Unicode)
Option CnP, true ; support for RISC OS selection model and Cut-and-Paste in writeable icons
Option NoFontBodge, false ; don't use outline fonts
Option ClickSubmenus, true ; submenus opened by clicking on their parent items (configurable)
Option RegisterMessages, false
Option RegisterTools2D, false
......
......@@ -59,7 +59,7 @@ Space:Press SPACE or click mouse to continue
ErrorF:Message from %0
ErrorP:%0 may have gone wrong. Click Continue to try to resume or Quit to stop %0.
ErrMemS:There is not enough free memory to start this application.
ErrMem:%0K free memory is needed before the application will start.
ErrMem:%0K free memory is needed before the application will start. Quit any unwanted applications or see the RISC OS User Guide for ways to maximise memory.
ErrNoMv:Unable to move memory
KillApp:Press Stop to terminate %0.
KillProg:Press the return key to stop the program or
......@@ -59,7 +59,7 @@ Space:Press SPACE or click mouse to continue
ErrorF:Message from %0
ErrorP:%0 may have gone wrong. Click Continue to try to resume or Quit to stop %0.
ErrMemS:There is not enough free memory to start this application.
ErrMem:%0K free memory is needed before the application will start.
ErrMem:%0K free memory is needed before the application will start. Quit any unwanted applications or see the RISC OS User Guide for ways to maximise memory.
ErrNoMv:Unable to move memory
KillApp:Press Stop to terminate %0.
KillProg:Press the return key to stop the program or
......@@ -58,8 +58,8 @@ ID:Please insert %0 '%1'
Space:Press SPACE or click mouse to continue
ErrorF:Message from %0
ErrorP:%0 may have gone wrong. Click Continue to try to resume or Quit to stop %0.
ErrMemS:There is not enough free memory to start this application. Quit any unwanted applications or see the RISC OS User Guide for ways to maximise memory.
ErrMem:%0K free memory is needed before the application will start.
ErrMemS:There is not enough free memory to start this application.
ErrMem:%0K free memory is needed before the application will start. Quit any unwanted applications or see the RISC OS User Guide for ways to maximise memory.
ErrNoMv:Unable to move memory
KillApp:Press Stop to terminate %0.
KillProg:Press the return key to stop the program or
......@@ -59,7 +59,7 @@ Space:Press SPACE or click mouse to continue
ErrorF:Message from %0
ErrorP:%0 may have gone wrong. Click Continue to try to resume or Quit to stop %0.
ErrMemS:There is not enough free memory to start this application.
ErrMem:%0K free memory is needed before the application will start.
ErrMem:%0K free memory is needed before the application will start. Quit any unwanted applications or see the RISC OS User Guide for ways to maximise memory.
ErrNoMv:Unable to move memory
KillApp:Press Stop to terminate %0.
KillProg:Press the return key to stop the program or
......@@ -59,7 +59,7 @@ Space:Press SPACE or click mouse to continue
ErrorF:Message from %0
ErrorP:%0 may have gone wrong. Click Continue to try to resume or Quit to stop %0.
ErrMemS:There is not enough free memory to start this application.
ErrMem:%0K free memory is needed before the application will start.
ErrMem:%0K free memory is needed before the application will start. Quit any unwanted applications or see the RISC OS User Guide for ways to maximise memory.
ErrNoMv:Unable to move memory
KillApp:Press Stop to terminate %0.
KillProg:Press the return key to stop the program or
No preview for this file type
......@@ -9,12 +9,12 @@
GBLS Module_ApplicationDate2
GBLS Module_ApplicationDate4
GBLS Module_HelpVersion
Module_MajorVersion SETS "4.56"
Module_Version SETA 456
Module_MajorVersion SETS "4.57"
Module_Version SETA 457
Module_MinorVersion SETS ""
Module_Date SETS "19 Oct 2000"
Module_ApplicationDate2 SETS "19-Oct-00"
Module_ApplicationDate4 SETS "19-Oct-2000"
Module_FullVersion SETS "4.56"
Module_HelpVersion SETS "4.56 (19 Oct 2000)"
Module_Date SETS "20 Oct 2000"
Module_ApplicationDate2 SETS "20-Oct-00"
Module_ApplicationDate4 SETS "20-Oct-2000"
Module_FullVersion SETS "4.57"
Module_HelpVersion SETS "4.57 (20 Oct 2000)"
END
/* (4.56)
/* (4.57)
*
* This file is automatically maintained by srccommit, do not edit manually.
*
*/
#define Module_MajorVersion_CMHG 4.56
#define Module_MajorVersion_CMHG 4.57
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 19 Oct 2000
#define Module_Date_CMHG 20 Oct 2000
#define Module_MajorVersion "4.56"
#define Module_Version 456
#define Module_MajorVersion "4.57"
#define Module_Version 457
#define Module_MinorVersion ""
#define Module_Date "19 Oct 2000"
#define Module_Date "20 Oct 2000"
#define Module_ApplicationDate2 "19-Oct-00"
#define Module_ApplicationDate4 "19-Oct-2000"
#define Module_ApplicationDate2 "20-Oct-00"
#define Module_ApplicationDate4 "20-Oct-2000"
#define Module_FullVersion "4.56"
#define Module_HelpVersion "4.56 (19 Oct 2000)"
#define Module_FullVersion "4.57"
#define Module_HelpVersion "4.57 (20 Oct 2000)"
......@@ -19,6 +19,8 @@
;; Author: Neil Raine
;;-----------------------------------------------------------------------------
AREA |Asm$$Code|, CODE, READONLY
Module_BaseAddr
GET Hdr:ListOpts
......
......@@ -1048,6 +1048,11 @@ autoscr_update_delay * 12 ; hardwired minimum interval between upd
autoscr_END # 0
]
[ ClickSubmenus
clicksubmenuenable # 1 ; nonzero => functionality enabled
submenuopenedbyclick # 1 ; nonzero => submenu should be held open
]
[ IconiseButton
iconisebutton # 1 ; nonzero => add iconise button
]
......@@ -2032,6 +2037,11 @@ WimpStickyEdgesC_Syntax DCB "Syntax: *Configure WimpStickyEdges On|Off",
WimpButtonTypeC_Help DCB "*Configure WimpButtonType sets whether the back, close, iconise and toggle-size icons "
DCB "act when you click on them or when you release the mouse button afterwards.",cr
WimpButtonTypeC_Syntax DCB "Syntax: *Configure WimpButtonType Click|Release",0
]
[ ClickSubmenus
WimpClickSubmenuC_Help DCB "*Configure WimpClickSubmenu sets whether clicking on a menu item that has an attached "
DCB "submenu will cause the attached submenu to be opened.",cr
WimpClickSubmenuC_Syntax DCB "Syntax: *Configure WimpClickSubmenu On|Off",0
]
ALIGN
......@@ -2137,6 +2147,10 @@ WimpStickyEdgesC_Syntax DCB "SWNMSE",0
[ BounceClose
WimpButtonTypeC_Help DCB "HWNMBT",0
WimpButtonTypeC_Syntax DCB "SWNMBT",0
]
[ ClickSubmenus
WimpClickSubmenuC_Help DCB "HWNMCSM",0
WimpClickSubmenuC_Syntax DCB "SWNMCSM",0
]
ALIGN
......@@ -2192,6 +2206,9 @@ Helptable
[ Autoscr
Command WimpAutoScrollDelay,1,1,Status_Keyword_Flag:OR:International_Help,WimpAutoScrollDelayC
]
[ ClickSubmenus
Command WimpClickSubmenu,1,1,Status_Keyword_Flag:OR:International_Help,WimpClickSubmenuC
]
DCB 0
;............................................................................
......@@ -2321,7 +2338,7 @@ scan_for_param
BEQ scan_for_param
CMP R0,#","
BEQ scan_for_param
UpperCase R0,R14 ; this is safe
ASCII_UpperCase R0,R14 ; this is safe
CMP R0,#"E"
BEQ get_eig_factors
CMP R0,#"X"
......@@ -2350,7 +2367,7 @@ bad_param_exit2
[ Medusa
get_eig_factors
LDRB R0,[R1],#1
UpperCase R0,R14
ASCII_UpperCase R0,R14
CMP R0,#"X" ; only EX EY allowed
MOVEQ R0,#VduExt_XEigFactor
CMP R0,#"Y"
......@@ -2414,7 +2431,7 @@ get_colours
MOVGE R6,R0
BGE scan_for_param
LDRB R0,[R1]
UpperCase R0,R14
ASCII_UpperCase R0,R14
CMP R2,#16
BNE %FT05
CMP R0,#"M"
......@@ -3286,6 +3303,18 @@ gotwork
MOVVS R0, #default_autofrontdelay
STRB R0, autoscr_default_pause ; not *10
]
;
; Read WimpClickSubmenu
[ ClickSubmenus
MOV R0, #ReadCMOS
MOV R1, #Misc1CMOS
SWI XOS_Byte
TST R2, #1 :SHL: 0 ; preserves V
MOVEQ R0, #0
MOVNE R0, #1
MOVVS R0, #0
STRB R0, clicksubmenuenable
]
;
ADRL R14,paltable ; initialise palette
ADR R11,emergencypalette
......
......@@ -1051,7 +1051,7 @@ $lab ConfigOption $string, $unit, $cmosbyte, $cmosbit, $cmossize, $shift, $eo
; $eor: (optional) value to EOR with mantissa read from CMOS
; $expbyte: (optional) byte holding 1-bit exponent
; $expbit: (optional) bit holding 1-bit exponent
; $intvar: (optional) internal value to set to value
; $intvar: (optional) internal variable to set to value
; $intmul: non-null means store value * 10 in internal variable
; $intbyte: B => store as byte value
; $lut: (optional) label for table of <8 char strings to use for each value
......@@ -1348,70 +1348,83 @@ statusmess_osupersec2 DCB "OSUperSec2",0
status_offon DCB "Off",0,0,0,0,0,"On",0,0,0,0,0,0,0,0,0,0
status_ramrom DCB "RAM",0,0,0,0,0,"ROM",0,0,0,0,0,0,0,0,0
status_clickrelease DCB "Click",0,0,0, "Release",0,0,0,0,0
ALIGN
; Code for handling *Configure/*Status
WimpFlagsC_Code
ConfigOption flags,,WimpFlagsCMOS,,,,,,,sysflags,,B
statusmess_flags DCB "WimpFlags ",0
configmess_flags DCB "WimpFlags <D>",cr,lf,0
ALIGN
WimpFontC_Code
ConfigOption wimpfont,,DesktopFeaturesCMOS,1,4
statusmess_wimpfont DCB "WimpFont ",0
configmess_wimpfont DCB "WimpFont <D>",cr,lf,0
ALIGN
WimpDragDelayC_Code
ConfigOption dragdelay,ds,WimpDragTimeCMOS,0,4,,default_drag_timelimit,WimpDragMoveLimitCMOS,0,drag_timelimit,x10
statusmess_dragdelay DCB "WimpDragDelay ",0
configmess_dragdelay DCB "WimpDragDelay <D>",cr,lf,0
ALIGN
WimpDragMoveC_Code
ConfigOption dragmove,osunits,WimpDragMoveLimitCMOS,2,5,noshift,default_drag_movelimit,,,drag_movelimit,,B
statusmess_dragmove DCB "WimpDragMove ",0
configmess_dragmove DCB "WimpDragMove <D>",cr,lf,0
ALIGN
WimpDoubleClickDelayC_Code
ConfigOption doubleclickdelay,ds,WimpDoubleClickTimeCMOS,0,4,,default_doubleclick_timelimit,WimpDoubleClickMoveLimitCMOS,0,doubleclick_timelimit,x10
statusmess_doubleclickdelay DCB "WimpDoubleClickDelay ",0
configmess_doubleclickdelay DCB "WimpDoubleClickDelay <D>",cr,lf,0
ALIGN
WimpDoubleClickMoveC_Code
ConfigOption doubleclickmove,osunits,WimpDoubleClickMoveLimitCMOS,2,5,noshift,default_doubleclick_movelimit,,,doubleclick_movelimit,,B
statusmess_doubleclickmove DCB "WimpDoubleClickMove ",0
configmess_doubleclickmove DCB "WimpDoubleClickMove <D>",cr,lf,0
ALIGN
WimpAutoMenuDelayC_Code
ConfigOption automenudelay,ds,WimpAutoSubMenuTimeCMOS,0,4,,default_automenudelay,WimpAutoSubMenuTimeCMOS,4,automenu_timelimit,x10
statusmess_automenudelay DCB "WimpAutoMenuDelay ",0
configmess_automenudelay DCB "WimpAutoMenuDelay <D>",cr,lf,0
ALIGN
WimpMenuDragDelayC_Code
ConfigOption menudragdelay,ds,WimpMenuDragDelayCMOS,0,4,,default_menudragdelay,WimpMenuDragDelayCMOS,4,menudragdelay,x10
statusmess_menudragdelay DCB "WimpMenuDragDelay ",0
configmess_menudragdelay DCB "WimpMenuDragDelay <D>",cr,lf,0
ALIGN
WimpIconBarSpeedC_Code
ConfigOption iconbarspeed,osupersec,WimpAutoSubMenuTimeCMOS,5,3,,default_iconbarspeed,,,iconbar_scroll_speed,,,iconbarlogtable,numeric
statusmess_iconbarspeed DCB "WimpIconBarSpeed ",0
configmess_iconbarspeed DCB "WimpIconBarSpeed <D>",cr,lf,0
ALIGN
WimpIconBarAccelerationC_Code
ConfigOption iconbaraccel,osupersec2,WimpMenuDragDelayCMOS,5,3,,default_iconbaraccel,,,iconbar_scroll_accel,,,iconbarlogtable,numeric
statusmess_iconbaraccel DCB "WimpIconBarAcceleration ",0
configmess_iconbaraccel DCB "WimpIconBarAcceleration <D>",cr,lf,0
ALIGN
[ SpritePriority
WimpSpritePrecedenceC_Code
ConfigOption sprite,,DesktopFeaturesCMOS,5,1,,0,,,preferredpool,,,status_ramrom
statusmess_sprite DCB "WimpSpritePrecedence ",0
configmess_sprite DCB "WimpSpritePrecedence RAM|ROM",cr,lf,0
ALIGN
]
[ BounceClose
WimpButtonTypeC_Code
ConfigOption button,,DesktopFeaturesCMOS,6,1,,0,,,buttontype,,B,status_clickrelease
statusmess_button DCB "WimpButtonType ",0
configmess_button DCB "WimpButtonType Click|Releease",cr,lf,0
configmess_button DCB "WimpButtonType Click|Release",cr,lf,0
ALIGN
]
[ IconiseButton
......@@ -1419,6 +1432,7 @@ WimpIconiseButtonC_Code
ConfigOption iconisebut,,WimpDragMoveLimitCMOS,7,1,,0,,,iconisebutton,,B,status_offon
statusmess_iconisebut DCB "WimpIconiseButton ",0
configmess_iconisebut DCB "WimpIconiseButton On|Off",cr,lf,0
ALIGN
]
[ StickyEdges
......@@ -1426,6 +1440,7 @@ WimpStickyEdgesC_Code
ConfigOption sticky,,DesktopFeaturesCMOS,6,1,,0,,,stickyedges,,B,status_offon
statusmess_sticky DCB "WimpStickyEdges ",0
configmess_sticky DCB "WimpStickyEdges On|Off",cr,lf,0
ALIGN
]
[ PoppingIconBar
......@@ -1433,11 +1448,13 @@ WimpAutoFrontIconBarC_Code
ConfigOption autofront,,WimpDoubleClickMoveLimitCMOS,7,1,,1,,,popiconbar,,B,status_offon
statusmess_autofront DCB "WimpAutoFrontIconBar ",0
configmess_autofront DCB "WimpAutoFrontIconBar On|Off",cr,lf,0
ALIGN
WimpAutoFrontDelayC_Code
ConfigOption autofrontdelay,ds,WimpDoubleClickTimeCMOS,4,4,,default_autofrontdelay,WimpDoubleClickMoveLimitCMOS,1,popiconbar_pause,x10
statusmess_autofrontdelay DCB "WimpAutoFrontDelay ",0
configmess_autofrontdelay DCB "WimpAutoFrontDelay <D>",cr,lf,0
ALIGN
]
[ Autoscr
......@@ -1445,9 +1462,16 @@ WimpAutoScrollDelayC_Code
ConfigOption scrolldelay,ds,WimpDragTimeCMOS,4,4,,default_autoscrolldelay,WimpDragMoveLimitCMOS,1,autoscr_default_pause,,B
statusmess_scrolldelay DCB "WimpAutoScrollDelay ",0
configmess_scrolldelay DCB "WimpAutoScrollDelay <D>",cr,lf,0
ALIGN
]
[ ClickSubmenus
WimpClickSubmenuC_Code
ConfigOption clicksubmenu,,Misc1CMOS,0,1,,0,,,clicksubmenuenable,,B,status_offon
statusmess_clicksubmenu DCB "WimpClickSubmenu ",0
configmess_clicksubmenu DCB "WimpClickSubmenu On|Off",cr,lr,0
ALIGN
]
|
......
......@@ -1342,6 +1342,10 @@ notdragging
LDR R1,automenu_timelimit
ADD R1,R1,R0 ; reset the time limit
STR R1,automenu_timeouttime
[ ClickSubmenus
MOV R14, #0
STRB R14, submenuopenedbyclick
]
01
CMP R3,#0
BLE %FT90
......
......@@ -435,7 +435,7 @@ int_seticonptrs ROUT
BGT %FT11
05
|
UpperCase R2,R14
ASCII_UpperCase R2,R14
Hex R2,R2 ; R2 = background colour
]
STRB R2,fontbackground
......@@ -458,7 +458,7 @@ int_seticonptrs ROUT
BGT %FT11
05
|
UpperCase R2,R14
ASCII_UpperCase R2,R14
Hex R2,R2 ; R2 = foreground colour
]
STRB R2,fontforeground
......
......@@ -4666,17 +4666,27 @@ scanmenus
TEQ R0,R4 ; are we on the same icon?
BEQ notinamenu
LDR R14, oldbuttons
BICS R14, R2, R14 ; if a click has occurred,
BNE %FT06 ; ignore the inactivity timeout
Push "R0"
SWI XOS_ReadMonotonicTime
LDR R14,automenu_inactivetimeout
CMP R0,R14 ; if in inactive period, ignore right arrows
Pull "R0" ; preserving R0
BLO notinamenu
06
SUBS R14,R0,R4 ; if not, check for timeout anyway
SUBS R14,R0,R4 ; if we've changed row, then definitely close submenu
BMI %FT01
CMP R14,#2
BGT %FT01 ; errr nigel?!?!?
BGT %FT01
[ ClickSubmenus
LDRB R14, submenuopenedbyclick
TEQ R14, #0 ; if we've opened a submenu using a click
BNE notinamenu ; then we want it to stay open
]
LDRB R14,sysflags
TST R14,#sysflags_automenu ; automatic-menu opening enabled?
......@@ -4685,11 +4695,9 @@ scanmenus
Push "R0"
SWI XOS_ReadMonotonicTime
LDR R14,automenu_timeouttime
CMP R0,R14 ; should I open the menu for them? (retard!)
CMP R0,R14 ; has the menu been opened for them?
Pull "R0"
MOVHI R4,R0
BHI notinamenu ; fake an arrow if so!
BHI notinamenu
01
MOV R0,R1 ; close that menu too if nec.
BL closemenus
......@@ -4721,19 +4729,24 @@ intopmenu
TEQ R4,R5 ; are we on the right-arrow?
BEQ %FT01 ; if not check for timeout anyway
Push "R14"
[ ClickSubmenus
LDRB R2, submenuopenedbyclick; if this is nonzero, then last time round someone clicked on
TEQ R2, #0 ; a menu item leading to a submenu, so we need to open it immediately
Push "R0,R14", NE
BNE %FT00
]
LDRB R2,sysflags
TST R2,#sysflags_automenu
Pull "R14",EQ ; if not auto menus then exit
BEQ exitscanmenu
BEQ exitscanmenu ; if not auto menus then exit
Push "R0"
Push "R0,R14"
LDR R2,automenu_timeouttime
SWI XOS_ReadMonotonicTime ; get the timeout and the time
CMP R0,R2
Pull "R0,R14",LO ; restore *ALL* pushed registers
BLO exitscanmenu ; if within the timeout then handle, else expire
00
SWI XOS_ReadMonotonicTime
LDR R2,menudragdelay
ADD R0,R0,R2
......@@ -4948,6 +4961,29 @@ gomenuselect
ADDS R4,R4,R4,ASL #1 ; multiply by 3
BMI clickongreyitem ; looks at button state
[ ClickSubmenus
LDRB R14, clicksubmenuenable
TEQ R14, #0 ; if not configured
BEQ notasubmenuclick ; then use traditional behaviour
ASSERT (mi_size=24)
ADR R0, menudata
LDR R0, [R0, R1] ; R0 -> menu data structure for current menu
ADD R0, R0, R4, LSL #3 ; add on R4*8, ie selection * 24
LDR R14, [R0, #mi_submenu]
CMP R14, #0 ; check that there is a submenu attached to this item
BLE notasubmenuclick ; if not, then proceed as normal
LDR R14, [R0, #mi_mflags]
LDR R0, [R0, #mi_iflags]
AND R14, R14, #mif_traverse
TST R0, #is_shaded ; if unshaded
TEQNE R14, #mif_traverse ; or traversable
MOVEQ R0, #1
STREQB R0, submenuopenedbyclick; then trigger an immediate auto-open next time round
Pull "R0-R4"
B leavescan
notasubmenuclick
]
LDR R14,[handle,#w_icons]
ADD R14,R14,#i_flags
LDR R14,[R14,R4,LSL #i_shift]
......
......@@ -1942,7 +1942,7 @@ getminmax ROUT
Pull "R1-R3,PC",VS
;
LDRB R3,[R1] ; if terminator is "K" or "k",
UpperCase R3, R14
ASCII_UpperCase R3, R14
TEQ R3,#"K"
ADDEQ R1,R1,#1
MOVEQ R2,R2,LSL #10 ; multiply by 1024
......
......@@ -1314,7 +1314,7 @@ getminmax ROUT
Pull "R1-R3,PC",VS
;
LDRB R3,[R1] ; if terminator is "K" or "k",
UpperCase R3, R14
ASCII_UpperCase R3, R14
TEQ R3,#"K"
ADDEQ R1,R1,#1
MOVEQ R2,R2,LSL #10 ; multiply by 1024
......
......@@ -294,8 +294,8 @@ checkspritenames ALTENTRY
MOVLE R3,#0
CMP R4,#32
MOVLE R4,#0 ; convert to terminators if required
LowerCase R3,LR
LowerCase R4,LR ; ensure that the characters are lower case
ASCII_LowerCase R3,LR
ASCII_LowerCase R4,LR ; ensure that the characters are lower case
CMP R3,R4 ; and that they match
EXIT NE ; returning if not the same
;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment