<<------------------------->>

<< so we assemble our file >>

<<------------------------->>

james@server:~/0x10c-build> cat kcall.dasm16

; random stuff here

SET J, 7

ADD I, 3

SET A, 0x1000

SET B, 0x1001

SET C, 0x1002

SET PUSH, 0x1004

SET PUSH, 0x1005

SET PUSH, 0x1006

; do a kernel call

.CALL _stubapi_malloc

; more user code

SET [A+0], 0x1

SET [A+1], 0x2

SET [A+2], 0x3

SET [A+3], 0x4

SET [A+4], 0x5

SET [A+5], 0x6

SET [A+6], 0x7

SET [A+7], 0x8

james@server:~/0x10c-build> dtasm/dtasm -o kcall.dobj16 kcall.dasm16

warning: expressions will not be adjusted at link or relocation time. ensure labels are not used as part of expressions.

<<------------------------------------------->>

<< now we have a policy that uses stack-call >>

<<------------------------------------------->>

james@server:~/0x10c-build> cat policy

defaults

{

kernel=/home/james/0x10c-build/kernel/stubsys.dkrn16

symbols=/home/james/0x10c-build/kernel/stubsys.dsym16

direct=false

# use pure stack calling conventioncat

interrupt-call=stack-call

# interrupt call mappings

interrupt-call(_stubapi_malloc)=0x4001

interrupt-call(_stubapi_free)=0x4002

interrupt-call(_stubapi_errno)=0x4003

interrupt-call(_stubapi_exit)=0x4004

interrupt-size(_stubapi_malloc)=6

interrupt-size(_stubapi_free)=1

interrupt-size(_stubapi_errno)=0

interrupt-size(_stubapi_exit)=1

}

format(image):

offset 0x1000

chain image-direct

format(image-direct):

write code

<<--------------------------->>

<< and this is the result... >>

<<--------------------------->>

james@server:~/0x10c-build> dtld/dtld -p policy -o kcall.dcpu16 kcall.dobj16

linker: saved 10 words during optimization.

james@server:~/0x10c-build> DISPLAY= dtdb/dtdb kcall.dcpu16 -c "disasm 0x0 0x30"

Created VM.

Loaded 0x002D words from kcall.dcpu16.

Flashed memory.

0x0000 (0xA0E1): >>> SET J, 0x0007

0x0001 (0x90C2): ADD I, 0x0003

0x0002 (0x7C01): SET A, 0x1000

0x0004 (0x7C21): SET B, 0x1001

0x0006 (0x7C41): SET C, 0x1002

0x0008 (0x7F01): SET PUSH, 0x1004

0x000A (0x7F01): SET PUSH, 0x1005

0x000C (0x7F01): SET PUSH, 0x1006

0x000E (0x0301): SET PUSH, A

0x000F (0x0701): SET PUSH, B

0x0010 (0x0B01): SET PUSH, C

0x0011 (0x6B01): SET PUSH, [SP+0xFFFA]

0x0013 (0x6B01): SET PUSH, [SP+0xFFFA]

0x0015 (0x6B01): SET PUSH, [SP+0xFFFA]

0x0017 (0x7D00): INT [A], 0x4001

0x0019 (0x6401): SET A, [SP]

0x001A (0x7F62): ADD SP, 0x0009

0x001C (0x8A01): SET [A+0x0000], 0x0001

0x001E (0x8E01): SET [A+0x0001], 0x0002

0x0020 (0x9201): SET [A+0x0002], 0x0003

0x0022 (0x9601): SET [A+0x0003], 0x0004

0x0024 (0x9A01): SET [A+0x0004], 0x0005

0x0026 (0x9E01): SET [A+0x0005], 0x0006

0x0028 (0xA201): SET [A+0x0006], 0x0007

0x002A (0xA601): SET [A+0x0007], 0x0008

<<---------------------------------------------------->>

<< let's change the policy to a register call instead >>

<<---------------------------------------------------->>

james@server:~/0x10c-build> vi policy

james@server:~/0x10c-build> cat policy

defaults

{

kernel=/home/james/0x10c-build/kernel/stubsys.dkrn16

symbols=/home/james/0x10c-build/kernel/stubsys.dsym16

direct=false

# use pure stack calling convention

interrupt-call=register-call

# interrupt call mappings

interrupt-call(_stubapi_malloc)=0x4001

interrupt-call(_stubapi_free)=0x4002

interrupt-call(_stubapi_errno)=0x4003

interrupt-call(_stubapi_exit)=0x4004

interrupt-size(_stubapi_malloc)=6

interrupt-size(_stubapi_free)=1

interrupt-size(_stubapi_errno)=0

interrupt-size(_stubapi_exit)=1

}

format(image):

offset 0x1000

chain image-direct

format(image-direct):

write code

<<----------------------------------------------------->>

<< now **WITHOUT RE-ASSEMBLING**, let's see the result >>

<<----------------------------------------------------->>

james@server:~/0x10c-build> dtld/dtld -p policy -o kcall.dcpu16 kcall.dobj16

linker: saved 10 words during optimization.

james@server:~/0x10c-build> DISPLAY= dtdb/dtdb kcall.dcpu16 -c "disasm 0x0 0x30"

Created VM.

Loaded 0x0024 words from kcall.dcpu16.

Flashed memory.

0x0000 (0xA0E1): >>> SET J, 0x0007

0x0001 (0x90C2): ADD I, 0x0003

0x0002 (0x7C01): SET A, 0x1000

0x0004 (0x7C21): SET B, 0x1001

0x0006 (0x7C41): SET C, 0x1002

0x0008 (0x7F01): SET PUSH, 0x1004

0x000A (0x7F01): SET PUSH, 0x1005

0x000C (0x7F01): SET PUSH, 0x1006

0x000E (0x7D00): INT [A], 0x4001

0x0010 (0x6401): SET A, [SP]

0x0011 (0x7F62): ADD SP, 0x0003

0x0013 (0x8A01): SET [A+0x0000], 0x0001

0x0015 (0x8E01): SET [A+0x0001], 0x0002

0x0017 (0x9201): SET [A+0x0002], 0x0003

0x0019 (0x9601): SET [A+0x0003], 0x0004

0x001B (0x9A01): SET [A+0x0004], 0x0005

0x001D (0x9E01): SET [A+0x0005], 0x0006

0x001F (0xA201): SET [A+0x0006], 0x0007

0x0021 (0xA601): SET [A+0x0007], 0x0008

<<------------------------------------------>>

<< verdict: linker policies == fucking cool >>