; system.inc
;
; OS constants and macros for the LZ
;
;**************************** MACRO DEFINITIONS *****************************
.macro  MBSET   mask,addr
.if     equal   %locate(<:>,addr)-%length(addr)
        oim     #mask,addr:
.if_false
        oim     #mask,addr
.endc
.endm   mbset


.macro  MBCLR   mask,addr
.if     equal   %locate(<:>,addr)-%length(addr)
        aim     #,addr:
.if_false
        aim     #,addr
.endc
.endm   mbclr


.macro  MBTGL   mask,addr
.if     equal   %locate(<:>,addr)-%length(addr)
        eim     #mask,addr:
.if_false
        eim     #mask,addr
.endc
.endm


.macro  MBTST   mask,addr
.if     equal   %locate(<:>,addr)-%length(addr)
        tim     #mask,addr:
.if_false
        tim     #mask,addr
.endc
.endm

$mt     equ     0
$mtr0   equ     1
$mtr1   equ     2
$mtr2   equ     4
$mtr3   equ     8
$mtr4   equ     16
$mtr5   equ     32
$mtr6   equ     64

.macro  mpshos  p0,p1,p2,p3,p4,p5,p6
        os      bt$pprg
        .byte   $mt'p0 ! $mt'p1 ! $mt'p2 ! $mt'p3 ! $mt'p4 ! $mt'p5 ! $mt'p6
.endm mpshos

.macro  mpsh    p0,p1,p2,p3,p4,p5,p6
        .extrnw bt_pprg

        jsr     bt_pprg
        .byte   $mt'p0 ! $mt'p1 ! $mt'p2 ! $mt'p3 ! $mt'p4 ! $mt'p5 ! $mt'p6
.endm mpsh

.macro  mpulos  p0,p1,p2,p3,p4,p5,p6
        os      bt$pprg
        .byte   ^x80!$mt'p0!$mt'p1!$mt'p2!$mt'p3!$mt'p4!$mt'p5!$mt'p6
.endm mpulos

.macro  mpul    p0,p1,p2,p3,p4,p5,p6
        .extrnw bt_pprg

        jsr     bt_pprg
        .byte   ^x80!$mt'p0!$mt'p1!$mt'p2!$mt'p3!$mt'p4!$mt'p5!$mt'p6
.endm mpul

;jsr to zero page
.macro  jsrzp   addr
        jsr     addr:
.endm

; UDGS and ICONS
;****************

UDG_CLK0        equ     0
UDG_CLK9        equ     9
UDG_CLKCOLON    equ     10
UDG_UNDERSCORE  equ     11
ICON_MAIN       equ     12
ICON_PROG       equ     13
ICON_FILES      equ     14
ICON_UTILS      equ     15
ICON_ALARM      equ     16
ICON_CALC       equ     17
ICON_AM         equ     18
ICON_PM         equ     19
UDG_LDOT        equ     20
UDG_HDOT        equ     21
UDG_DI_TARROW   equ     22
UDG_DI_BARROW   equ     23
UDG_DI_BELL     equ     24
UDG_DI_WKBOX0   equ     25
UDG_DI_WKBOX1   equ     26
UDG_DI_WKBOX2   equ     27
UDG_DI_WKBOX3   equ     28
ICON_NOTES      equ     29
UDG_DI_LCHEVRON equ     30
UDG_DI_RCHEVRON equ     31



; zero page ports
;*****************
POB_DDR2        equ     $01
POB_PORT2       equ     $03
POB_TCSR1       equ     $08             ; timer control status register 1
POW_FRC         equ     $09             ; free running counter
POW_OCR1        equ     $0B             ; ouput compare register 1
POB_TCSR2       equ     $0F             ; Timer 2 control/status register
POB_RMCR        equ     $10             ; rate, mode control register
POB_TRCSR       equ     $11             ; Tx/Rx control status register
POB_RDR         equ     $12             ; Recieve data register
POB_TDR         equ     $13             ; Transmit data register
POB_RCR         equ     $14             ; ram/port 5 control register
POB_PORT5       equ     $15             
POB_DDR6        equ     $16             
POB_PORT6       equ     $17             
POB_TCSR3       equ     $1B             ; Timer 3 control/status register
POB_TCONR       equ     $1C             ; Timer constant register
                                        
                                        
; semi-custom chip addresses            
;****************************           
SCA_LCDCONTROL          equ     $0180   ; lcd registers
SCA_LCDDATA             equ     $0181   
SCA_SWITCHOFF           equ     $01c0   ; switch off
SCA_PULSEENABLE         equ     $0200   ; pulse enable
SCA_PULSEDISABLE        equ     $0240   ; pulse disable
SCA_ALARMHIGH           equ     $0280   ; buzzer
SCA_ALARMLOW            equ     $02c0   
SCA_COUNTERRESET        equ     $0300   ; counter for kybd + clock
SCA_COUNTERCLOCK        equ     $0340   
SCA_NMIMPU              equ     $0380   ; enable nmi to processor
SCA_NMICOUNTER          equ     $03c0   ; enable nmi to counter
                                        
SCA_SETMODE1            equ     $2a0    ; select mode 1 bit
SCA_SETMODE2            equ     $2e0    ; select mode 2 bit
SCA_MODERESET           equ     $320    ; clear mode bits
SCA_BANKRESET           equ     $360    ; reset bank counters
SCA_NEXTRAM             equ     $3a0    ; select next RAM bank
SCA_NEXTROM             equ     $3e0    ; select next ROM bank


; port 5 bits
;**************
ONCLR           equ     $80
ACOUT           equ     $02
LOWBATTERY      equ     $01

; port 6 bits
;**************
PACON           equ     $80
CS3             equ     $40
CS2             equ     $20
CS1             equ     $10
OE              equ     $08
PGM             equ     $04
MR              equ     $02
CLK             equ     $01

; tcsr1 bits
;**************
EOCI1           equ     $08

; kbb_stat bits
;****************
KY_SHFT         equ     $80             ; shift
KY_NUMB         equ     $40             ; numeric lock
KY_CPNM         equ     $02             ; CAPS / NUMB flag
KY_CAPS         equ     $01             ; caps lock

KY_MLKY         equ     $04             ; multi-lingual key flag

; pack control delays
;**********************

PACONDEL        equ     11520           ; for 50ms delay
;FIX    changed from 2304 (10ms) to 1613 (7ms)
VPPONDEL        equ     1613            ; for 7ms delay
;ENDFIX
VPPOFFDEL       equ     46080           ; for 200ms delay
PK_OVERBLOW     equ     5               ; 5*X overblow

; miscellaneous constants
;*************************

RAMBASE         equ     $2000           ; machine ram base
RAMFREE         equ     btt_ramf        ; end of osvars (first free byte)
MACHINE_STACK   equ     $0100           ; size of machine stack
MINEVL_STACK    equ     $0100           ; min. size of evaluator stack

ALLCELLS        equ     32              ; number of allocator cells
PERMCELL        equ     0               ; permanent cell
MENUCELL        equ     1               ; top level menu cell
DIRYCELL        equ     2               ; diary cell
TEXTCELL        equ     3               ; language text cell
SYMBCELL        equ     4               ; symbol table cell
GLOBCELL        equ     5               ; global record cell
OCODCELL        equ     6               ; QCODE ouput cell
FSY1CELL        equ     7               ; field name symbol table 1
FSY2CELL        equ     8               ; field name symbol table 2
FSY3CELL        equ     9               ; field name symbol table 3
FSY4CELL        equ     10              ; field name symbol table 4
FBF1CELL        equ     11              ; field buffer cell 1
FBF2CELL        equ     12              ; field buffer cell 2
FBF3CELL        equ     13              ; field buffer cell 3
FBF4CELL        equ     14              ; field buffer cell 4
DATACELL        equ     15              ; database cell
NOTECELL        equ     16              ; Notepad cell
DUMYCELL        equ     17              ; Dummy cell for spreadsheet
PREALLOC        equ     18              ; number of cells to preallocate


SWIDTH          equ     $10             ; screen width
CURS_ON         equ     $80             ; cursor on flag
CURS_OFF        equ     $00             ; cursor off
CURSOR_BLOCK    equ     $00             ; cursor in block form
CURSOR_LINE     equ     $01             ; cursor in line form

CY_SWIDTH       equ     20              ; LZ screen width
CY_NLINES       equ     4               ; 4 lines on LZ screen

TIMEOUT         equ     300             ; automatic timeout in 5 mins

BSIZE           equ     <256+64>        ; general purpose buffer size
FSIZE           equ     32              ; find buffer size
DELIM           equ     9               ; buffer delimiter

KEY_TIME        equ     $b39F           ; gives 50.000ms key polling

KEY_DELAY       equ     14              ; delay before key repeat
KEY_REPEAT      equ     0               ; rate of key repeat 0=fastest
KEY_CLICK       equ     1               ; length of key click
TYPEAHEAD       equ     16              ; 16 character type ahead
HDELAY          equ     4               ; horizontal scrolling delay
VDELAY          equ     10              ; vertical scrolling delay

REGSIZE         equ     32              ; number of table registers
REGBASE         equ     <256-REGSIZE>   ; first register number
STACKSIZE       equ     32              ; table stack size

K_AC            equ     1               ; all/clear key
K_MODE          equ     2               ; mode key
K_UP            equ     3               ; up arrow
K_DOWN          equ     4               ; down arrow
K_LEFT          equ     5               ; left arrow
K_RGHT          equ     6               ; right arrow
K_DELR          equ     7               ; delete right key
K_DEL           equ     8               ; delete key
K_EXE           equ     13              ; execute key
K_SHFTEXE       equ     14              ; Shift EXE
K_SHFTSPACE     equ     15              ; Shift SPACE

#ifdef  KYBD_POS200
K_F1            equ     3               ; function keys on POS200
K_F2            equ     4
K_F3            equ     5
#endif

; ctrl chars for dp_emit
;************************
D_BS            equ     8               ; back space
D_HT            equ     9               ; nearest position modulo 8
D_LF            equ     10              ; line feed
D_HM            equ     11              ; position cursor top left
D_FF            equ     12              ; clear entire display
D_CR            equ     13              ; goto start of line
D_CT            equ     14              ; clear top line
D_CB            equ     15              ; clear bottom line
D_BL            equ     16              ; bell !
D_RE            equ     17              ; refresh both lines
D_TR            equ     18              ; refresh top line
D_BR            equ     19              ; refresh bottom line
D_3R            equ     20              ; refresh 3rd line
D_4R            equ     21              ; refresh 4th line
D_C3            equ     22              ; clear 3rd line
D_C4            equ     23              ; clear 4th line
D_HD            equ     24              ; print high dotted line
D_LD            equ     25              ; print low dotted line
D_CE            equ     26              ; clear to the end of line

; ctrl chars for ut_disp
;************************
DSP_CN          equ     31              ; for centring text in ut$disp

PAKA            equ     0               ; Ram data pack
PAKB            equ     1               ; First pack slot
PAKC            equ     2               ; Second pack slot
PAKD            equ     3               ; Top slot
EPROM           equ     $02             ; clear if ram pack
PGCPK           equ     $04             ; set if pack with page counter
RDWRT           equ     $08             ; clear if pack write protected
NOBOOT          equ     $10             ; clear if pack bootable
COPYPK          equ     $20             ; set if pack copyable
NYIMPL          equ     $40             ; clear if flashpack or debug rampack
MK1PAK          equ     $80             ; set if MARK 1 pak

GENERAL         equ     $90             ; general record type
MAXFILE         equ     4               ; Maximum number of open files

BBODTYP         equ     $80             ; block body records
NAMETYP         equ     $81             ; record type for file names
BDIATYP         equ     $82             ; block name record type for diary
BLANTYP         equ     $83             ; block name record type for language

BNOTTYP         equ     $87             ; block name record type for notepad

FRECTYP         equ     $91             ; lowest rec. type for named files
NAMELEN         equ     8               ; max len of a file name
TLRECT          equ     <FRECTYP-1>     ; record type for find/save

AMSIZE          equ     6               ; size of an alarm entry
AMNUM           equ     8               ; number of alarm entries

EDITMODE        equ     3
LISTMODE        equ     4
RUNMODE         equ     7
ERAMODE         equ     8

SIZEOF_PAKDEF   equ     10              ; packtype, packsize, 8 byte id
PTYP            equ     0               ; pack type
PSIZ            equ     1               ; pack size
PIDS            equ     2               ; unique ID string

; Maths constants

PRECISION       equ     12              ; working precision for maths.
MANSIZE         equ     6               ; size of BCD mantissa
MANBYTES        equ     7               ; size of register mantissa
SZREG           equ     9               ; size of BCD register
SZBCD           equ     8               ; size of BCD number
; offsets from byte 0 (sman[0]) of a BCD number
SMSB            equ     5               ; most significant byte
SEXP            equ     6               ; exponent
SSGN            equ     7               ; sign
; offsets from byte 0 (aman[0]) of a BCD register
AMSB            equ     6               ; most significant byte
AEXP            equ     7               ; exponent
ASGN            equ     8               ; sign

MAXEXP          equ     99              ; maximum exponent size
MINEXP          equ     -99             ; max. negative exponent size
MAXDLEN         equ     32              ; max. no. of dec. places
#define AMNUM 8

MAXDLEN         equ     32              ; max. dec. places + exponent

;       LANGUAGE CONTROL
LANG_ENG        equ     0
LANG_FRN        equ     1
LANG_GRM        equ     2
MLT_PROTECT     equ     129
MLT_PASSWORD    equ     72
                        ; Text,passwords,paste buffer
MLT_LENGTH      equ     <MLT_PROTECT+MLT_PASSWORD+65>

;       WORLD BASE CITY/COUNTRY
WL_BASE_CITY    equ     100
WL_BASE_COUNTRY equ     120

; PASSWORD LENGTH
MAXPASSLEN      equ     8