2018-08-07 02:14:36 +00:00
|
|
|
#ifndef __COMMON_H
|
|
|
|
#define __COMMON_H
|
|
|
|
|
2018-08-07 13:30:11 +00:00
|
|
|
; Using four byte quantities aabbccdd with sign bit, overflow bit, 20 bits significand, 10 bits
|
|
|
|
; fraction. The quantity is valid if the overflow bit agrees with the sign bit. The intent is
|
2018-08-07 10:38:40 +00:00
|
|
|
; to be able to recognize an overflow/underflow situation, rescale the arguments, and repeat the
|
|
|
|
; calculation.
|
2018-08-07 02:14:36 +00:00
|
|
|
|
2018-09-01 14:40:57 +00:00
|
|
|
; Largest value: $3fffffff or +1048575.999(5)
|
|
|
|
; Plus one: $00000400
|
|
|
|
; Zero: $00000000
|
2018-09-12 00:40:28 +00:00
|
|
|
; Minus one: $fffffc00
|
2018-09-01 14:40:57 +00:00
|
|
|
; Smallest value: $c0000000 or -1048576.000(0)
|
2018-08-07 02:14:36 +00:00
|
|
|
|
|
|
|
; Instructions
|
|
|
|
|
|
|
|
; SET r aabbcc.dd 1r dd cc bb aa Rr <- aabbccdd - set register
|
2018-09-08 10:41:37 +00:00
|
|
|
; LDD r xxyy 2r yy xx Rr <- (xxyy) - load register directly from address
|
|
|
|
; SVD r xxyy 3r yy xx (xxyy) <- Rr - save register directly to address
|
|
|
|
; PSH r 4r RS <- Rr - push onto stack
|
|
|
|
; POP r 5r Rr <- RS - pop from stack
|
|
|
|
; EXC r 6r Rr <-> RS - exchange Rr with stack
|
|
|
|
; INR r 7r Rr <- Rr + 1.0 - increment register
|
|
|
|
; DCR r 8r Rr <- Rr - 1.0 - decrement register
|
2018-09-01 14:40:57 +00:00
|
|
|
; TST r 9r F <- Rr <=> 0.0 - test register
|
2018-08-07 02:14:36 +00:00
|
|
|
; ADD r pq ar pq Rr <- Rp + Rq - addition
|
|
|
|
; SUB r pq br pq Rr <- Rp - Rq - subtraction
|
|
|
|
; MUL r pq cr pq Rr <- Rp * Rq - multiplication
|
|
|
|
; DIV r pq dr pq Rr <- Rp / Rq - division
|
|
|
|
; MOD r pq er pq Rr <- Rp % Rq - modulus
|
|
|
|
; EXT z ... fz ... - system and user defined functions
|
|
|
|
; ESC 00 - escape back into regular assembler
|
|
|
|
; RTN 01 - return from subroutine
|
|
|
|
; BRS xxyy 02 yy xx PC <- PC + xxyy - branch to subroutine
|
|
|
|
; BRA xxyy 03 yy xx PC <- PC + xxyy - branch always
|
|
|
|
; BRE xxyy 04 yy xx PC <- PC + xxyy - branch if Rp = Rq (after CMR)
|
|
|
|
; BRG xxyy 05 yy xx PC <- PC + xxyy - branch if Rp > Rq (after CMR)
|
|
|
|
; BRL xxyy 06 yy xx PC <- PC + xxyy - branch if Rp < Rq (after CMR)
|
|
|
|
; BRZ xxyy 07 yy xx PC <- PC + xxyy - branch if Rr = 0.0 (after TST)
|
|
|
|
; BRP xxyy 08 yy xx PC <- PC + xxyy - branch if Rr > 0.0 (after TST)
|
|
|
|
; BRN xxyy 09 yy xx PC <- PC + xxyy - branch if Rr < 0.0 (after TST)
|
|
|
|
; BRO xxyy 0a yy xx PC <- PC + xxyy - branch if overflow (after arithmetic operations)
|
|
|
|
; BRU xxyy 0b yy xx PC <- PC + xxyy - branch if underflow (after arithmetic operations)
|
|
|
|
; CPR pq 0c pq Rp <- Rq - copy register
|
2019-03-30 13:31:51 +00:00
|
|
|
; LDI pq 0d pq Rp <- (int(Rq)) - load indirect via allocated memory offset
|
|
|
|
; SVI pq 0e pq (int(Rp)) <- Rq - save indirect via allocated memory offset
|
2018-08-07 02:14:36 +00:00
|
|
|
; CMR pq 0f pq F <- Rp <=> Rq - compare registers
|
|
|
|
|
2019-03-31 22:36:58 +00:00
|
|
|
; 32 bytes in page zero for memory map allocation
|
|
|
|
_MAP = _R0 - 256 / 8
|
|
|
|
|
2018-08-21 13:14:16 +00:00
|
|
|
; 40 bytes in page zero for common registers
|
2018-10-30 07:38:42 +00:00
|
|
|
_R0 = $100 - 4 * (10 + 10)
|
2018-08-07 02:14:36 +00:00
|
|
|
_R1 = _R0 + 4
|
|
|
|
_R2 = _R1 + 4
|
|
|
|
_R3 = _R2 + 4
|
|
|
|
_R4 = _R3 + 4
|
|
|
|
_R5 = _R4 + 4
|
|
|
|
_R6 = _R5 + 4
|
|
|
|
_R7 = _R6 + 4
|
|
|
|
_R8 = _R7 + 4
|
|
|
|
_R9 = _R8 + 4
|
|
|
|
|
2018-10-30 07:38:42 +00:00
|
|
|
; 40 bytes in page zero for internal registers
|
2018-10-05 01:03:55 +00:00
|
|
|
_I0 = _R9 + 4 ; workspace
|
2018-08-21 13:14:16 +00:00
|
|
|
_I1 = _I0 + 4
|
|
|
|
_I2 = _I1 + 4
|
|
|
|
_I3 = _I2 + 4
|
|
|
|
_I4 = _I3 + 4
|
|
|
|
_I5 = _I4 + 4
|
2018-09-08 10:41:37 +00:00
|
|
|
_I6 = _I5 + 4 ; register I6 maintains common status
|
2018-10-30 07:38:42 +00:00
|
|
|
_I7 = _I6 + 4 ; register I7 maintains locations of process and allocated memory
|
|
|
|
_I8 = _I7 + 4 ; register I8 maintains process information for context switching
|
|
|
|
_I9 = _I8 + 4 ; register I9 saves/restores processor status
|
2018-08-21 13:14:16 +00:00
|
|
|
|
|
|
|
; register I6 maintains common status
|
2018-08-07 02:14:36 +00:00
|
|
|
; (dd cc bb aa) aa: index for register stack RS / ccbb: program counter PC / dd: flags F UONPZLGE
|
2018-09-08 10:41:37 +00:00
|
|
|
_RSI = _I6 ; register stack index
|
|
|
|
_PCL = _RSI + 1 ; program counter low
|
|
|
|
_PCH = _PCL + 1 ; program counter high
|
|
|
|
_F = _PCH + 1 ; flags
|
|
|
|
_PC = _PCL ; program counter
|
2018-08-07 02:14:36 +00:00
|
|
|
|
|
|
|
; bits for flags
|
2018-09-08 10:41:37 +00:00
|
|
|
_F_E = 1 ; if Rp = Rq (after CMP)
|
|
|
|
_F_G = 2 ; if Rp > Rq (after CMP)
|
|
|
|
_F_L = 4 ; if Rp < Rq (after CMP)
|
|
|
|
_F_Z = 8 ; if Rr = 0.0 (after TST)
|
|
|
|
_F_P = 16 ; if Rr > 0.0 (after TST)
|
|
|
|
_F_N = 32 ; if Rr < 0.0 (after TST)
|
|
|
|
_F_O = 64 ; if overflow (after arithmetic operations)
|
|
|
|
_F_U = 128 ; if underflow (after arithmetic operations)
|
2018-08-07 02:14:36 +00:00
|
|
|
|
2019-03-30 02:22:15 +00:00
|
|
|
; register I7 maintains locations of code and allocated real memory addresses
|
|
|
|
_CRL = _I7 ; code low and high bytes
|
|
|
|
_CRH = _CRL + 1
|
|
|
|
_ARL = _CRH + 1 ; allocated low and high bytes
|
|
|
|
_ARH = _ARL + 1
|
|
|
|
_CR = _CRL ; code real memory address
|
|
|
|
_AR = _ARL ; allocated real memory address
|
2018-10-30 07:38:42 +00:00
|
|
|
|
|
|
|
; register I8 maintains process information for context switching
|
2019-03-30 13:31:51 +00:00
|
|
|
_PSO = _I8 ; offset to running processes table
|
2019-03-30 02:22:15 +00:00
|
|
|
_PSF = _PSO + 1 ; initial running process status PPPCCCLF
|
2019-03-30 13:31:51 +00:00
|
|
|
_PST = _PSF + 1 ; current process status
|
|
|
|
_PSI = _PST + 1 ; process stack index to save/restore
|
2018-10-05 01:03:55 +00:00
|
|
|
|
2018-10-30 07:38:42 +00:00
|
|
|
; register I9 saves/restores processor status
|
2018-08-07 02:14:36 +00:00
|
|
|
; (dd cc bb aa) aa: accumulator, bb: index X, cc: index Y, dd: processor status
|
2018-10-30 07:38:42 +00:00
|
|
|
_ACC = _I9 ; saved accumulator to restore
|
2018-09-08 10:41:37 +00:00
|
|
|
_IDX = _ACC + 1 ; saved index X to restore
|
|
|
|
_IDY = _IDX + 1 ; saved index Y to restore
|
|
|
|
_PS = _IDY + 1 ; saved processor status to restore
|
2018-08-07 02:14:36 +00:00
|
|
|
|
2018-10-05 01:03:55 +00:00
|
|
|
; 6502 stack resides on page one
|
|
|
|
|
|
|
|
; using some of page two for register stack
|
2018-09-08 10:41:37 +00:00
|
|
|
_RS = $200 ; register stack
|
2018-10-05 01:03:55 +00:00
|
|
|
_RSS = _R0 ; register stack size
|
|
|
|
|
|
|
|
; for context switching, _R0 to _RS + _RSS - 1 needs to be saved and restored
|
|
|
|
; this should comprise two pages or 512 bytes
|
2018-08-07 02:14:36 +00:00
|
|
|
|
2019-03-30 02:22:15 +00:00
|
|
|
; the following are common process table and system & user functions
|
2018-09-20 02:24:23 +00:00
|
|
|
|
2019-03-30 02:22:15 +00:00
|
|
|
; process information in the middle of page two
|
|
|
|
_RP = _RS + _RSS ; running processes table
|
|
|
|
_RPS = FN_FX - _RP ; running process table size
|
|
|
|
|
|
|
|
; process information indices
|
|
|
|
_RPV_I = 0 ; 4 bytes virtual memory address
|
|
|
|
_RPR_I = _RPV_I + 4 ; 2 bytes real memory address
|
2019-03-30 13:31:51 +00:00
|
|
|
_RPS_I = _RPR_I + 2 ; 1 byte size in pages: code + allocated memory + context switching
|
|
|
|
_RPF_I = _RPS_I + 1 ; 1 byte status PPPCCCLF: P priority / C counter / L loaded / F finished
|
2019-03-30 02:22:15 +00:00
|
|
|
|
2019-03-31 22:36:58 +00:00
|
|
|
; bits for status
|
|
|
|
_S_L = 1 ; if program is loaded in memory
|
|
|
|
_S_F = 2 ; if program is finished
|
|
|
|
|
2019-03-30 02:22:15 +00:00
|
|
|
_RPE = _RPF_I + 1 ; size of running process entry
|
|
|
|
_RPL = _RPS / _RPE ; number of running processes limit
|
|
|
|
|
|
|
|
; last 32 bytes of page two
|
2018-10-05 01:03:55 +00:00
|
|
|
FN_FX = $300 - 2 * 16 ; list of system and user functions
|
2018-08-07 02:14:36 +00:00
|
|
|
|
|
|
|
; function constants
|
|
|
|
_ESC_C = $00
|
|
|
|
_RTN_C = $01
|
|
|
|
_BRS_C = $02
|
|
|
|
_BRA_C = $03
|
|
|
|
_BRE_C = $04
|
|
|
|
_BRG_C = $05
|
|
|
|
_BRL_C = $06
|
|
|
|
_BRZ_C = $07
|
|
|
|
_BRP_C = $08
|
|
|
|
_BRN_C = $09
|
|
|
|
_BRO_C = $0a
|
|
|
|
_BRU_C = $0b
|
|
|
|
_CPR_C = $0c
|
|
|
|
_LDI_C = $0d
|
|
|
|
_SVI_C = $0e
|
|
|
|
_CMR_C = $0f
|
|
|
|
|
|
|
|
_SET_C = $10
|
2018-09-08 10:41:37 +00:00
|
|
|
_LDD_C = $20
|
|
|
|
_SVD_C = $30
|
|
|
|
_PSH_C = $40
|
|
|
|
_POP_C = $50
|
|
|
|
_EXC_C = $60
|
|
|
|
_INR_C = $70
|
|
|
|
_DCR_C = $80
|
2018-09-01 14:40:57 +00:00
|
|
|
_TST_C = $90
|
2018-08-07 02:14:36 +00:00
|
|
|
_ADD_C = $a0
|
|
|
|
_SUB_C = $b0
|
|
|
|
_MUL_C = $c0
|
|
|
|
_DIV_C = $d0
|
|
|
|
_MOD_C = $e0
|
|
|
|
_EXT_C = $f0
|
|
|
|
|
|
|
|
; common constants
|
2018-09-08 10:41:37 +00:00
|
|
|
_MSK_O = %11000000 ; mask for overflow
|
|
|
|
_MSK_R = %00111100 ; mask for registers
|
2018-10-30 07:38:42 +00:00
|
|
|
_MSK_T = (_F_Z + _F_P + _F_N) ^ $ff ; mask for TST
|
|
|
|
_MSK_C = (_F_E + _F_G + _F_L) ^ $ff ; mask for CMP
|
2018-08-08 01:36:06 +00:00
|
|
|
|
2018-08-07 02:14:36 +00:00
|
|
|
#endif /* __COMMON_H */
|