OS-9 Assembly Code Development

From F256 Foenix
Jump to navigationJump to search

Overview[edit | edit source]

Each process in NitrOS-9 is allocated its own 64K address space. When run, the program object code is loaded into the end of the memory space, and the variables and data structures are loaded into the beginning. In addition, NitrOS-9 keeps an separate per-process MMU table (DAT Image), so you must use F$MapBlk to map and F$ClrBlk to unmap 8K blocks in your process' address space. The operating system has its own 64K address space as well.

When a new process is created, registers U, Y, DP and SP are set with U = start of data area, Y = end of data area, DP = page # of beginning page, SP = end of data area + 1. Each process includes its own execution and data directories, along with std in, std out and std err.

Memory and DAT Image[edit | edit source]

mmap and pmap output the current status of the memory in the system. mmap shows which memory blocks are currently in use. pmap shows the blocks that are mapped in the DAT Image for a particular process.

Program and Data Module Structure[edit | edit source]

There are 9 different types of modules in 4 possible languages:

Module Types Language
Code Module Type Name Code Language
$1x Program Module Prgm $x0 Data (non-executable)
$2x Subroutine Module Sbrtn $x1 6809 Object Code
$3x Multi-module Multi $x2 BASIC09 I-Code
$4x Data Module Data $x3 PASCAL I-Code
$5x-$Bx User-definable module $x4-$xF Reserved for Future Use
$Cx OS-9 System Module Systm
$Dx OS-9 File Manager Module FlMgr
$Ex OS-9 Device Driver Module Drivr
$Fx OS-9 Device Descriptor Module Devic

The two most used will be Program Modules and Data Modules.

Program Modules[edit | edit source]

Data Modules[edit | edit source]

Here is a portion of the font module, which is a data module in NitrOS-9.

               nam       font

               ttl       F256 font

               use       defsfile

tylg           set       Data

atrv           set       ReEnt+rev

rev            set       $01

               mod       eom,name,tylg,atrv,start,0

name           fcs       /font/


L0000          fcb   $00,$00,$00,$00,$00,$00,$00,$00 

L0008          fcb   $7C,$82,$AA,$82,$BA,$92,$82,$7C 

*More data here


eom            equ       *


Writing Position Independent Code[edit | edit source]

All code in NitrOS-9 must be position independent. Addresses are not known until a program module is loaded and executed. All addressing must be "program counter relative addressing". All branch and long branch instructions are program counter relative.


Use BRA and LBRA instead of JMP

Use BSR and LBSR instead of JSR

Use program counter relative indexed addressing for all load, store, arithmetic and logical instructions.

Accessing Variables and Data Structures[edit | edit source]

Accessing Table Data with PCR[edit | edit source]