473 lines
17 KiB
OpenEdge ABL
473 lines
17 KiB
OpenEdge ABL
; do *NOT* use register4 to register7 during time slicing
|
|
textStr EQU register0
|
|
textNum EQU register0
|
|
textBak EQU register0
|
|
textHex EQU register1
|
|
textSpc EQU register1
|
|
textLen EQU register2
|
|
textOfs EQU register3
|
|
textChr EQU register8
|
|
textFont EQU register9
|
|
textSlice EQU register10
|
|
scanLine EQU register11
|
|
digitMult EQU register12
|
|
digitIndex EQU register13
|
|
clearLoop EQU register14
|
|
|
|
|
|
%SUB clearCursorRow
|
|
; clears the top giga_yfont lines of pixels in preparation of text scrolling
|
|
clearCursorRow PUSH
|
|
LDWI SYS_SetMemory_v2_54
|
|
STW giga_sysFn ; setup fill memory SYS routine
|
|
LD fgbgColour
|
|
ST giga_sysArg1 ; fill value
|
|
LDWI giga_videoTable
|
|
PEEK
|
|
ST giga_sysArg3 ; row0 high byte address
|
|
LDI giga_yfont
|
|
|
|
clearCR_loopy ST clearLoop
|
|
LDI giga_xres
|
|
ST giga_sysArg0
|
|
LDI 0
|
|
ST giga_sysArg2 ; low start address
|
|
SYS 54 ; fill memory
|
|
INC giga_sysArg3 ; next line
|
|
LD clearLoop
|
|
SUBI 1
|
|
BNE clearCR_loopy
|
|
%if TIME_SLICING
|
|
CALL realTimeStubAddr
|
|
%endif
|
|
LDWI printInit
|
|
CALL giga_vAC ; re-initialise the SYS registers
|
|
POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printInit
|
|
printInit LDWI SYS_VDrawBits_134
|
|
STW giga_sysFn
|
|
LDW fgbgColour
|
|
STW giga_sysArg0
|
|
LD cursorXY + 1 ; xy = peek(256+2*y)*256 + x
|
|
LSLW
|
|
INC giga_vAC + 1
|
|
PEEK
|
|
ST giga_sysArg4 + 1
|
|
LD cursorXY
|
|
ST giga_sysArg4 ; xy position
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printText
|
|
; prints text string pointed to by textStr
|
|
printText PUSH
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
|
|
; first byte is length
|
|
printT_char INC textStr ; next char
|
|
LDW textStr
|
|
PEEK
|
|
BEQ printT_exit ; check for delimiting zero
|
|
ST textChr
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
BRA printT_char
|
|
|
|
printT_exit POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printLeft
|
|
; prints left sub string pointed to by textStr
|
|
printLeft PUSH
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
LD textLen
|
|
BEQ printL_exit
|
|
|
|
printL_char ST textLen
|
|
INC textStr ; next char
|
|
LDW textStr
|
|
PEEK
|
|
ST textChr
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
|
|
LD textLen
|
|
SUBI 1
|
|
BNE printL_char
|
|
printL_exit POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printRight
|
|
; prints right sub string pointed to by textStr
|
|
printRight PUSH
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
LDW textStr
|
|
PEEK ; text length
|
|
ADDW textStr
|
|
SUBW textLen
|
|
STW textStr ; text offset
|
|
LD textLen
|
|
BEQ printR_exit
|
|
|
|
printR_char ST textLen
|
|
INC textStr ; next char
|
|
LDW textStr
|
|
PEEK
|
|
ST textChr
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
|
|
LD textLen
|
|
SUBI 1
|
|
BNE printR_char
|
|
printR_exit POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printMid
|
|
; prints sub string pointed to by textStr
|
|
printMid PUSH
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
LDW textStr
|
|
ADDW textOfs
|
|
STW textStr ; textStr += textOfs
|
|
LD textLen
|
|
BEQ printM_exit
|
|
|
|
printM_char ST textLen
|
|
INC textStr ; next char
|
|
LDW textStr
|
|
PEEK
|
|
ST textChr
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
|
|
LD textLen
|
|
SUBI 1
|
|
BNE printM_char
|
|
printM_exit POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printLower
|
|
; prints lower case version of textStr
|
|
printLower PUSH
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
|
|
printLo_next INC textStr ; next char, (skips length byte)
|
|
LDW textStr
|
|
PEEK
|
|
BEQ printLo_exit
|
|
ST textChr
|
|
SUBI 65
|
|
BLT printLo_char
|
|
LD textChr
|
|
SUBI 90
|
|
BGT printLo_char
|
|
LD textChr ; >= 65 'A' and <= 90 'Z'
|
|
ADDI 32
|
|
ST textChr
|
|
|
|
printLo_char LDWI printChar
|
|
CALL giga_vAC
|
|
BRA printLo_next
|
|
|
|
printLo_exit POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printUpper
|
|
; prints upper case version of textStr
|
|
printUpper PUSH
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
|
|
printUp_next INC textStr ; next char, (skips length byte)
|
|
LDW textStr
|
|
PEEK
|
|
BEQ printUp_exit
|
|
ST textChr
|
|
SUBI 97
|
|
BLT printUp_char
|
|
LD textChr
|
|
SUBI 122
|
|
BGT printUp_char
|
|
LD textChr ; >= 97 'a' and <= 122 'z'
|
|
SUBI 32
|
|
ST textChr
|
|
|
|
printUp_char LDWI printChar
|
|
CALL giga_vAC
|
|
BRA printUp_next
|
|
|
|
printUp_exit POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printDigit
|
|
; prints single digit in textNum
|
|
printDigit PUSH
|
|
LDW textNum
|
|
printD_index SUBW digitMult
|
|
BLT printD_cont
|
|
STW textNum
|
|
INC digitIndex
|
|
BRA printD_index
|
|
|
|
printD_cont LD digitIndex
|
|
BEQ printD_exit
|
|
ORI 0x30
|
|
ST textChr
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
LDI 0x30
|
|
ST digitIndex
|
|
printD_exit POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printInt16
|
|
; prints 16bit int in textNum
|
|
printInt16 PUSH
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
LDI 0
|
|
ST digitIndex
|
|
LDW textNum
|
|
BGE printI16_pos
|
|
LDI 0x2D
|
|
ST textChr
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
LDI 0
|
|
SUBW textNum
|
|
STW textNum
|
|
|
|
printI16_pos LDWI 10000
|
|
STW digitMult
|
|
LDWI printDigit
|
|
CALL giga_vAC
|
|
LDWI 1000
|
|
STW digitMult
|
|
LDWI printDigit
|
|
CALL giga_vAC
|
|
LDI 100
|
|
STW digitMult
|
|
LDWI printDigit
|
|
CALL giga_vAC
|
|
LDI 10
|
|
STW digitMult
|
|
LDWI printDigit
|
|
CALL giga_vAC
|
|
LD textNum
|
|
ORI 0x30
|
|
ST textChr
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printChr
|
|
; prints char in textChr for standalone calls
|
|
printChr PUSH
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printSpc
|
|
; prints textSpc spaces
|
|
printSpc PUSH
|
|
LD textSpc
|
|
BEQ printS_exit
|
|
LDWI printInit
|
|
CALL giga_vAC
|
|
|
|
printS_loop LDI 32
|
|
STW textChr
|
|
LDWI printChar
|
|
CALL giga_vAC
|
|
LD textSpc
|
|
SUBI 1
|
|
ST textSpc
|
|
BNE printS_loop
|
|
|
|
printS_exit POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printHex
|
|
; print textLen hex digits in textHex, (textStr, textHex, textLen = strAddr, strHex, strLen in string::stringHex)
|
|
printHex PUSH
|
|
LDWI textWorkArea
|
|
STW strAddr
|
|
LDWI stringHex
|
|
CALL giga_vAC
|
|
LDWI printText
|
|
CALL giga_vAC
|
|
POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB printChar
|
|
; prints char in textChr
|
|
printChar LD textChr
|
|
ANDI 0x7F ; char can't be bigger than 127
|
|
SUBI 82
|
|
BGE printC_text82
|
|
ADDI 50
|
|
BLT printC_exit ; char<32 exit
|
|
STW textChr ; char-32
|
|
LDWI giga_text32 ; text font slice base address for chars 32-81
|
|
BRA printC_font
|
|
|
|
printC_text82 STW textChr ; char-82
|
|
LDWI giga_text82 ; text font slice base address for chars 82+
|
|
|
|
printC_font STW textFont
|
|
LD textChr
|
|
LSLW
|
|
LSLW
|
|
ADDW textChr
|
|
ADDW textFont
|
|
STW textFont ; char*5 + textFont
|
|
LDI 0x05
|
|
|
|
printC_slice ST textSlice
|
|
LDW textFont ; text font slice base address
|
|
LUP 0x00 ; get ROM slice
|
|
ST giga_sysArg2
|
|
SYS 134 ; draw vertical slice, SYS_VDrawBits_134, 270 - 134/2 = 0xCB
|
|
INC textFont ; next vertical slice
|
|
INC giga_sysArg4 ; next x
|
|
LD textSlice
|
|
SUBI 1
|
|
BNE printC_slice
|
|
|
|
ST giga_sysArg2 ; result of printC_slice is 0
|
|
SYS 134 ; draw last blank slice
|
|
INC giga_sysArg4 ; using sysArg4 as a temporary cursor address for multiple char prints
|
|
|
|
PUSH
|
|
%if TIME_SLICING
|
|
CALL realTimeStubAddr
|
|
%endif
|
|
LDWI printClip
|
|
CALL giga_vAC
|
|
POP
|
|
|
|
printC_exit RET
|
|
%ENDS
|
|
|
|
%SUB printClip
|
|
printClip LD cursorXY
|
|
ADDI giga_xfont
|
|
ST cursorXY
|
|
SUBI giga_xres - giga_xfont ; last possible char on line
|
|
BLE printCl_exit
|
|
LDI DISABLE_CLIP_BIT
|
|
ANDW miscFlags ; is text clipping disabled?
|
|
BNE printCl_exit
|
|
PUSH
|
|
LDWI newLineScroll ; next row, scroll at bottom
|
|
CALL giga_vAC
|
|
POP
|
|
|
|
printCl_exit RET
|
|
%ENDS
|
|
|
|
%SUB newLineScroll
|
|
; print from top row to bottom row, then start scrolling
|
|
newLineScroll LDI giga_CursorX ; cursor x start
|
|
ST cursorXY
|
|
ST giga_sysArg4
|
|
LDI ENABLE_SCROLL_BIT
|
|
ANDW miscFlags
|
|
BNE newLS_cont0 ; is scroll on or off?
|
|
RET
|
|
|
|
newLS_cont0 PUSH
|
|
LDI ON_BOTTOM_ROW_BIT
|
|
ANDW miscFlags ; is on bottom row flag?
|
|
BNE newLS_cont1
|
|
LD cursorXY + 1
|
|
ADDI giga_yfont
|
|
ST cursorXY + 1
|
|
SUBI giga_yres
|
|
BLT newLS_exit
|
|
LDI giga_yres - giga_yfont
|
|
ST cursorXY + 1
|
|
|
|
newLS_cont1 LDWI clearCursorRow
|
|
CALL giga_vAC
|
|
LDWI giga_videoTable
|
|
STW scanLine
|
|
|
|
%if TIME_SLICING
|
|
newLS_scroll CALL realTimeStubAddr
|
|
LDW scanLine
|
|
%else
|
|
newLS_scroll LDW scanLine
|
|
%endif
|
|
PEEK
|
|
ADDI giga_yfont
|
|
ANDI 0x7F
|
|
SUBI giga_yfont
|
|
BGE newLS_adjust
|
|
ADDI giga_yfont
|
|
|
|
newLS_adjust ADDI giga_yfont
|
|
POKE scanLine
|
|
INC scanLine ; scanline pointers are 16bits
|
|
INC scanLine
|
|
LD scanLine
|
|
SUBI 0xF0 ; scanline pointers end at 0x01EE
|
|
BLT newLS_scroll
|
|
|
|
LDI ON_BOTTOM_ROW_BIT
|
|
ORW miscFlags
|
|
STW miscFlags ; set on bottom row flag
|
|
|
|
newLS_exit LDWI printInit
|
|
CALL giga_vAC ; re-initialise the SYS registers
|
|
POP
|
|
RET
|
|
%ENDS
|
|
|
|
%SUB atTextCursor
|
|
atTextCursor LD cursorXY
|
|
SUBI giga_xres - giga_xfont
|
|
BLE atTC_checkY
|
|
LDI 0
|
|
ST cursorXY
|
|
|
|
atTC_checkY LD cursorXY + 1
|
|
SUBI giga_yres - giga_yfont
|
|
BLT atTC_resbot
|
|
LDI giga_yres - giga_yfont
|
|
ST cursorXY + 1
|
|
LDI ON_BOTTOM_ROW_BIT
|
|
ORW miscFlags
|
|
STW miscFlags ; set on bottom row flag
|
|
RET
|
|
|
|
atTC_resbot LDWI ON_BOTTOM_ROW_MSK
|
|
ANDW miscFlags
|
|
STW miscFlags ; reset on bottom row flag
|
|
RET
|
|
%ENDS
|