gigatron/rom/Contrib/at67/gbas/runtime/memory_ROMv5a.i
2025-01-28 19:17:01 +03:00

250 lines
7.5 KiB
OpenEdge ABL

cpySrcAddr EQU register0
cpyDstAddr EQU register1
cpyCount EQU register2
cpyLoaderLut EQU register3
regsWork EQU giga_sysArg4 ; use SYS arg registers to stop conflicts with time slicing/vblanks
regsAddr EQU giga_sysArg6 ; use SYS arg registers to stop conflicts with time slicing/vblanks
%SUB loadRegs
; hard coded to save register8 to register15
loadRegs LDWI regsWorkArea
STW regsWork
LDI register8
STW regsAddr
loadRegs_loop LDW regsWork
DEEK
DOKE regsAddr
INC regsAddr
INC regsAddr
INC regsWork
INC regsWork
LDW regsAddr
SUBI register15
BLE loadRegs_loop
RET
%ENDS
%SUB saveRegs
; hard coded to load register8 to register15
saveRegs LDWI regsWorkArea
STW regsWork
LDI register8
STW regsAddr
saveRegs_loop LDW regsAddr
DEEK
DOKE regsWork
INC regsWork
INC regsWork
INC regsAddr
INC regsAddr
LDW regsAddr
SUBI register15
BLE saveRegs_loop
RET
%ENDS
%SUB getArrayByte
; get 8bit value from array
getArrayByte LDW memAddr
ADDW memIndex0
PEEK
RET
%ENDS
%SUB setArrayByte
; set 8bit value from array
setArrayByte LDW memAddr
ADDW memIndex0
STW memAddr
LDW memValue
POKE memAddr
RET
%ENDS
%SUB getArrayInt16
; get 16bit value from array
getArrayInt16 LDW memAddr
ADDW memIndex0
ADDW memIndex0
DEEK
RET
%ENDS
%SUB setArrayInt16
; set 16bit value from array
setArrayInt16 LDW memAddr
ADDW memIndex0
ADDW memIndex0
STW memAddr
LDW memValue
DOKE memAddr
RET
%ENDS
%SUB getArrayInt16Low
; get low byte from 16bit array value
getArrayInt16Low LDW memAddr
ADDW memIndex0
ADDW memIndex0
PEEK
RET
%ENDS
%SUB setArrayInt16Low
; set low byte from 16bit array value
setArrayInt16Low LDW memAddr
ADDW memIndex0
ADDW memIndex0
STW memAddr
LDW memValue
POKE memAddr
RET
%ENDS
%SUB getArrayInt16High
; get High byte from 16bit array value
getArrayInt16High LDW memAddr
ADDW memIndex0
ADDW memIndex0
ADDI 1
PEEK
RET
%ENDS
%SUB setArrayInt16High
; set High byte from 16bit array value
setArrayInt16High LDW memAddr
ADDW memIndex0
ADDW memIndex0
ADDI 1
STW memAddr
LDW memValue
POKE memAddr
RET
%ENDS
%SUB convert8Arr2d
convert8Arr2d ADDW memIndex0
ADDW memIndex0
DEEK
ADDW memIndex1
STW memAddr
RET
%ENDS
%SUB convert8Arr3d
convert8Arr3d ADDW memIndex0
ADDW memIndex0
DEEK
ADDW memIndex1
ADDW memIndex1
DEEK
ADDW memIndex2
STW memAddr
RET
%ENDS
%SUB convert16Arr2d
convert16Arr2d ADDW memIndex0
ADDW memIndex0
DEEK
ADDW memIndex1
ADDW memIndex1
STW memAddr
RET
%ENDS
%SUB convert16Arr3d
convert16Arr3d ADDW memIndex0
ADDW memIndex0
DEEK
ADDW memIndex1
ADDW memIndex1
DEEK
ADDW memIndex2
ADDW memIndex2
STW memAddr
RET
%ENDS
%SUB readIntVar
readIntVar LDWI _dataIndex_
STW memAddr
DEEK
STW memIndex0
ADDI 1
DOKE memAddr
LDWI _data_
ADDW memIndex0
ADDW memIndex0
DEEK
RET
%ENDS
%SUB readStrVar
readStrVar PUSH
CALLI readIntVar
STW strSrcAddr
CALLI stringCopy
POP
RET
%ENDS
%SUB copyBytes
copyBytes LDW cpySrcAddr
PEEK
POKE cpyDstAddr
INC cpySrcAddr
INC cpyDstAddr
LDW cpyCount
SUBI 1
STW cpyCount
BGT copyBytes
RET
%ENDS
%SUB copyWords
copyWords LDW cpySrcAddr
DEEK
DOKE cpyDstAddr
INC cpySrcAddr
INC cpySrcAddr
INC cpyDstAddr
INC cpyDstAddr
LDW cpyCount
SUBI 1
STW cpyCount
BGT copyWords
RET
%ENDS
%SUB copyLoaderImages
copyLoaderImages PUSH
LDWI _loader_image_chunksLut
STW cpyLoaderLut
copyLI_loop LDW cpyLoaderLut
DEEK
BEQ copyLI_exit
STW cpySrcAddr
INC cpyLoaderLut
INC cpyLoaderLut
LDW cpyLoaderLut
DEEK
STW cpyDstAddr
INC cpyLoaderLut
INC cpyLoaderLut
LDW cpyLoaderLut
PEEK
STW cpyCount
INC cpyLoaderLut
CALLI copyBytes
BRA copyLI_loop
copyLI_exit POP
RET
%ENDS