295 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			295 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
; do *NOT* use register4 to register7 during time slicing
 | 
						|
inpLutAddr          EQU     register0
 | 
						|
inpKeyBak           EQU     register0
 | 
						|
inpVarsAddr         EQU     register1
 | 
						|
inpStrsAddr         EQU     register2
 | 
						|
inpTypesAddr        EQU     register3
 | 
						|
inpTextAddr         EQU     register8
 | 
						|
inpTextOfs          EQU     register9
 | 
						|
inpTypeData         EQU     register10
 | 
						|
inpPrnXYBak         EQU     register11
 | 
						|
inpCursXYBak        EQU     register12
 | 
						|
inpCursXYOfs        EQU     register13
 | 
						|
inpTextEnd          EQU     register14
 | 
						|
 | 
						|
    
 | 
						|
%SUB                input
 | 
						|
                    ; inputs numerics and text into vars
 | 
						|
input               PUSH
 | 
						|
                    STW     inpLutAddr
 | 
						|
                    DEEK
 | 
						|
                    STW     inpVarsAddr         ; vars LUT address
 | 
						|
                    LDW     inpLutAddr
 | 
						|
                    ADDI    2
 | 
						|
                    DEEK
 | 
						|
                    STW     inpStrsAddr         ; strings LUT address
 | 
						|
                    LDW     inpLutAddr
 | 
						|
                    ADDI    4
 | 
						|
                    DEEK
 | 
						|
                    STW     inpTypesAddr        ; types LUT address
 | 
						|
 | 
						|
                    LDWI    ENABLE_SCROLL_MSK
 | 
						|
                    ANDW    miscFlags
 | 
						|
                    STW     miscFlags           ; disable text scrolling
 | 
						|
                    
 | 
						|
                    LD      giga_serialRaw
 | 
						|
                    ST      serialRawPrev       ; initialise previous keystroke
 | 
						|
                    CALLI   inputExt1           ; doesn't return to here
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                inputExt1
 | 
						|
                    ; input extended 1
 | 
						|
inputExt1           LDW     inpTypesAddr
 | 
						|
                    DEEK
 | 
						|
                    BEQ     inputE1_exit        ; exit on LUT delimiter
 | 
						|
                    STW     inpTypeData         ; high byte is max string length, 8th and 7th bits of low byte are newlines, last 6 bits of low byte is type
 | 
						|
                    ANDI    0x40
 | 
						|
                    BEQ     inputE1_print       ; check for prefix newline
 | 
						|
                    CALLI   inputNewline        ; registers don't need to be saved yet
 | 
						|
                    
 | 
						|
inputE1_print       CALLI   saveRegs
 | 
						|
                    LDW     inpStrsAddr
 | 
						|
                    DEEK
 | 
						|
                    CALLI   printText           ; print strings LUT
 | 
						|
                    CALLI   loadRegs
 | 
						|
                    LD      inpTypeData
 | 
						|
                    ANDI    0x80
 | 
						|
                    BEQ     inputE1_skip        ; check for suffix newline
 | 
						|
                    CALLI   inputNewline        ; registers don't need to be saved yet
 | 
						|
                    
 | 
						|
inputE1_skip        LDWI    textWorkArea + 1
 | 
						|
                    STW     inpTextAddr         ; text work area, treated as a string so skip length
 | 
						|
                    LDI     0
 | 
						|
                    STW     inpTextOfs          ; print text offset
 | 
						|
                    LDWI    textWorkArea
 | 
						|
                    STW     inpTextEnd          ; print text end
 | 
						|
                    LD      inpTypeData + 1
 | 
						|
                    ADDW    inpTextEnd
 | 
						|
                    STW     inpTextEnd          ; text max = textWorkArea + (highByte(inpTypeData) >> 8)
 | 
						|
                    
 | 
						|
                    LDW     cursorXY
 | 
						|
                    STW     inpCursXYBak
 | 
						|
                    STW     inpPrnXYBak
 | 
						|
                    CALLI   inputExt2           ; doesn't return to here
 | 
						|
 | 
						|
inputE1_exit        LDI     ENABLE_SCROLL_BIT
 | 
						|
                    ORW     miscFlags
 | 
						|
                    STW     miscFlags           ; enable text scrolling
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                inputExt2
 | 
						|
                    ; input extended 2
 | 
						|
inputExt2           CALLI   saveRegs
 | 
						|
                    LDI     127
 | 
						|
                    STW     textChr
 | 
						|
                    CALLI   inputCursor
 | 
						|
                    CALLI   loadRegs
 | 
						|
                    CALLI   inputKeys
 | 
						|
                    BEQ     inputExt2           ; loop until return key pressed
 | 
						|
 | 
						|
                    INC     inpVarsAddr
 | 
						|
                    INC     inpVarsAddr
 | 
						|
                    INC     inpStrsAddr
 | 
						|
                    INC     inpStrsAddr
 | 
						|
                    INC     inpTypesAddr
 | 
						|
                    INC     inpTypesAddr
 | 
						|
                    CALLI   inputExt1           ; doesn't return to here
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                inputCursor
 | 
						|
                    ; draws cursor
 | 
						|
inputCursor         PUSH
 | 
						|
                    XORI    127
 | 
						|
                    BNE     inputC_skip         ; don't flash cursor if char != 127
 | 
						|
                    LD      giga_ledState
 | 
						|
                    ANDI    2
 | 
						|
                    BNE     inputC_skip         ; use ledState as a hack timer
 | 
						|
                    LDI     32
 | 
						|
                    STW     textChr             ; alternate between 32 and 127
 | 
						|
 | 
						|
inputC_skip         LDW     inpCursXYBak
 | 
						|
                    STW     cursorXY            ; restore cursor position after the printChr
 | 
						|
                    LDW     textChr
 | 
						|
                    CALLI   printChr
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                inputKeys
 | 
						|
                    ; saves key press into string work area buffer
 | 
						|
inputKeys           PUSH
 | 
						|
                    LD      giga_serialRaw
 | 
						|
                    STW     inpKeyBak           ; save keystroke
 | 
						|
                    LD      serialRawPrev
 | 
						|
                    SUBW    inpKeyBak
 | 
						|
                    BEQ     inputK_exit         ; if keystroke hasn't changed exit
 | 
						|
                    LD      inpKeyBak
 | 
						|
                    ST      serialRawPrev       ; save as previous keystroke
 | 
						|
                    SUBI    127
 | 
						|
                    BGT     inputK_exit
 | 
						|
                    BNE     inputK_ret
 | 
						|
                    CALLI   inputDelete         ; delete key, doesn't return to here
 | 
						|
                    
 | 
						|
inputK_ret          LD      inpKeyBak
 | 
						|
                    SUBI    10
 | 
						|
                    BNE     inputK_char
 | 
						|
                    CALLI   inputReturn         ; return key, doesn't return to here
 | 
						|
                    
 | 
						|
inputK_char         LDW     inpTextEnd
 | 
						|
                    SUBW    inpTextAddr
 | 
						|
                    BEQ     inputK_exit         ; text string bounds, (check after delete and return keys)
 | 
						|
                    LD      inpKeyBak
 | 
						|
                    SUBI    32
 | 
						|
                    BLT     inputK_exit
 | 
						|
                    LD      inpKeyBak
 | 
						|
                    POKE    inpTextAddr         ; set char
 | 
						|
                    INC     inpTextAddr
 | 
						|
                    LDI     0
 | 
						|
                    POKE    inpTextAddr         ; set new end of text string
 | 
						|
                    LD      inpCursXYBak
 | 
						|
                    SUBI    giga_xres - 11
 | 
						|
                    BLT     inputK_advance      ; cursor max bounds
 | 
						|
                    INC     inpTextOfs
 | 
						|
                    LDI     0
 | 
						|
                    BRA     inputK_print
 | 
						|
                    
 | 
						|
inputK_advance      LDI     6
 | 
						|
                    
 | 
						|
inputK_print        STW     inpCursXYOfs        ; advance cursor
 | 
						|
                    CALLI   inputPrint          ; doesn't return to here
 | 
						|
                    
 | 
						|
inputK_exit         LDI     0                   ; keep looping on current var
 | 
						|
                    POP
 | 
						|
                    RET                    
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                inputIntVar
 | 
						|
inputIntVar         PUSH
 | 
						|
                    LDWI    textWorkArea + 1
 | 
						|
                    STW     intSrcAddr          ; src str address, (skip length)
 | 
						|
                    LDW     inpVarsAddr
 | 
						|
                    DEEK
 | 
						|
                    STW     register12          ; dst int address
 | 
						|
                    CALLI   integerStr
 | 
						|
                    DOKE    register12          ; convert string to integer
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                inputStrVar
 | 
						|
inputStrVar         LDWI    textWorkArea
 | 
						|
                    STW     register11          ; src str address
 | 
						|
                    LDW     inpVarsAddr
 | 
						|
                    DEEK
 | 
						|
                    STW     register12          ; dst var address
 | 
						|
 | 
						|
inputS_copy         LDW     register11
 | 
						|
                    PEEK
 | 
						|
                    POKE    register12
 | 
						|
                    INC     register11
 | 
						|
                    INC     register12
 | 
						|
                    BNE     inputS_copy         ; copy char until terminating char
 | 
						|
                    RET
 | 
						|
%ENDS                    
 | 
						|
 | 
						|
%SUB                inputReturn
 | 
						|
inputReturn         CALLI   saveRegs
 | 
						|
                    LDI     32
 | 
						|
                    STW     textChr
 | 
						|
                    CALLI   inputCursor
 | 
						|
                    CALLI   loadRegs
 | 
						|
                    LDWI    textWorkArea
 | 
						|
                    STW     register0
 | 
						|
                    LDW     inpTextAddr
 | 
						|
                    SUBW    register0
 | 
						|
                    SUBI    1
 | 
						|
                    POKE    register0           ; text length
 | 
						|
                    ADDW    register0
 | 
						|
                    ADDI    1
 | 
						|
                    STW     register0
 | 
						|
                    LDI     0
 | 
						|
                    POKE    register0           ; text delimiter
 | 
						|
                    LD      inpTypeData         ; check var tye
 | 
						|
                    ANDI    0x3F                ; var type is bottom 6 bits
 | 
						|
                    SUBI    5                   ; var is string or integer?
 | 
						|
                    BNE     inputR_int
 | 
						|
                    CALLI   inputStrVar         ; copy string
 | 
						|
                    BRA     inputR_exit
 | 
						|
                    
 | 
						|
inputR_int          CALLI   inputIntVar         ; convert numeric
 | 
						|
 | 
						|
inputR_exit         LDI     1                   ; return key pressed, next var
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                inputDelete
 | 
						|
inputDelete         LD      inpTextOfs
 | 
						|
                    BEQ     inputD_bounds
 | 
						|
                    SUBI    1
 | 
						|
                    STW     inpTextOfs          ; decrement print text offset
 | 
						|
                    LDI     0
 | 
						|
                    STW     inpCursXYOfs        ; stationary cursor
 | 
						|
                    LDI     0
 | 
						|
                    POKE    inpTextAddr         ; delimiter
 | 
						|
                    LDW     inpTextAddr
 | 
						|
                    SUBI    1
 | 
						|
                    STW     inpTextAddr         ; decrement text pointer
 | 
						|
                    LDI     32                  
 | 
						|
                    POKE    inpTextAddr         ; delete char
 | 
						|
                    BRA     inputD_print
 | 
						|
 | 
						|
inputD_bounds       LDW     inpPrnXYBak
 | 
						|
                    SUBW    inpCursXYBak
 | 
						|
                    BGE     inputD_exit         ; cursor min bounds
 | 
						|
                    LDWI    -6
 | 
						|
                    STW     inpCursXYOfs        ; retreat cursor
 | 
						|
                    LDI     32                  
 | 
						|
                    POKE    inpTextAddr         ; delete cursor
 | 
						|
                    INC     inpTextAddr
 | 
						|
                    LDI     0
 | 
						|
                    POKE    inpTextAddr         ; delimiter
 | 
						|
                    LDW     inpTextAddr
 | 
						|
                    SUBI    2
 | 
						|
                    STW     inpTextAddr         ; decrement text pointer
 | 
						|
                    LDI     32                  
 | 
						|
                    POKE    inpTextAddr         ; delete char
 | 
						|
                    
 | 
						|
inputD_print        CALLI   inputPrint          ; doesn't return to here
 | 
						|
                    
 | 
						|
inputD_exit         LDI     0                   ; keep looping on current var
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                inputPrint
 | 
						|
inputPrint          LDW     inpPrnXYBak
 | 
						|
                    STW     cursorXY            ; restore cursor position after the printText
 | 
						|
                    CALLI   saveRegs
 | 
						|
                    LDWI    textWorkArea
 | 
						|
                    ADDW    inpTextOfs
 | 
						|
                    CALLI   printText
 | 
						|
                    CALLI   loadRegs
 | 
						|
                    LDW     inpCursXYBak        ; new cursor position
 | 
						|
                    ADDW    inpCursXYOfs
 | 
						|
                    STW     inpCursXYBak
 | 
						|
                    LDI     0                   ; keep looping on current var
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS                    
 | 
						|
 | 
						|
%SUB                inputNewline
 | 
						|
inputNewline        PUSH
 | 
						|
                    LDI     ENABLE_SCROLL_BIT
 | 
						|
                    ORW     miscFlags
 | 
						|
                    STW     miscFlags           ; enable text scrolling
 | 
						|
                    CALLI   newLineScroll       ; new line
 | 
						|
                    LDWI    ENABLE_SCROLL_MSK
 | 
						|
                    ANDW    miscFlags
 | 
						|
                    STW     miscFlags           ; disable text scrolling
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 |