docs: add the HDK
This commit is contained in:
+1189
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,411 @@
|
||||
/*
|
||||
A4TEST.C - Testing the functionality ASIC4 Example
|
||||
Interface Board device driver A4Exif.ldd
|
||||
A comprehensive test program which checks
|
||||
I/O request functionality of A4Exif.ldd
|
||||
|
||||
Written by Mal, January 31, 1995
|
||||
*/
|
||||
|
||||
#include <plib.h>
|
||||
#include <p_keyb.h>
|
||||
|
||||
#define BUFLEN 1
|
||||
#define MAXBUF 8
|
||||
#define SERREAD_TIMEOUT 20L
|
||||
#define FLASH_TIME 1L
|
||||
|
||||
GLREF_D TEXT *DatCommandPtr;
|
||||
GLREF_D VOID *winHandle;
|
||||
LOCAL_D VOID *serH; /* serial channel handle */
|
||||
LOCAL_D VOID *timH; /* timer channel handle */
|
||||
LOCAL_D WORD serReadStat; /* serial channel status word */
|
||||
LOCAL_D WORD timStat; /* timer channel status word */
|
||||
LOCAL_D WORD keyStat; /* console channel status word */
|
||||
LOCAL_D P_CON_KBREC kbrec;
|
||||
LOCAL_D TEXT buf[40];
|
||||
LOCAL_D UBYTE wowbuf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
|
||||
LOCAL_D TEXT *head="LED: ";
|
||||
|
||||
|
||||
LOCAL_C VOID PrintHeader(VOID)
|
||||
/* Prints the title at the start of the program */
|
||||
{
|
||||
p_printf("*********************");
|
||||
p_printf("Welcome to the ASIC 4");
|
||||
p_printf("Example IF board test");
|
||||
p_printf("program");
|
||||
p_printf("*********************");
|
||||
p_printf(".....\n");
|
||||
p_getch();
|
||||
}
|
||||
|
||||
LOCAL_C VOID PrintInstructions(VOID)
|
||||
{
|
||||
p_printf("Type in the test number");
|
||||
p_printf(" 0 => Alternate flash");
|
||||
p_printf(" 1 => Asynchronous read");
|
||||
p_printf(" 2 => Sense");
|
||||
p_printf(" 3 => Set");
|
||||
p_printf(" 4 => Memory");
|
||||
p_printf(" q => Quit");
|
||||
p_printf(" .....");
|
||||
}
|
||||
|
||||
LOCAL_C VOID LoadLdd(VOID)
|
||||
/* Loads the LDD A4Exif.ldd from anywhere and exits on failure */
|
||||
{
|
||||
TEXT filename[128];
|
||||
INT ret;
|
||||
|
||||
p_printf("\nLOADLDD=>");
|
||||
p_fparse("A4EXIF.LDD",DatCommandPtr,&filename[0],NULL);
|
||||
if ((ret=p_loadldd(&filename[0]))<0)
|
||||
{
|
||||
p_printf("A4Exif.ldd failed to load");
|
||||
if (ret==E_FILE_NXIST)
|
||||
{
|
||||
p_printf("Device does not exist");
|
||||
p_getch();
|
||||
p_exit(0);
|
||||
}
|
||||
else if (ret==E_FILE_EXIST)
|
||||
{
|
||||
p_printf("Device is already loaded");
|
||||
p_getch();
|
||||
}
|
||||
else if (ret==E_GEN_NOMEMORY)
|
||||
{
|
||||
p_printf("Not enough memory available");
|
||||
p_getch();
|
||||
p_exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
p_printf("Unknown error %d on p_loadldd",ret);
|
||||
p_getch();
|
||||
p_exit(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
p_printf("Successfully loaded A4Exif.ldd\n");
|
||||
p_getch();
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID UnloadLdd(VOID)
|
||||
/* Removes the LDD A4Exif.ldd */
|
||||
{
|
||||
INT ret;
|
||||
|
||||
p_printf("\nUNLOADLDD=>");
|
||||
if ((ret=p_devdel("LED",E_LDD))!=0)
|
||||
{
|
||||
p_printf("A4Exif.ldd failed to unload");
|
||||
if (ret==E_FILE_DEVICE)
|
||||
p_printf("The device driver is not loaded");
|
||||
else if (ret==E_GEN_INUSE)
|
||||
p_printf("Driver is open and cannot be deleted");
|
||||
else
|
||||
p_printf("Unknown error %d on p_devdel",ret);
|
||||
p_getch();
|
||||
}
|
||||
else
|
||||
{
|
||||
p_printf("Successfully deleted A4Exif.ldd");
|
||||
p_getch();
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID OpenPort(VOID)
|
||||
/*Opens a serial port of the A4Example IF on the host machine*/
|
||||
{
|
||||
INT ret, seropen;
|
||||
|
||||
p_printf("\nOPENPORT=>");
|
||||
DoAgain:
|
||||
p_printf("Type in the serial\r\nport to open");
|
||||
p_printf("eg A => port A");
|
||||
p_printf(".....\n");
|
||||
ret=p_toupper(p_getch());
|
||||
*(head+4)=ret;
|
||||
p_printf("%s",head);
|
||||
p_sleep(5L);
|
||||
if ((seropen=p_open(&serH,head,-1))<0)
|
||||
{/* Failed to open */
|
||||
p_atos(&buf[0],"p_open on port %c has failed",ret);
|
||||
p_printf("%s\n<p_open ret=%d>",&buf[0],seropen);
|
||||
p_errs(buf,seropen);
|
||||
p_printf("%s\n",&buf[0]);
|
||||
p_getch();
|
||||
goto DoAgain;
|
||||
}
|
||||
else
|
||||
{/* Succeeded in opening */
|
||||
p_atos(&buf[0],"Successfully opened port %c",ret);
|
||||
p_printf("%s",&buf[0]);
|
||||
p_printf(".....\n");
|
||||
p_getch();
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID ClosePort(VOID)
|
||||
{
|
||||
INT ret;
|
||||
|
||||
p_printf("\nCLOSEPORT=>");
|
||||
if ((ret=p_close(serH))!=0)
|
||||
p_printf("Error in closing port");
|
||||
else
|
||||
p_printf("Successfully closed port");
|
||||
p_getch();
|
||||
}
|
||||
|
||||
LOCAL_C VOID SensePort(VOID)
|
||||
{
|
||||
UBYTE A1,A2;
|
||||
|
||||
p_printf("\nSENSEPORT=>");
|
||||
p_iow(serH,P_FSENSE,&A1,&A2);
|
||||
p_printf("Status byte: 0x%x",A1);
|
||||
p_printf("LED byte: 0x%x",A2);
|
||||
p_getch();
|
||||
}
|
||||
|
||||
LOCAL_C INT SetPort(VOID)
|
||||
{
|
||||
UBYTE key;
|
||||
|
||||
p_printf("\nSETPORT=>");
|
||||
p_printf("Type a key");
|
||||
p_printf("ESCAPE to exit\r\n");
|
||||
if ((key=p_getch())==E_KEY_ESCAPE)
|
||||
{
|
||||
key=0x00;
|
||||
p_iow(serH,P_FSET,&key);
|
||||
return(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
p_printf("Output byte is 0x%x",key);
|
||||
p_iow(serH,P_FSET,&key);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID OpenTimer(VOID)
|
||||
{
|
||||
if (p_open(&timH,"TIM:",-1)<0)
|
||||
{/* Error in opening timer */
|
||||
p_printf("Cannot open timer channel\n");
|
||||
p_getch();
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID QueueTimer(ULONG timeouttime)
|
||||
{
|
||||
p_ioc4(timH,P_FRELATIVE,&timStat,&timeouttime);
|
||||
}
|
||||
|
||||
LOCAL_C VOID CancelTimer(VOID)
|
||||
{
|
||||
p_iow(timH,P_FCANCEL);
|
||||
p_waitstat(&timStat);
|
||||
}
|
||||
|
||||
LOCAL_C VOID QueueSerRead(UBYTE *statusptr,UBYTE *ledptr)
|
||||
{
|
||||
p_ioc5(serH,P_FREAD,&serReadStat,statusptr,ledptr);
|
||||
}
|
||||
|
||||
LOCAL_C VOID CancelSerRead(VOID)
|
||||
{
|
||||
p_iow(serH,P_FCANCEL);
|
||||
p_waitstat(&serReadStat);
|
||||
}
|
||||
|
||||
LOCAL_C VOID QueueKeypress(P_CON_KBREC *keybrec)
|
||||
{
|
||||
p_ioc4(winHandle,P_FREAD,&keyStat,keybrec);
|
||||
}
|
||||
|
||||
LOCAL_C VOID AsynchRead(VOID)
|
||||
{
|
||||
UBYTE b_led;
|
||||
UBYTE b_status;
|
||||
|
||||
p_printf("ASYNCH READ\r\n");
|
||||
OpenTimer();
|
||||
QueueTimer(SERREAD_TIMEOUT);
|
||||
QueueSerRead(&b_status,&b_led);
|
||||
QueueKeypress(&kbrec);
|
||||
FOREVER
|
||||
{
|
||||
p_iowait();
|
||||
if (keyStat!=E_FILE_PENDING)
|
||||
{/* Keypress received */
|
||||
p_printf("KEYPRESS");
|
||||
if (kbrec.keycode==E_KEY_ESCAPE)
|
||||
{
|
||||
CancelSerRead();
|
||||
CancelTimer();
|
||||
b_led=0x00;
|
||||
p_iow(serH,P_FWRITE,&b_led);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Do nothing - requeue keypress */
|
||||
QueueKeypress(&kbrec);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (serReadStat!=E_FILE_PENDING)
|
||||
{
|
||||
p_printf("SERIAL READ COMPLETED");
|
||||
CancelTimer();
|
||||
p_printf("Status byte is => 0x%x",b_status);
|
||||
p_printf("LED byte is => 0x%x",b_led);
|
||||
QueueTimer(SERREAD_TIMEOUT);
|
||||
QueueSerRead(&b_status,&b_led);
|
||||
continue;
|
||||
}
|
||||
else if (timStat!=E_FILE_PENDING)
|
||||
{
|
||||
p_printf("TIMEOUT");
|
||||
CancelSerRead();
|
||||
QueueSerRead(&b_status,&b_led);
|
||||
QueueTimer(SERREAD_TIMEOUT);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{/* Error - missing status word so fatal error */
|
||||
p_printf("***Stray status word***");
|
||||
break;
|
||||
}
|
||||
}
|
||||
p_close(timH);
|
||||
}
|
||||
|
||||
LOCAL_C VOID AlternateFlash(VOID)
|
||||
{
|
||||
UBYTE b_led;
|
||||
INT i=0;
|
||||
|
||||
p_printf("ALTERNATE FLASH\r\n");
|
||||
p_printf("Hit ESCAPE to exit");
|
||||
OpenTimer();
|
||||
QueueTimer(FLASH_TIME);
|
||||
QueueKeypress(&kbrec);
|
||||
FOREVER
|
||||
{
|
||||
p_iowait();
|
||||
if (keyStat!=E_FILE_PENDING)
|
||||
{/* Keypress received */
|
||||
if (kbrec.keycode==E_KEY_ESCAPE)
|
||||
{
|
||||
CancelTimer();
|
||||
b_led=0x00;
|
||||
p_iow(serH,P_FWRITE,&b_led);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Do nothing - requeue keypress */
|
||||
QueueKeypress(&kbrec);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (timStat!=E_FILE_PENDING)
|
||||
{/* Timer finished */
|
||||
if (i<MAXBUF)
|
||||
{
|
||||
p_iow(serH,P_FSET,&wowbuf[i]);
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
i=0;
|
||||
p_iow(serH,P_FSET,&wowbuf[i]);
|
||||
}
|
||||
QueueTimer(FLASH_TIME);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{/* Missing status word so fatal error */
|
||||
p_printf("***Stray status error***");
|
||||
break;
|
||||
}
|
||||
}
|
||||
p_close(timH);
|
||||
}
|
||||
|
||||
LOCAL_C VOID CheckMemory(TEXT *str)
|
||||
{
|
||||
VOID *Heap;
|
||||
INT fbytes;
|
||||
|
||||
fbytes=p_allspc(&Heap);
|
||||
p_print("\n\t%s\r\n",str);
|
||||
p_print("Free Heap Memory =>\r\n\t%x bytes\r\n",fbytes);
|
||||
p_print("Free Segments =>\r\n\t%d\r\n",p_sgfree());
|
||||
p_getch();
|
||||
}
|
||||
|
||||
LOCAL_C VOID MemoryTest(VOID)
|
||||
{
|
||||
CheckMemory("OpenPort");
|
||||
ClosePort();
|
||||
CheckMemory("ClosedPort");
|
||||
UnloadLdd();
|
||||
CheckMemory("UnoadedLdd");
|
||||
LoadLdd();
|
||||
CheckMemory("LoadLdd");
|
||||
OpenPort();
|
||||
CheckMemory("OpenPort");
|
||||
p_printf("End of Memory Test");
|
||||
}
|
||||
|
||||
GLDEF_C VOID main(VOID)
|
||||
/*
|
||||
*/
|
||||
{
|
||||
INT ret,set=0;
|
||||
|
||||
PrintHeader();
|
||||
LoadLdd();
|
||||
OpenPort();
|
||||
Start:
|
||||
PrintInstructions();
|
||||
if ((ret=p_getch())=='0')
|
||||
AlternateFlash();
|
||||
else if (ret=='1')
|
||||
AsynchRead();
|
||||
else if (ret=='2')
|
||||
SensePort();
|
||||
else if (ret=='3')
|
||||
{
|
||||
while (set>=0)
|
||||
set=SetPort();
|
||||
set=0;
|
||||
}
|
||||
else if (ret=='4')
|
||||
MemoryTest();
|
||||
else if (ret=='q')
|
||||
{
|
||||
ClosePort();
|
||||
UnloadLdd();
|
||||
p_exit(0);
|
||||
}
|
||||
else
|
||||
goto Start;
|
||||
goto Start;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#system epoc img
|
||||
#set epocinit=iplib
|
||||
#model small jpi
|
||||
|
||||
#compile a4test
|
||||
#link a4test
|
||||
@@ -0,0 +1,15 @@
|
||||
.xlist
|
||||
; Include file - EPOC.INC
|
||||
; Epoc/Os standard include file
|
||||
; Copyright (c) Psion PLC 1989-90.
|
||||
;
|
||||
; VER DATE BY DESCRIPTION
|
||||
; ----- -------- ---- -----------
|
||||
; 2.00F 30/09/90 NSM Final release
|
||||
;
|
||||
EPOC_INC equ 1
|
||||
;
|
||||
include ..\inc\epocdef.inc
|
||||
include ..\inc\epocmac.inc
|
||||
include ..\inc\epocpan.inc
|
||||
.list
|
||||
@@ -0,0 +1,284 @@
|
||||
.xlist
|
||||
; Include file - EPOCLIB.INC
|
||||
; Epoc/Os plib standard include file.
|
||||
; Copyright (c) Psion PLC 1989-90.
|
||||
;
|
||||
; VER DATE BY DESCRIPTION
|
||||
; ----- -------- ---- -----------
|
||||
; 2.00F 30/09/90 NSM Final release
|
||||
;
|
||||
EPOCLIB_INC equ 1
|
||||
;
|
||||
_TANDW = 0
|
||||
ifdef LATTICE
|
||||
CodeSeg macro
|
||||
pgroup group prog
|
||||
PGROUP equ <pgroup>
|
||||
prog segment byte public 'prog'
|
||||
assume cs:pgroup
|
||||
endm
|
||||
EndCodeSeg macro
|
||||
prog ends
|
||||
endm
|
||||
DataSeg macro
|
||||
dgroup group data,udata
|
||||
DGROUP equ <dgroup>
|
||||
data segment word public 'data'
|
||||
assume ds:dgroup,es:dgroup,ss:dgroup
|
||||
endm
|
||||
EndDataSeg macro
|
||||
data ends
|
||||
endm
|
||||
UDataSeg macro
|
||||
udata segment word public 'data'
|
||||
endm
|
||||
EndUDataSeg macro
|
||||
udata ends
|
||||
endm
|
||||
GLREF_D MACRO NAME,TYPE
|
||||
EXTRN NAME:TYPE
|
||||
ENDM
|
||||
GLDEF_D MACRO NAME,TYPE
|
||||
PUBLIC NAME
|
||||
NAME label TYPE
|
||||
ENDM
|
||||
GLREF_C MACRO NAME
|
||||
EXTRN NAME:NEAR
|
||||
ENDM
|
||||
endif
|
||||
;
|
||||
ifdef TURBOC
|
||||
_TANDW = 1
|
||||
CodeSeg macro
|
||||
PGROUP group _TEXT
|
||||
pgroup equ <PGROUP>
|
||||
_TEXT segment byte public 'CODE'
|
||||
assume cs:PGROUP
|
||||
endm
|
||||
EndCodeSeg macro
|
||||
_TEXT ends
|
||||
endm
|
||||
DataSeg macro
|
||||
DGROUP group _DATA,_BSS
|
||||
dgroup equ <DGROUP>
|
||||
_DATA segment word public 'DATA'
|
||||
assume ds:DGROUP,es:DGROUP,ss:DGROUP
|
||||
endm
|
||||
EndDataSeg macro
|
||||
_DATA ends
|
||||
endm
|
||||
UDataSeg macro
|
||||
_BSS segment word public 'BSS'
|
||||
endm
|
||||
EndUDataSeg macro
|
||||
_BSS ends
|
||||
endm
|
||||
GLREF_D MACRO NAME,TYPE
|
||||
EXTRN _&NAME:TYPE
|
||||
NAME EQU _&NAME
|
||||
ENDM
|
||||
GLDEF_D MACRO NAME,TYPE
|
||||
PUBLIC _&NAME
|
||||
_&NAME label TYPE
|
||||
NAME EQU _&NAME
|
||||
ENDM
|
||||
GLREF_C MACRO NAME
|
||||
EXTRN _&NAME:NEAR
|
||||
NAME EQU _&NAME
|
||||
ENDM
|
||||
endif
|
||||
ifdef WATCOMC
|
||||
REG_PARAM equ 1
|
||||
ifdef _MSC
|
||||
_TANDW = 1
|
||||
endif
|
||||
CodeSeg macro
|
||||
PGROUP group _TEXT
|
||||
pgroup equ <PGROUP>
|
||||
_TEXT segment byte public 'CODE'
|
||||
assume cs:PGROUP
|
||||
endm
|
||||
EndCodeSeg macro
|
||||
_TEXT ends
|
||||
endm
|
||||
DataSeg macro
|
||||
DGROUP group _DATA,_BSS
|
||||
dgroup equ <DGROUP>
|
||||
_DATA segment word public 'DATA'
|
||||
assume ds:DGROUP,es:DGROUP,ss:DGROUP
|
||||
endm
|
||||
EndDataSeg macro
|
||||
_DATA ends
|
||||
endm
|
||||
UDataSeg macro
|
||||
_BSS segment word public 'BSS'
|
||||
endm
|
||||
EndUDataSeg macro
|
||||
_BSS ends
|
||||
endm
|
||||
GLREF_D MACRO NAME,TYPE
|
||||
EXTRN NAME&_:TYPE
|
||||
NAME EQU NAME&_
|
||||
ENDM
|
||||
GLDEF_D MACRO NAME,TYPE
|
||||
PUBLIC NAME&_
|
||||
NAME&_ label TYPE
|
||||
NAME EQU NAME&_
|
||||
ENDM
|
||||
GLREF_C MACRO NAME
|
||||
EXTRN NAME&_:NEAR
|
||||
NAME EQU NAME&_
|
||||
ENDM
|
||||
endif
|
||||
ifdef JPIC
|
||||
REG_PARAM equ 1
|
||||
ifdef _MSC
|
||||
_TANDW = 1
|
||||
endif
|
||||
CodeSeg macro
|
||||
_TEXT segment byte public 'CODE'
|
||||
assume cs:_TEXT
|
||||
endm
|
||||
EndCodeSeg macro
|
||||
_TEXT ends
|
||||
endm
|
||||
DataSeg macro
|
||||
DGROUP group _DATA,_BSS
|
||||
dgroup equ <DGROUP>
|
||||
_DATA segment word public 'DATA'
|
||||
assume ds:DGROUP,es:DGROUP,ss:DGROUP
|
||||
endm
|
||||
EndDataSeg macro
|
||||
_DATA ends
|
||||
endm
|
||||
UDataSeg macro
|
||||
_BSS segment word public 'BSS'
|
||||
endm
|
||||
EndUDataSeg macro
|
||||
_BSS ends
|
||||
endm
|
||||
GLREF_D MACRO NAME,TYPE
|
||||
EXTRN _&NAME:TYPE
|
||||
NAME EQU _&NAME
|
||||
ENDM
|
||||
GLDEF_D MACRO NAME,TYPE
|
||||
PUBLIC _&NAME
|
||||
_&NAME label TYPE
|
||||
NAME EQU _&NAME
|
||||
ENDM
|
||||
GLREF_C MACRO NAME
|
||||
EXTRN _&NAME:NEAR
|
||||
NAME EQU _&NAME
|
||||
ENDM
|
||||
endif
|
||||
;
|
||||
LOCAL_D MACRO NAME,TYPE
|
||||
NAME label TYPE
|
||||
ENDM
|
||||
;
|
||||
ProcBegin macro _Name,_Type,_Registers
|
||||
ifdef TURBOC
|
||||
ProcBeginBody _&_Name,_Type,_Registers
|
||||
endif
|
||||
ifdef JPIC
|
||||
ProcBeginBody _&_Name,_Type,_Registers
|
||||
endif
|
||||
ifdef WATCOMC
|
||||
ProcBeginBody _Name&_,_Type,_Registers
|
||||
_Name EQU _Name&_
|
||||
endif
|
||||
ifdef LATTICE
|
||||
ProcBeginBody _Name,_Type,_Registers
|
||||
endif
|
||||
endm
|
||||
ProcBegin@ macro _Name,_Type,_Registers
|
||||
ProcBeginBody _Name,_Type,_Registers
|
||||
endm
|
||||
ProcBeginBody macro _Name,_Type,_Registers
|
||||
_DI = 0
|
||||
_SI = 0
|
||||
if _TANDW
|
||||
ifnb <_Registers>
|
||||
irpc _flags,_Registers
|
||||
ifidni <_flags>,<D>
|
||||
_DI = 1
|
||||
endif
|
||||
ifidni <_flags>,<S>
|
||||
_SI = 1
|
||||
endif
|
||||
endm
|
||||
endif
|
||||
endif
|
||||
;
|
||||
ProcEnd macro _flag
|
||||
ifb <_flag>
|
||||
if _DI
|
||||
pop di
|
||||
endif
|
||||
if _SI
|
||||
pop si
|
||||
endif
|
||||
if _TANDW
|
||||
ifidni <_Type>,<bp>
|
||||
pop bp
|
||||
endif
|
||||
endif
|
||||
ifdef LATTICE
|
||||
ifidni <_Type>,<bp>
|
||||
pop bp
|
||||
endif
|
||||
endif
|
||||
ret
|
||||
endif
|
||||
&_Name endp
|
||||
endm
|
||||
;
|
||||
public _Name
|
||||
ifidni <_Type>,<far>
|
||||
_Name proc far
|
||||
else
|
||||
_Name proc near
|
||||
endif
|
||||
ifidni <_Type>,<bp>
|
||||
if _TANDW
|
||||
push bp
|
||||
mov bp, sp
|
||||
endif
|
||||
ifdef LATTICE
|
||||
push bp
|
||||
mov bp, sp
|
||||
endif
|
||||
Arg1 equ <[bp+4]>
|
||||
Arg2 equ <[bp+6]>
|
||||
Arg3 equ <[bp+8]>
|
||||
Arg4 equ <[bp+10]>
|
||||
Arg5 equ <[bp+12]>
|
||||
Arg6 equ <[bp+14]>
|
||||
Arg7 equ <[bp+16]>
|
||||
Arg8 equ <[bp+18]>
|
||||
endif
|
||||
ifidni <_Type>,<bx>
|
||||
if _TANDW
|
||||
mov bx, sp
|
||||
endif
|
||||
ifdef LATTICE
|
||||
mov bx, sp
|
||||
endif
|
||||
Arg1 equ <[bx+2]>
|
||||
Arg2 equ <[bx+4]>
|
||||
Arg3 equ <[bx+6]>
|
||||
Arg4 equ <[bx+8]>
|
||||
Arg5 equ <[bx+10]>
|
||||
Arg6 equ <[bx+12]>
|
||||
Arg7 equ <[bx+14]>
|
||||
Arg8 equ <[bx+16]>
|
||||
endif
|
||||
if _SI
|
||||
push si
|
||||
endif
|
||||
if _DI
|
||||
push di
|
||||
endif
|
||||
endm
|
||||
;
|
||||
.list
|
||||
@@ -0,0 +1,297 @@
|
||||
.xlist
|
||||
; Include file - EPOCSER.INC
|
||||
; Epoc/Os standard Serial Driver defines
|
||||
; Copyright (c) Psion PLC 1989-90.
|
||||
;
|
||||
; VER DATE BY DESCRIPTION
|
||||
; ----- -------- ---- -----------
|
||||
; 2.00F 30/09/90 JH Final release
|
||||
; 2.01F 05/10/90 JH Added a define for Constant speed DTE modems
|
||||
;
|
||||
EPOCSER_INC equ 1
|
||||
; Serial port characteristics
|
||||
SerialCharEnt struc
|
||||
SerialCharTbaud db ? ; transmit Baud rate selector
|
||||
SerialCharRbaud db ? ; receive Baud rate selector
|
||||
SerialCharFrame db ? ; number of data, parity and stop bits
|
||||
SerialCharParity db ? ; parity selector
|
||||
SerialCharHandshake db ? ; handshake flags
|
||||
SerialCharXon db ? ; XON character
|
||||
SerialCharXoff db ? ; XOFF character
|
||||
SerialCharFlags db ? ; control flags
|
||||
SerialCharTmask dd ? ; terminator mask
|
||||
SerialCharEnt ends
|
||||
|
||||
; Function numbers to use to call PDD functions
|
||||
SerPDDFuncOpen equ 0
|
||||
SerPDDFuncClose equ 2
|
||||
SerPDDFuncStart equ 4
|
||||
SerPDDFuncStop equ 6
|
||||
SerPDDFuncSet equ 8
|
||||
SerPDDFuncSense equ 10
|
||||
SerPDDFuncControl equ 12
|
||||
SerPDDFuncEnquire equ 14
|
||||
SerPDDFuncEnable equ 16
|
||||
SerPDDFuncSetHandlerCS equ 18
|
||||
|
||||
;
|
||||
SERPARITY_ERR equ 0ffh
|
||||
SERFRAME_ERR equ 0feh
|
||||
SEROVERRUN_ERR equ 0fdh
|
||||
|
||||
SERNOCHAR equ 0ffffh
|
||||
|
||||
; Baud rates
|
||||
P_BAUD_50 equ 01h
|
||||
P_BAUD_75 equ 02h
|
||||
P_BAUD_110 equ 03h
|
||||
P_BAUD_134 equ 04h
|
||||
P_BAUD_150 equ 05h
|
||||
P_BAUD_300 equ 06h
|
||||
P_BAUD_600 equ 07h
|
||||
P_BAUD_1200 equ 08h
|
||||
P_BAUD_1800 equ 09h
|
||||
P_BAUD_2000 equ 0Ah
|
||||
P_BAUD_2400 equ 0Bh
|
||||
P_BAUD_3600 equ 0Ch
|
||||
P_BAUD_4800 equ 0Dh
|
||||
P_BAUD_7200 equ 0Eh
|
||||
P_BAUD_9600 equ 0Fh
|
||||
P_BAUD_19200 equ 10h
|
||||
P_BAUD_38400 equ 11h
|
||||
P_BAUD_56000 equ 12h
|
||||
|
||||
; allocation of frame bits
|
||||
P_DATA_FRM equ 0fh ; number of data bits mask
|
||||
P_DATA_5 equ 0h ; 5 data bits
|
||||
P_DATA_6 equ 1h ; 6 data bits
|
||||
P_DATA_7 equ 2h ; 7 data bits
|
||||
P_DATA_8 equ 3h ; 8 data bits
|
||||
P_TWOSTOP equ 10h ; 2 stop bits if set, 1 if clear
|
||||
P_PARITY equ 20h ; 1 parity bit if set, 0 if clear
|
||||
|
||||
; parity - ignored unless P_PARITY is set
|
||||
P_PAR_EVEN equ 1h ; even parity
|
||||
P_PAR_ODD equ 2h ; odd parity
|
||||
P_PAR_MARK equ 3h ; mark parity
|
||||
P_PAR_SPACE equ 4h ; space parity
|
||||
|
||||
; handshaking control
|
||||
P_OBEY_XOFF equ 01h ; respond to received XOFF (and XON) if set
|
||||
P_SEND_XOFF equ 02h ; send XOFF/XON to control receive buf if set
|
||||
P_IGN_CTS equ 04h ; ignore the state of CTS if set
|
||||
P_OBEY_DSR equ 08h ; obey the state of DSR if set
|
||||
P_FAIL_DSR equ 10h ; fail if DSR goes OFF if set
|
||||
P_OBEY_DCD equ 20h ; obey the state of DCD if set
|
||||
P_FAIL_DCD equ 40h ; fail if DCD goes OFF if set
|
||||
|
||||
; flags control
|
||||
P_IGNORE_PARITY equ 01h ; ignore parity errors
|
||||
|
||||
; For P_FCTRL function
|
||||
P_SRCTRL_CTS equ 01h
|
||||
P_SRCTRL_DSR equ 02h
|
||||
P_SRCTRL_DCD equ 04h
|
||||
P_SRCTRL_DTR equ 08h
|
||||
P_SRCTRL_RTS equ 10h
|
||||
|
||||
P_SRDTR_ON equ 1h ; to set DTR to MARK
|
||||
P_SRDTR_OFF equ 2h ; to set DTR to SPACE
|
||||
|
||||
; Bit masks for P_FINQ function
|
||||
P_SRINQ_50 equ 0001h
|
||||
P_SRINQ_75 equ 0002h
|
||||
P_SRINQ_110 equ 0004h
|
||||
P_SRINQ_134 equ 0008h
|
||||
P_SRINQ_150 equ 0010h
|
||||
P_SRINQ_300 equ 0020h
|
||||
P_SRINQ_600 equ 0040h
|
||||
P_SRINQ_1200 equ 0080h
|
||||
P_SRINQ_1800 equ 0100h
|
||||
P_SRINQ_2000 equ 0200h
|
||||
P_SRINQ_2400 equ 0400h
|
||||
P_SRINQ_3600 equ 0800h
|
||||
P_SRINQ_4800 equ 1000h
|
||||
P_SRINQ_7200 equ 2000h
|
||||
P_SRINQ_9600 equ 4000h
|
||||
P_SRINQ_19200 equ 8000h
|
||||
; second baud rate word
|
||||
P_SRINQ_38400 equ 0001h
|
||||
P_SRINQ_56000 equ 0002h
|
||||
|
||||
; 2nd set of info
|
||||
P_SRINQ_DATA5 equ 0001h ; supports 5 data bits
|
||||
P_SRINQ_DATA6 equ 0002h ; supports 6 data bits
|
||||
P_SRINQ_DATA7 equ 0004h ; supports 7 data bits
|
||||
P_SRINQ_DATA8 equ 0008h ; supports 8 data bits
|
||||
P_SRINQ_STOP2 equ 0010h ; supports 2 stop bits (as well as 1)
|
||||
P_SRINQ_PAREVEN equ 0020h ; supports even parity
|
||||
P_SRINQ_PARODD equ 0040h ; supports odd parity
|
||||
P_SRINQ_PARMARK equ 0080h ; supports mark parity
|
||||
P_SRINQ_PARSPACE equ 0100h ; supports space parity
|
||||
P_SRINQ_SETDTR equ 0200h ; can set DTR
|
||||
P_SRINQ_SPLIT equ 0400h ; supports split Baud rates
|
||||
P_SRINQ_XONXOFF equ 0800h ; Supports soft xon/xoff characters
|
||||
|
||||
; CRC generator section
|
||||
; The Low and High bytes of the 16 bit CRC
|
||||
CrcEnt struc
|
||||
CrcLow db ? ; CRC low byte
|
||||
CrcHigh db ? ; CRC high byte
|
||||
CrcEnt ends
|
||||
|
||||
;Serial Driver Media Access Control section (LLMAC)
|
||||
;
|
||||
P_MAXILEN equ 300 ; maximum length of information field
|
||||
|
||||
;Frame type codes
|
||||
LA_LPDU equ 0 ; The Link Acknowledge PDU
|
||||
LD_LPDU equ 1 ; The Link disconnect PDU
|
||||
LR_LPDU equ 2 ; The Link Request PDU
|
||||
LT_LPDU equ 3 ; The Link Data PDU
|
||||
P_FRM_BROKEN equ 4 ; A broken frame
|
||||
|
||||
FrameEnt struc
|
||||
FrameType db ? ; frame type
|
||||
FrameSeq db ? ; frame sequence
|
||||
FrameLen dw ? ; length of information field
|
||||
FramePbuf dw ? ; ptr to data buffer
|
||||
FrameEnt ends
|
||||
|
||||
; LLMAC layer characteristics
|
||||
LlmacEnt struc
|
||||
LlmacIlen dw ? ; maximum information field length
|
||||
LlmacSpeed dw ? ; nominal speed in characters per second
|
||||
LlmacRtint dw ? ; suggested retransmission interval
|
||||
LlmacEnt ends
|
||||
|
||||
; LINK layer structures and defines
|
||||
; IoFuncConnect service connection modes */
|
||||
P_LINK_ACCP equ 0 ; want link as acceptor
|
||||
P_LINK_INIT equ 1 ; want link as initiator
|
||||
|
||||
; Link layer states
|
||||
P_LINK_IDLE equ 0 ; no connection - idle
|
||||
P_LINK_IDLE_LR equ 1 ; no connection - awaiting LR
|
||||
P_LINK_DATA_IDLE equ 2 ; connected - idle
|
||||
P_LINK_DATA_LA equ 3 ; connected - awaiting LA
|
||||
P_LINK_IDLE_LA equ 4 ; not connected - awaiting LA (or LT) to LR
|
||||
|
||||
;State and event log record
|
||||
LinkLogEnt struc
|
||||
LinkLogState db ? ; Link layer state (as defined above)
|
||||
LinkLogEvent db ? ; Event that occured
|
||||
LinkLogEnt ends
|
||||
|
||||
P_LINK_NLOG equ 32 ; Max number of debug events,states we record
|
||||
P_LINK_LOG_MASK equ 0C0h
|
||||
P_LINK_LOG_PANIC equ 0C0h ; panic number
|
||||
P_LINK_LOG_MAC equ 0 ; MAC request or timer
|
||||
P_LINK_LOG_REQ equ 80h ; User request
|
||||
P_LINK_LOG_COMP equ 40h ; User completion
|
||||
|
||||
LinkDataEnt struc
|
||||
LinkDataLlmac LlmacEnt <>
|
||||
LinkDataBrokenCount dw ? ; count of broken frames
|
||||
LinkDataRetranCount dw ? ; re-transmission count
|
||||
LinkDataEnt ends
|
||||
|
||||
; Comms I/O drivers shared code header structs
|
||||
; Flag defines
|
||||
RQ_TIMER equ 01h ; a timer has been started
|
||||
RQ_SUPER equ 02h ; a supervisory read has been started
|
||||
RQ_WRITE equ 04h ; a write has been started
|
||||
RQ_READ equ 08h ; a data read has been started
|
||||
RQ_DISABLE_HANDLER equ 10h ; set to disable handers
|
||||
RQ_ANY equ (RQ_TIMER or RQ_SUPER or RQ_WRITE or RQ_READ)
|
||||
|
||||
;Flag bits to indicate various features of the link layer event.
|
||||
QUEUE_XMIT_LA equ 20h ; queue an LA when the transmit completes
|
||||
LINK_ACTIVE equ 40h ; set between a P_FCONNECT and a disconnect
|
||||
USER_DATA_PENDING equ 80h
|
||||
|
||||
; DONT CHANGE THE ORDER OF THIS !!
|
||||
IoRequestEnt struc
|
||||
IoRequestChan ChanEnt <> ; I/O control block
|
||||
IoRequestWaitHandler dw ? ; wait handler vector number
|
||||
IoRequestRqRead RqEnt <> ; Read request packet
|
||||
IoRequestRqWrite RqEnt <> ; Write request packet
|
||||
IoRequestRqSuper RqEnt <> ; Supervisorry request packet
|
||||
IoRequestTimerPcb dw ? ; open Timer cb
|
||||
IoRequestTimerStat dw ? ; timer completion status
|
||||
IoRequestReadStat dw ? ; read completion status
|
||||
IoRequestWriteStat dw ? ; write completion status
|
||||
IoRequestSuperStat dw ? ; supervisory completion status
|
||||
IoRequestFlags db ? ; controlling flags
|
||||
IoRequestState db ? ; current internal state
|
||||
IoRequestEnt ends
|
||||
|
||||
LnkEnt struc
|
||||
LnkIoRequest IoRequestEnt <> ; I/O header
|
||||
LnkLinkData LinkDataEnt <> ; Link layer data
|
||||
LnkNumberLog dw ? ; current log table event no.
|
||||
LnkLogTable db (size LinkLogEnt)*P_LINK_NLOG dup (?)
|
||||
LnkEnt ends
|
||||
|
||||
; XMODEM structures and defines
|
||||
; IoFuncConnect service connection modes */
|
||||
P_XMDM_ACCP equ 0 ; want link as acceptor
|
||||
P_XMDM_INIT equ 1 ; want link as initiator
|
||||
|
||||
; Xmodem link types
|
||||
P_XMDM_CRCORCHECKSUM equ 0
|
||||
P_XMDM_CRCMODE equ 1
|
||||
P_XMDM_CHECKSUMMODE equ 2
|
||||
P_YMODEM_MODE equ 3
|
||||
P_YMODEM_G_MODE equ 4
|
||||
P_XMDM_ONE_K equ 8000h
|
||||
|
||||
;Xmodem/Ymodem supported flags
|
||||
P_FXMDM_SENSE equ 0ffh ; I/O function number
|
||||
P_XSUP_XMODEM equ 01h ; original Xmodem checksum
|
||||
P_XSUP_XMODEM_CRC equ 02h ; Xmodem with CRC
|
||||
P_XSUP_ONE_K_OPTION equ 04h ; 1k frames
|
||||
P_XSUP_YMODEM equ 08h ; Ymodem
|
||||
P_XSUP_YMODEM_G equ 10h ; Ymodem-G
|
||||
|
||||
; Xmodem State defines
|
||||
P_XMDM_IDLE equ P_LINK_IDLE ; idle state (no connection)
|
||||
P_XMDM_CONNECT_RECEIVE equ 1 ; receive connect state
|
||||
P_XMDM_CONNECT_TRANSMIT equ 2 ; Transmit connect state
|
||||
P_XMDM_DATA_RECEIVE equ 3 ; receive data state
|
||||
P_XMDM_DATA_TRANSMIT equ 4 ; transmit data state
|
||||
P_XMDM_DATA_TRANSMIT_ACK equ 5 ; awaiting ACK to transmitted data
|
||||
|
||||
;State and event log record
|
||||
XmdmLogEnt struc
|
||||
LinkLogEnt <>
|
||||
XmdmLogEnt ends
|
||||
|
||||
P_XMDM_NLOG equ P_LINK_NLOG ; Max number of debug events,states we record
|
||||
P_XMDM_LOG_MASK equ P_LINK_LOG_MASK
|
||||
P_XMDM_LOG_PANIC equ P_LINK_LOG_PANIC ; panic number
|
||||
P_XMDM_LOG_REQ equ P_LINK_LOG_REQ ; User request
|
||||
P_XMDM_LOG_COMP equ P_LINK_LOG_COMP ; User completion
|
||||
|
||||
; Modem driver info
|
||||
; what options are selected
|
||||
P_MDM_TONE equ 01h
|
||||
P_MDM_BELL equ 02h
|
||||
P_MDM_NO_MODULATION equ 04h
|
||||
P_MDM_CONSTANT_SPEED equ 08h ; modem provides constant speed interface if set
|
||||
|
||||
; error correction types
|
||||
P_MDM_ERRCORRECT_NONE equ 00h
|
||||
P_MDM_ERRCORRECT equ 01h
|
||||
P_MDM_ERRCORRECT_MNP equ 02h
|
||||
P_MDM_ERRCORRECT_V42 equ 03h
|
||||
|
||||
ModemCharEnt struc
|
||||
ModemCharSupport dw ? ; flags saying what supported
|
||||
ModemCharOptions dw ? ; Selected options
|
||||
ModemCharBaudRate dw ? ; Baud rate running at
|
||||
ModemCharConnHand db ? ; Connected handshaking
|
||||
ModemCharCallHand db ? ; Wait for call handshaking
|
||||
ModemCharEnt ends
|
||||
|
||||
.list
|
||||
@@ -0,0 +1,86 @@
|
||||
.xlist
|
||||
; Include file - EPOCSIBO.INC
|
||||
; Epoc/Os SIBO specific include file
|
||||
; Copyright (c) Psion PLC 1989-90.
|
||||
;
|
||||
; VER DATE BY DESCRIPTION
|
||||
; ----- -------- ---- -----------
|
||||
; 2.00F 30/09/90 NSM Final release
|
||||
;
|
||||
EPOCSIBO_INC equ 1
|
||||
;
|
||||
SupplyEnt struc
|
||||
MainBatteryReading dw ?
|
||||
LithiumBatteryReading dw ?
|
||||
MainsPresent dw ?
|
||||
SupplyEnt ends
|
||||
;
|
||||
SupplyWarningsEnt struc
|
||||
MainBatteryWarning dw ?
|
||||
LithiumBatteryWarning dw ?
|
||||
MainBatteryMaxValue dw ?
|
||||
LithiumBatteryMaxValue dw ?
|
||||
SupplyWarningsEnt ends
|
||||
;
|
||||
MainBatZero equ 0
|
||||
MainBatVeryLow equ 1
|
||||
MainBatLow equ 2
|
||||
MainBatGood equ 3
|
||||
;
|
||||
SupplySoundWarning equ 0001h
|
||||
SupplyFlashWarning equ 0002h
|
||||
SupplySystemTimeChanged equ 0004h
|
||||
;
|
||||
SupplyInfoEnt struc
|
||||
SuMainBatLevel db ?
|
||||
SuMainBatStatus db ?
|
||||
SuBackupBatLevel db ?
|
||||
SuDcLevel db ?
|
||||
SuWarningFlags dw ?
|
||||
SuInsertionDate dd ?
|
||||
SuTicksInUseBattery dd ?
|
||||
SuTicksInUseDc dd ?
|
||||
SuMilliampTicks dd ?
|
||||
SupplyInfoEnt ends
|
||||
;
|
||||
SsdUnitInfo struc
|
||||
SsdUnitStatus db ?
|
||||
SsdUnitType db ?
|
||||
SsdUnitDevices db ?
|
||||
SsdUnitAsicType db ?
|
||||
SsdUnitChanged db ?
|
||||
SsdUnitReadCmd db ?
|
||||
SsdUnitTotalSectors dw ?
|
||||
SsdUnitMask dw ?
|
||||
SsdUnitSectorsPerDevice dw ?
|
||||
SsdUnitSpare db ?
|
||||
SsdUnitShift db ?
|
||||
SsdUnitDoReadCmd dw ?
|
||||
SsdUnitInfo ends
|
||||
;
|
||||
SsdData struc
|
||||
SsdUnitInfoBuffer SsdUnitInfo 4 dup(<>)
|
||||
SsdDoorStatus db ?
|
||||
SsdDoorDelay db ?
|
||||
SsdPakCritical db ?
|
||||
SsdDoorOpened db ?
|
||||
SsdOldFrcVector dd ?
|
||||
SsdFrcFlag dw ?
|
||||
SsdPakChannel db ?
|
||||
SsdWriteFlag db ?
|
||||
SsdFlashCount dw ?
|
||||
SsdFlashVector dw ?
|
||||
SsdFlashAddress dw ?
|
||||
SsdFlashOffset dw ?
|
||||
SsdFlashMaxProgramPulses dw ?
|
||||
SsdSaveStack dw ?
|
||||
SsdNeedSerialResume db ?
|
||||
SsdBackTo4 db ?
|
||||
SsdA9DoorNmiEnabled db ?
|
||||
SsdSpare db ?
|
||||
SsdFlashProgram dw ?
|
||||
SsdNewPddSpareBuffer db 400h dup (?)
|
||||
SsdData ends
|
||||
;
|
||||
.list
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
.xlist
|
||||
; Include file - OSPACK.INC
|
||||
; Epoc/Os Sibo packs include file.
|
||||
; Copyright (c) Psion PLC 1989-90.
|
||||
;
|
||||
; VER DATE BY DESCRIPTION
|
||||
; ----- -------- ---- -----------
|
||||
; 2.00F 30/09/90 CJ Final release
|
||||
; 2.50A 24/01/93 NSM Changed to support S3B/C
|
||||
;
|
||||
DoorOpen equ 001h
|
||||
DoorClosed equ 000h
|
||||
;
|
||||
; ASIC4 STRUCTURES AND REGISTER BITS
|
||||
; ==================================
|
||||
;
|
||||
ASIC5TYPE equ 0
|
||||
ASIC4TYPE equ 1
|
||||
;
|
||||
ASIC4R struc
|
||||
A4Data db ?
|
||||
A4Portb db ?
|
||||
A4IncAddress db ?
|
||||
A4Address db ?
|
||||
A4Dum4 db ?
|
||||
A4Dum5 db ?
|
||||
A4Dum6 db ?
|
||||
A4Control db ?
|
||||
ASIC4R ends
|
||||
;
|
||||
A4PortbMode equ A4IncAddress
|
||||
A4InfoR equ A4Portb
|
||||
A4CsSetupW equ A4Portb
|
||||
A4XInfo record A4MXPeriph:1,A4MXType:1,A4MXDevices:1,A4MXBlocks:1, \
|
||||
A4MXCheat:1,A4MXExtra:2,A4MXLowBat:1
|
||||
;
|
||||
A4SpecialMode equ 2
|
||||
A4NormalMode equ 0
|
||||
;
|
||||
A4LBO equ 080h ; Enable low battery check
|
||||
SetVppOn equ 010h ; Enable VPP bit in A4CONTROL
|
||||
SetVppOff equ 000h ; Disable VPP
|
||||
VppOnDelay equ 5 ; i.e. 5ms.
|
||||
BatteryDelay equ 1 ; 1 ms
|
||||
;
|
||||
; INTEL FLASH EPROM COMMANDS
|
||||
; ==========================
|
||||
;
|
||||
ReadCmd equ 0 ; Set into read mode when VPP is on
|
||||
EraseCmd equ 020h ; Start erase cycle
|
||||
EraseVerifyCmd equ 0a0h ; Erase verify byte
|
||||
ProgramCmd equ 040h ; Start program cycle
|
||||
ProgramVerifyCmd equ 0c0h ; Program verify byte
|
||||
MaxProgramPulses equ 25 ; Number of programs per byte
|
||||
MaxErasePulses equ 1000 ; Number of erase cycles
|
||||
EraseDelay equ 10 ; Erase program delay 10mS
|
||||
;
|
||||
; INTEL TYPE2 FLASH EPROM COMMANDS
|
||||
; ================================
|
||||
;
|
||||
Type2ReadCmd equ 0FFh ; Read byte with VPP on
|
||||
Type2EraseCmd equ 0D0h ; Start erase cycle
|
||||
Type2EraseSetup equ 020h ; Erase verify byte
|
||||
Type2ProgramCmd equ 040h ; Start program cycle
|
||||
Type2ClearStatus equ 050h ; Clear status byte
|
||||
Type2ReadStatus equ 070h ; Read status byte
|
||||
Type2MaxProgramPulses equ 1 ; Number of programs per byte
|
||||
Type2ProgramTimeout equ 150 ; 150 frames at 3.2 us is >450 us.
|
||||
Type2EraseTimeout equ 321 ; 320 ticks is 10 seconds.
|
||||
; Status Register Format
|
||||
Type2StatusBusy equ 80h
|
||||
Type2EraseSuspended equ 40h
|
||||
Type2EraseSuccess equ 20h
|
||||
Type2WriteSuccess equ 10h
|
||||
Type2VPPFail equ 08h
|
||||
;
|
||||
if HandHeld
|
||||
if Corporate or S3c
|
||||
Max01Units equ 2
|
||||
else
|
||||
Max01Units equ 3
|
||||
endif
|
||||
else
|
||||
Max01Units equ 4
|
||||
endif
|
||||
;
|
||||
; DATA STRUCTURES
|
||||
; ===============
|
||||
;
|
||||
InfoRec record PackType:3,NumberOfChips:2,BlocksPerChip:3
|
||||
;
|
||||
TypeRam equ 0
|
||||
TypeIntelFlash equ 1
|
||||
Type2IntelFlash equ 2
|
||||
TypeUnknown equ 3
|
||||
TypeRom equ 6
|
||||
TypeWriteProtected equ 7
|
||||
;
|
||||
UnitShiftNumber equ 4 ; 2^UnitShift must equal size of UnitInfo
|
||||
;
|
||||
UnitInfo struc ; This must be an whole power of 2
|
||||
UnitStatus db ?
|
||||
UnitType db ?
|
||||
UnitDevices db ?
|
||||
UnitAsicType db ?
|
||||
UnitChanged db ?
|
||||
UnitReadCmd db ?
|
||||
UnitTotalSectors dw ?
|
||||
UnitMask dw ?
|
||||
UnitSectorsPerDevice dw ?
|
||||
UnitSpare db ?
|
||||
UnitShift db ?
|
||||
UnitDoReadCmd dw ?
|
||||
UnitInfo ends
|
||||
;
|
||||
UnitBufferInBxFromBl macro
|
||||
xor bh, bh
|
||||
rept UnitShiftNumber
|
||||
shl bx, 1
|
||||
endm
|
||||
add bx, offset OsDataGroup:OsUnitInfoBuffer
|
||||
endm
|
||||
;
|
||||
.list
|
||||
|
||||
@@ -0,0 +1,620 @@
|
||||
.xlist
|
||||
; Include file - OSSIBO.INC
|
||||
; Epoc/Os Sibo include file.
|
||||
; Copyright (c) Psion PLC 1989-90.
|
||||
;
|
||||
; VER DATE BY DESCRIPTION
|
||||
; ----- -------- ---- -----------
|
||||
; 2.00F 30/09/90 NSM Final release
|
||||
;
|
||||
NoNullFrames equ 1
|
||||
;
|
||||
if Asic1
|
||||
A1Ent struc
|
||||
A1Dummy dw ?
|
||||
A1Control dw ?
|
||||
A1LcdSize dw ?
|
||||
A1LcdControl dw ?
|
||||
A1InterruptMask dw ?
|
||||
A1NonSpecificEoi dw ?
|
||||
A1TimerEoi dw ?
|
||||
A1FrcEoi dw ?
|
||||
A1ResetWatchDog dw ?
|
||||
A1FrcControl dw ?
|
||||
A1ProtectionOn dw ?
|
||||
A1ProtectionUpper dw ?
|
||||
A1ProtectionLower dw ?
|
||||
A1SoundLsw dw ?
|
||||
A1SoundMsw dw ?
|
||||
A1SoundControl dw ?
|
||||
A1Ent ends
|
||||
;
|
||||
A1Status equ A1Control
|
||||
A1ProtectionOff equ A1ProtectionOn
|
||||
A1InterruptStatus equ A1LcdControl
|
||||
;
|
||||
A1StatusR record LcdData:2,Rtc4Hz:1,SldMsw:1,ComboBusy:1,Rtc32Hz:1,ExternalNmi:1,WatchDogNmi:1,SldTx:1,A1SldEnable:1,LcdEnable:1,Ram512:1,Ram128:1,FrcSource:1,TickRate:1,FrcMode:1
|
||||
A1LcdSizeR record LcdMLineEnable:1,LcdNumberOfPixels:5,LcdEndOfFrame:10
|
||||
A1LcdControlR record LcdMode:2,LcdMLineRate:5,LcdRate:5
|
||||
A1InterruptMaskR record SldTransmit:1,SldReceive:1,FrcExpired:1,Asic2Int:1,ExpIntLeftA:1,ExpIntRightB:1,Mains:1,Timer:1
|
||||
ExpAddressLeftA equ 0200h
|
||||
ExpAddressRightB equ 0100h
|
||||
ExpChannelLeftA equ SelectChannel6
|
||||
ExpChannelRightB equ SelectChannel5
|
||||
;
|
||||
; Asic1 dependent constants
|
||||
;
|
||||
ResetWatchDog equ A1ResetWatchDog
|
||||
;
|
||||
A2Ent struc
|
||||
A2Dummy db 080h dup(?)
|
||||
A2Index dw ?
|
||||
A2Control dw ?
|
||||
A2Control1 dw ?
|
||||
A2Control2 dw ?
|
||||
A2Control3 dw ?
|
||||
A2SerialData dw ?
|
||||
A2SerialControl dw ?
|
||||
A2ChannelControl dw ?
|
||||
A2Ent ends
|
||||
;
|
||||
A2External equ A2Control1
|
||||
A2InterruptStatus equ A2Control2
|
||||
A2Status equ A2Control3
|
||||
A2KeyData equ A2SerialControl
|
||||
A2SlaveData equ A2ChannelControl
|
||||
A2IControl0 equ 0
|
||||
A2IControl1 equ 1
|
||||
A2IWrite equ 2
|
||||
A2IDDR equ 3
|
||||
;
|
||||
A2InterruptStatusR record SlaveDataOverrun:1,SlaveDataControl:1,SlaveDataValid:1,ExpansionInterrupt:1,DoorInterrupt:1
|
||||
A2StatusR record A2RevId:1,A2XExt:1,A2Sdis:1,SerialBusy:1,SerialClockState:1,A1ResetFlag:1,WakeUp:1,A1OnKey:1
|
||||
A2Control1R record SerialClockRate:2,KeyScan:4
|
||||
A2Control2R record ClockEnable7:1,ClockEnable6:1,ClockEnable5:1,BuzzerMode:1,BuzzerVolume:1,BuzzerToggle:1,XySwitch:1,DigitizerEnable:1
|
||||
A2Control3R record ElEnable:1,VhControl:1,ExpansionEnable:1,DoorEnable:1,SerialEnable:1,A2SldEnable:1,Ps34Acknowledge:1,SerialNull:1
|
||||
A2ChannelControlR record MultiplexEnable:1,ChannelSelect:3,Pack4Enable:1,Pack3Enable:1,Pack2Enable:1,Pack1Enable:1
|
||||
;
|
||||
ClockRateSlow equ 2
|
||||
ClockRateMedium equ 0
|
||||
ClockRateFast equ 3
|
||||
SelectChannel0 equ (4 shl ChannelSelect)
|
||||
SelectChannel1 equ (mask Pack1Enable)
|
||||
SelectChannel2 equ (mask Pack2Enable)
|
||||
SelectChannel3 equ (mask Pack3Enable)
|
||||
SelectChannel4 equ (mask Pack4Enable)
|
||||
SelectChannel5 equ (5 shl ChannelSelect)
|
||||
SelectChannel6 equ (6 shl ChannelSelect)
|
||||
SelectChannel7 equ (7 shl ChannelSelect)
|
||||
;
|
||||
SCONTOUT macro
|
||||
out A2SerialControl, al
|
||||
endm
|
||||
;
|
||||
SDATAOUT macro
|
||||
out A2SerialData, al
|
||||
endm
|
||||
;
|
||||
SDATAIN macro
|
||||
in al, A2SerialData
|
||||
endm
|
||||
;
|
||||
SBUSY macro
|
||||
wait
|
||||
endm
|
||||
;
|
||||
SREAD macro _REG
|
||||
mov al, SerialReadSingle or _REG
|
||||
out A2SerialControl, al
|
||||
nop
|
||||
SBUSY
|
||||
in al, A2SerialData
|
||||
endm
|
||||
;
|
||||
SREADM macro _REG
|
||||
mov al, SerialReadMulti or _REG
|
||||
out A2SerialControl, al
|
||||
nop
|
||||
SBUSY
|
||||
in al, A2SerialData
|
||||
endm
|
||||
;
|
||||
SWRITE macro _REG,_VAL
|
||||
mov al, SerialWriteSingle or _REG
|
||||
out A2SerialControl, al
|
||||
SBUSY
|
||||
mov al, _VAL
|
||||
out A2SerialData, al
|
||||
endm
|
||||
;
|
||||
SWRITEM macro _REG,_VAL
|
||||
mov al, SerialWriteMulti or _REG
|
||||
out A2SerialControl, al
|
||||
SBUSY
|
||||
mov al, _VAL
|
||||
out A2SerialData, al
|
||||
endm
|
||||
;
|
||||
SETSPEED macro _SPEED
|
||||
pushf
|
||||
cli
|
||||
mov al, OsA2Control1
|
||||
and al, not mask SerialClockRate
|
||||
ifidni <_SPEED>,<FAST>
|
||||
or al, ClockRateFast shl SerialClockRate
|
||||
endif
|
||||
ifidni <_SPEED>,<NORMAL>
|
||||
or al, ClockRateMedium shl SerialClockRate
|
||||
endif
|
||||
ifidni <_SPEED>,<SLOW>
|
||||
or al, ClockRateSlow shl SerialClockRate
|
||||
endif
|
||||
mov OsA2Control1, al
|
||||
out A2Control1, al
|
||||
popf
|
||||
endm
|
||||
;
|
||||
if LapTop
|
||||
XPUSHFCLI macro
|
||||
pushf
|
||||
cli
|
||||
endm
|
||||
XPOPF macro
|
||||
popf
|
||||
endm
|
||||
else
|
||||
XPUSHFCLI macro
|
||||
endm
|
||||
XPOPF macro
|
||||
endm
|
||||
endif
|
||||
;
|
||||
XNOP macro
|
||||
endm
|
||||
;
|
||||
@HwNullFrame macro
|
||||
call OsHwNullFrame
|
||||
endm
|
||||
;
|
||||
A3Ent struc
|
||||
A3Adc db ?
|
||||
A3Control1 db ?
|
||||
A3Setup db ?
|
||||
A3Control2 db ?
|
||||
A3Dummy1 db 3 dup (?)
|
||||
A3Control3 db ?
|
||||
A3Dummy2 db 5 dup (?)
|
||||
A3Status db ?
|
||||
A3Dummy3 db ?
|
||||
A3Ent ends
|
||||
;
|
||||
A3AdcLsbR record InvertedBit:1,OtherBits:7
|
||||
A3AdcMsbR record Polarity:1,Overrange:1,AdcBits:4
|
||||
A3Control1R record Vcc5Enable:1,Vcc4Enable:1,Vcc3Enable:1,DtoaBits:5
|
||||
A3Control2R record AnalogueMultiplex:2,VhSoftStart:1,Vee2SoftStart:1,Vee1SoftStart:1,VhEnable:1,Vee2Enable:1,Vee1Enable:1
|
||||
A3Control3R record AdcReadHighEnable:1,OffEnable:1,xDummy1:1
|
||||
Ps34ControlR record Ps34Vcc3:1,xDummy2:1,Ps34Vcc4:1,xDummy3:1,Ps34Vcc5:1,xDummy4:3
|
||||
;
|
||||
AdcDigitizer equ 0
|
||||
AdcVh equ 1
|
||||
AdcMainBattery equ 2
|
||||
AdcLithiumBattery equ 3
|
||||
A3SetupValue equ 2
|
||||
A3SelectId equ (SerialSelect or Asic5NormalId)
|
||||
A3InfoByte equ 080h
|
||||
;
|
||||
Vee1SoftStartDelay equ (30*128)
|
||||
Vee2SoftStartDelay equ (30*128)
|
||||
VhSoftStartDelay equ (100*128)
|
||||
Vee1OffDelay equ (100*128)
|
||||
Vee2OffDelay equ (100*128)
|
||||
VhOffDelay equ (100*128)
|
||||
Vcc3Delay equ (25*128)
|
||||
Vcc4Delay equ (25*128)
|
||||
Vcc5Delay equ (25*128)
|
||||
Vcc4OffFrames equ (25)
|
||||
Vcc1_4To5Delay equ (3) ; Pan only in ms.
|
||||
Vcc1_4to5OffFrames equ (20) ; Gives 392 frames = 6.0 ms
|
||||
Vcc1_4to5OnTime equ 4 ; Gives 4 ms
|
||||
;
|
||||
PS34R_ADC equ 0
|
||||
PS34R_STATUS equ 1
|
||||
PS34W_CONTROL equ 0
|
||||
PS34W_DTOA equ 1
|
||||
PS34W_OFF equ 0eh
|
||||
;
|
||||
PS34STATR record pPowerFail:1,pColdStart:1,pVhready:1,pPenup:1,pNc:1,pAdmsb:3
|
||||
PS34CONTR record pVcc3:1,pVee1:1,pVcc4:1,pVee2:1,pVcc5:1,pVh:1,pVhpower:2
|
||||
PS34DTOAR record pNcc:1,pAdcsel:2,pDac:5
|
||||
;
|
||||
ADCSEL_ADCIN equ 0
|
||||
ADCSEL_VIN equ 1
|
||||
ADCSEL_VH equ 2
|
||||
ADCSEL_VBATT equ 3
|
||||
;
|
||||
VHP1TO8 equ 0
|
||||
VHP1TO4 equ 1
|
||||
VHP1TO2 equ 2
|
||||
VHP1TO1 equ 3
|
||||
;
|
||||
PPowerControl equ 0100h
|
||||
PPowerControlR record PVcc5Enable:1,PSoundEnable:1,PVee1Enable:1,PDropVoltage:1,PDac:4
|
||||
PPia record PSoundVol:2,PClearCold:1,PDcPresent:1,PColdFlag:1,PLithiumWarn:1,PVinWarn:1
|
||||
PSoundControl equ 0200h
|
||||
endif
|
||||
;
|
||||
A3StatusR record PowerFail:1,ColdStart:1
|
||||
AIntfR record ResetFlag:1,DummyWakeUp:1,OnKey:1
|
||||
if Asic1
|
||||
if ((mask ResetFlag) ne (mask A1ResetFlag)) or \
|
||||
((mask OnKey) ne (mask A1OnKey))
|
||||
.err Reset or OnKey flags are not equal
|
||||
endif
|
||||
endif
|
||||
;
|
||||
SerialWriteSingle equ 10000000b
|
||||
SerialWriteMulti equ 10010000b
|
||||
SerialReadSingle equ 11000000b
|
||||
SerialReadMulti equ 11010000b
|
||||
SerialReset equ 00000000b
|
||||
SerialSelect equ 01000000b
|
||||
;
|
||||
Asic4Id equ 006h
|
||||
Asic5PackId equ 002h
|
||||
Asic5NormalId equ 003h
|
||||
Asic6Id equ 004h
|
||||
Asic8Id equ 005h
|
||||
Asic2SlaveId equ 01fh
|
||||
;
|
||||
; Asic5 info byte structure
|
||||
;
|
||||
A5InfoByteR record A5TTL:1,A5Modem:1,A5MultiDrop:1,A5Barcode:1,A5Other:2,A5Parallel:1,A5Rs232:1
|
||||
A5OtherRom equ (1 shl A5Other)
|
||||
A5OtherMCRTTL equ (3 shl A5Other)
|
||||
A5MCR equ (2 shl A5Other)
|
||||
;
|
||||
if Consumer
|
||||
if S3b
|
||||
DefaultLcdContrast equ 9
|
||||
else
|
||||
DefaultLcdContrast equ 7
|
||||
endif
|
||||
else
|
||||
if S3c
|
||||
DefaultLcdContrast equ 9
|
||||
else
|
||||
DefaultLcdContrast equ 15
|
||||
endif
|
||||
endif
|
||||
;
|
||||
InterruptBase equ 078h
|
||||
;
|
||||
if Asic9
|
||||
KeyPollColumns equ 8
|
||||
else
|
||||
KeyPollColumns equ 10
|
||||
endif
|
||||
KeyInitialDelay equ 24
|
||||
if Consumer or S3c
|
||||
KeyRepeatDelay equ 2
|
||||
else
|
||||
KeyRepeatDelay equ 4
|
||||
endif
|
||||
PenUpDelay equ 16
|
||||
MouseDownDelay equ 8
|
||||
KeySettleDelay equ 24
|
||||
KeyCntrlMask equ 00000001b
|
||||
KeyLeftShiftMask equ 00000010b
|
||||
KeyPsionMask equ 00000100b
|
||||
KeyCapsMask equ 00001000b
|
||||
KeyRightShiftMask equ 00010000b
|
||||
DigitizerRowMask equ 00010000b
|
||||
PsionScanCode equ 6
|
||||
CapsScanCode equ 5
|
||||
PsionUpScanCode equ 65
|
||||
;
|
||||
PostRomTest equ 010h
|
||||
PostSystemRamTest equ 020h
|
||||
PostVideoRamTest equ 030h
|
||||
PostComplete equ 0f0h
|
||||
if Consumer or S3c
|
||||
PostPort equ 0h
|
||||
else
|
||||
PostPort equ 01ffh
|
||||
endif
|
||||
;
|
||||
if HandHeld
|
||||
VideoRamSegment equ 00040h
|
||||
VideoRamBase equ 00000h
|
||||
if Corporate
|
||||
VideoRamWords equ 00320h
|
||||
else
|
||||
if S3b
|
||||
VideoRamWords equ 02580h
|
||||
else
|
||||
if S3c
|
||||
VideoRamWords equ 00C80h
|
||||
else
|
||||
VideoRamWords equ 00500h
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
else
|
||||
VideoRamSegment equ 0b800h
|
||||
VideoRamBase equ 00000h
|
||||
VideoRamWords equ 04000h
|
||||
endif
|
||||
;
|
||||
CalSeg equ 0fffeh
|
||||
CalEnt struc
|
||||
CalVsupCLsw dw ?
|
||||
CalVsupCMsw dw ?
|
||||
CalVsupM dw ?
|
||||
CalVlthCLsw dw ?
|
||||
CalVlthCMsw dw ?
|
||||
CalVlthM dw ?
|
||||
CalType dw ?
|
||||
CalEnt ends
|
||||
;
|
||||
CHKeyDataR record CHInSled:1,CHMains:1,CHDummy:2
|
||||
;
|
||||
IntBXHw equ -2
|
||||
;
|
||||
if Asic9
|
||||
A9WControlRW equ 0002h
|
||||
A9RControl record A9MFrc2Is512KHzOr1KHz:1,A9MFrc2PreScale:1,\
|
||||
A9MFrc1Is512KHzOr1Hz:1,A9MFrc1PreScale:1,\
|
||||
A9MSoundEnable:1,A9MLcdEnable:1,\
|
||||
A9MLowBatNMIEnable:1,A9MDoorNMIEnable:1,\
|
||||
A9MZeroIsGrayMode:1,A9MArmStandBy:1,\
|
||||
A9MDisableDMADivide:1,A9MRamDeviceSize:2,\
|
||||
A9MDisableMemWait:1,A9MDisableIoWait:1,\
|
||||
A9MDisableClockDivide:1
|
||||
A9VRam256KBits equ (0 shl A9MRamDeviceSize)
|
||||
A9VRam1MBits equ (1 shl A9MRamDeviceSize)
|
||||
A9VRam4MBits equ (2 shl A9MRamDeviceSize)
|
||||
A9VRam16MBits equ (3 shl A9MRamDeviceSize)
|
||||
A9XRamDeviceSizeMask equ (3 shl A9MRamDeviceSize)
|
||||
A9WStatusR equ 0004h
|
||||
A9RStatus record A9MCold:1,A9MPowerFail:1,\
|
||||
A9MReset:1,A9MNoBattery:1,\
|
||||
A9MFifoFull:1,A9MSlaveOverrun:1,\
|
||||
A9MSlaveControlFrame:1,A9MSlaveDataValid:1,\
|
||||
A9MKeyboard:1,A9MSlaveClock:1,\
|
||||
A9MMainsPresent:1,A9MDoorSwitch:1,\
|
||||
A9MLowBatNMI:1,A9MDoorNMI:1,\
|
||||
A9MProtectedModeNMI:1,A9MWatchDogNMI:1
|
||||
A9MLcdType equ 8
|
||||
A9XLcdType equ 0000111100000000b
|
||||
A9WLcdSizeW equ 0004h
|
||||
A9RLcdSize record A9MLcdLineLength:5,A9MLcdNumberOfPixels:11
|
||||
A9WLcdControlW equ 0006h
|
||||
A9RLcdControl record A9MLcdMode:2,A9MLcdACLineRate:5,A9MLcdPixelRate:5
|
||||
A9VSinglePage1 equ (0 shl A9MLcdMode)
|
||||
A9VSinglePage2 equ (1 shl A9MLcdMode)
|
||||
A9VSinglePage1And2 equ (2 shl A9MLcdMode)
|
||||
A9VDualPage1And2 equ (3 shl A9MLcdMode)
|
||||
A9BInterruptStatusR equ 0006h
|
||||
A9BInterruptMaskRW equ 0008h
|
||||
A9RInterrupts record A9MFrc2:1,A9MFrc1:1,\
|
||||
A9MExpIntB:1,A9MExpIntA:1,A9MExpIntC:1,\
|
||||
A9MSlave:1,A9MTimer:1,A9MSound:1
|
||||
A9BNmiClearW equ 0009h
|
||||
A9BNonSpecificEoiW equ 000ah
|
||||
A9BStartFlagClearW equ 000bh
|
||||
A9BTimerEoiW equ 000ch
|
||||
A9BSerialSlaveEoiW equ 000dh
|
||||
A9BFrc1EoiW equ 000eh
|
||||
A9BFrc2EoiW equ 000fh
|
||||
A9WResetWatchDogW equ 0010h
|
||||
A9WFrc1DataRW equ 0012h
|
||||
A9BProtectionOnW equ 0014h
|
||||
A9BProtectionOffR equ 0014h
|
||||
A9BProtectionOffW equ 0015h
|
||||
A9WProtectionUpperW equ 0016h
|
||||
A9WProtectionLowerW equ 0018h
|
||||
A9BSoundDataRW equ 001ah
|
||||
A9BSoundEoiW equ 001ch
|
||||
A9WFrc2DataRW equ 001eh
|
||||
A9WPortABDataRW equ 0020h
|
||||
if S3b
|
||||
A9RPortABData record A9MKeyId0:1,A9MSleepDoorNmiDisabled:1,\
|
||||
A9MBatLevel2:1,A9MBatLevel1:1,A9MLiBatLevel:1,\
|
||||
A9MKeyRow:11
|
||||
endif
|
||||
if S3c
|
||||
A9RPortABData record A9MKeyIdX2:1,A9MNiCdDetect:1,\
|
||||
A9MBatLevel2:1,A9MBatLevel1:1,A9MLiBatLevel:1,\
|
||||
A9MKeyIdX1:1,A9MKeyIdX0:0,A9MKeyRowX8:1,\
|
||||
A9MCradle:1,A9MKeyRowX:7
|
||||
endif
|
||||
A9BPortADataRW equ 0020h
|
||||
A9BPortBDataRW equ 0021h
|
||||
A9WPortABDDRRW equ 0022h
|
||||
A9VPortABDDR equ 0000000000000000b
|
||||
A9BPortADDRRW equ 0022h
|
||||
A9BPortBDDRRW equ 0023h
|
||||
A9WPortCDDataRW equ 0024h
|
||||
if S3b
|
||||
A9RPortCDData record A9MVccPacksEnable:1,A9MCodecEnable:1,\
|
||||
A9MVccLcdEnable:1,A9MLcdPanelEnable:1,\
|
||||
A9MLcdContrast:4,A9MVolume:2,\
|
||||
A9MReproEnable:1,A9MAltDoorNMIEnable:1,\
|
||||
A9MAmplifierEnable:1,A9MKeyIdEnable:1,\
|
||||
A9MKeyId2:1,A9MKeyId1:1
|
||||
A9VVolumeLow equ (mask A9MVolume)
|
||||
A9VPortCDData equ 0000111100000000b
|
||||
A9VPortCDDDR equ not (1111000011111100b)
|
||||
endif
|
||||
if S3c
|
||||
A9RPortCDData record A9MVccPacksEnable:1,A9MCodecEnable:1,\
|
||||
A9MVccLcdEnable:1,A9MLcdPanelEnable:1,\
|
||||
A9MLcdContrast:4,A9MVolume:2,\
|
||||
A9MReproEnable:1,A9MAltDoorNMIEnable:1,\
|
||||
A9MAmplifierEnable:1,A9MKeyIdEnable:1,\
|
||||
A9MBuzVolX:1,A9MBacklightEnableX:1
|
||||
A9VVolumeLow equ (mask A9MVolume)
|
||||
A9VPortCDData equ 0000111100000000b
|
||||
A9VPortCDDDR equ not (1111000011111111b)
|
||||
endif
|
||||
A9BPortCDataRW equ 0024h
|
||||
A9BPortDDataRW equ 0025h
|
||||
A9WPortCDDDRRW equ 0026h
|
||||
A9BPortCDDRRW equ 0026h
|
||||
A9BPortDDDRRW equ 0027h
|
||||
A9BPageSelect6000RW equ 0028h
|
||||
A9BPageSelect7000RW equ 0029h
|
||||
A9BPageSelect8000RW equ 002ah
|
||||
A9BPageSelect9000RW equ 002bh
|
||||
A9WControlExtraRW equ 002ch
|
||||
A9RControlExtraRW record A9MSlaveIntEnable:1,A9MClkDiv:2,\
|
||||
A9MClockEnable5:1,A9MClockEnable4:1,\
|
||||
A9MClockEnable3:1,A9MClockEnable2:1,\
|
||||
A9MClockEnable1:1,A9MSoundDir:1,\
|
||||
A9MExonDisable:1,A9MBuzzFromFrc1OrTog:1,\
|
||||
A9MBuzzTog:1,A9MKeyCol:4
|
||||
A9VKeyColHigh equ 0
|
||||
A9VKeyColLow equ 1
|
||||
A9VKeyCol0 equ 8
|
||||
A9VClkDiv1 equ (3 shl A9MClkDiv)
|
||||
A9VClkDiv2 equ (2 shl A9MClkDiv)
|
||||
A9VClkDiv3 equ (1 shl A9MClkDiv)
|
||||
A9VClkDiv4 equ (0 shl A9MClkDiv)
|
||||
A9WPumpControlRW equ 002eh
|
||||
A9RPumpControl record A9MVhPumpDc:4,A9MVhPumpBat:4,\
|
||||
A9MLcdPump:4,A9MPump2:4
|
||||
A9VVhPumpBat equ (14 shl A9MVhPumpBat)
|
||||
A9VVhPumpBatSoft equ (4 shl A9MVhPumpBat)
|
||||
A9VVhPumpBatMedium equ (8 shl A9MVhPumpBat)
|
||||
A9VVhPumpDC equ (2 shl A9MVhPumpDc)
|
||||
A9VVhPumpDCSoft equ (1 shl A9MVhPumpDc)
|
||||
A9VLcdPump equ (7 shl A9MLcdPump)
|
||||
A9VLcdPumpSoft equ (1 shl A9MLcdPump)
|
||||
A9VPacksPumpSoft equ (15 shl A9MPump2)
|
||||
A9VVhPumpDelay equ 100 ; Milliseconds
|
||||
A9VLcdPumpDelay equ 5 ; Milliseconds
|
||||
A9VCC3OnDelay equ 1 ; Milliseconds
|
||||
A9VCCPacksDelay equ 20 ; Milliseconds
|
||||
A9VCC2Delay equ 10 ; Milliseconds
|
||||
A9WRtcLSWRW equ 0080h
|
||||
A9WRtcMSWRW equ 0082h
|
||||
A9WNullFrameW equ 0084h
|
||||
A9BSlaveDataR equ 0088h
|
||||
A9BSerialDataRW equ 008ah
|
||||
A9BSerialControlW equ 008ch
|
||||
A9BChannelSelectRW equ 008eh
|
||||
A9RChannelSelect record A9MMultiplexEnable:1,A9MSerialClockRate:2,\
|
||||
A9MPack5Enable:1,A9MPack4Enable:1,\
|
||||
A9MPack3Enable:1,A9MPack2Enable:1,\
|
||||
A9MPack1Enable:1
|
||||
A9VSClkRateMedium equ (0 shl A9MSerialClockRate)
|
||||
A9VSClkRateSpecial equ (1 shl A9MSerialClockRate)
|
||||
A9VSClkRateSlow equ (2 shl A9MSerialClockRate)
|
||||
A9VSClkRateFast equ (3 shl A9MSerialClockRate)
|
||||
;
|
||||
; Asic9 Dependent constants
|
||||
;
|
||||
ResetWatchDog equ A9WResetWatchDogW
|
||||
SelectChannel1 equ (mask A9MPack1Enable)
|
||||
SelectChannel2 equ (mask A9MPack2Enable)
|
||||
SelectChannel3 equ (mask A9MPack3Enable)
|
||||
SelectChannel4 equ (mask A9MPack4Enable)
|
||||
SelectChannel5 equ (mask A9MPack5Enable)
|
||||
;
|
||||
; Current usage values
|
||||
;
|
||||
IdleCurrent equ 23
|
||||
RunCurrent equ 51
|
||||
Asic5SerialCurrent equ 54
|
||||
Flash1ProgramCurrent equ 76
|
||||
Flash2ProgramCurrent equ 99
|
||||
Flash1EraseCurrent equ 94
|
||||
Flash2EraseCurrent equ 129
|
||||
;
|
||||
; We add 26 because most of the work is under the NULL process.
|
||||
; The value is 26 and not 28 because 10% of the time we are
|
||||
; under the sound server.
|
||||
;
|
||||
SoundCurrentPlayV3 equ (25+20)
|
||||
SoundCurrentPlayV2 equ (30+20)
|
||||
SoundCurrentPlayV1 equ (55+20)
|
||||
SoundCurrentPlayV0 equ (120+20)
|
||||
;
|
||||
; The value here must never equal one of the play values.
|
||||
; It won't anyway in practise so this is not a big deal.
|
||||
;
|
||||
SoundCurrentRecord equ 5
|
||||
;
|
||||
SCONTOUT macro
|
||||
out A9BSerialControlW, al
|
||||
endm
|
||||
;
|
||||
SDATAOUT macro
|
||||
out A9BSerialDataRW, al
|
||||
endm
|
||||
;
|
||||
SDATAIN macro
|
||||
in al, A9BSerialDataRW
|
||||
endm
|
||||
;
|
||||
SBUSY macro
|
||||
endm
|
||||
;
|
||||
SREAD macro _REG
|
||||
mov al, SerialReadSingle or _REG
|
||||
out A9BSerialControlW, al
|
||||
in al, A9BSerialDataRW
|
||||
endm
|
||||
;
|
||||
SREADM macro _REG
|
||||
mov al, SerialReadMulti or _REG
|
||||
out A9BSerialControlW, al
|
||||
in al, A9BSerialDataRW
|
||||
endm
|
||||
;
|
||||
SWRITE macro _REG,_VAL
|
||||
mov al, SerialWriteSingle or _REG
|
||||
out A9BSerialControlW, al
|
||||
mov al, _VAL
|
||||
out A9BSerialDataRW, al
|
||||
endm
|
||||
;
|
||||
SWRITEM macro _REG,_VAL
|
||||
mov al, SerialWriteMulti or _REG
|
||||
out A9BSerialControlW, al
|
||||
mov al, _VAL
|
||||
out A9BSerialDataRW, al
|
||||
endm
|
||||
;
|
||||
SETSPEED macro _SPEED
|
||||
pushf
|
||||
cli
|
||||
in al, A9BChannelSelectRW
|
||||
and al, not (mask A9MSerialClockRate)
|
||||
ifidni <_SPEED>,<FAST>
|
||||
or al, A9VSClkRateFast
|
||||
endif
|
||||
ifidni <_SPEED>,<NORMAL>
|
||||
or al, A9VSClkRateMedium
|
||||
endif
|
||||
ifidni <_SPEED>,<SLOW>
|
||||
or al, A9VSClkRateSlow
|
||||
endif
|
||||
out A9BChannelSelectRW, al
|
||||
popf
|
||||
endm
|
||||
;
|
||||
XPUSHFCLI macro
|
||||
endm
|
||||
XPOPF macro
|
||||
endm
|
||||
XNOP macro
|
||||
endm
|
||||
;
|
||||
@HwNullFrame macro
|
||||
out A9WNullFrameW, ax
|
||||
endm
|
||||
endif
|
||||
;
|
||||
.list
|
||||
|
||||
Executable
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
+10692
File diff suppressed because it is too large
Load Diff
+74702
File diff suppressed because it is too large
Load Diff
+72601
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,834 @@
|
||||
{
|
||||
"identifier": "psion-sibo-c-sdk",
|
||||
"format-version": "2",
|
||||
"archive-hocr-tools-version": "1.1.54",
|
||||
"confidence": 87,
|
||||
"pages": [
|
||||
{
|
||||
"leafNum": 0,
|
||||
"confidence": null,
|
||||
"pageNumber": "",
|
||||
"pageProb": null,
|
||||
"wordConf": null
|
||||
},
|
||||
{
|
||||
"leafNum": 1,
|
||||
"confidence": null,
|
||||
"pageNumber": "",
|
||||
"pageProb": null,
|
||||
"wordConf": null
|
||||
},
|
||||
{
|
||||
"leafNum": 2,
|
||||
"confidence": null,
|
||||
"pageNumber": "",
|
||||
"pageProb": null,
|
||||
"wordConf": null
|
||||
},
|
||||
{
|
||||
"leafNum": 3,
|
||||
"confidence": null,
|
||||
"pageNumber": "",
|
||||
"pageProb": null,
|
||||
"wordConf": null
|
||||
},
|
||||
{
|
||||
"leafNum": 4,
|
||||
"confidence": 81,
|
||||
"pageNumber": "2",
|
||||
"pageProb": 71,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 5,
|
||||
"confidence": 97,
|
||||
"pageNumber": "3",
|
||||
"pageProb": 87,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 6,
|
||||
"confidence": 81,
|
||||
"pageNumber": "4",
|
||||
"pageProb": 71,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 7,
|
||||
"confidence": 97,
|
||||
"pageNumber": "5",
|
||||
"pageProb": 87,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 8,
|
||||
"confidence": 81,
|
||||
"pageNumber": "6",
|
||||
"pageProb": 71,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 9,
|
||||
"confidence": 97,
|
||||
"pageNumber": "7",
|
||||
"pageProb": 87,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 10,
|
||||
"confidence": 81,
|
||||
"pageNumber": "8",
|
||||
"pageProb": 71,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 11,
|
||||
"confidence": 97,
|
||||
"pageNumber": "9",
|
||||
"pageProb": 87,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 12,
|
||||
"confidence": 79,
|
||||
"pageNumber": "10",
|
||||
"pageProb": 69,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 13,
|
||||
"confidence": 96,
|
||||
"pageNumber": "11",
|
||||
"pageProb": 86,
|
||||
"wordConf": 87
|
||||
},
|
||||
{
|
||||
"leafNum": 14,
|
||||
"confidence": 78,
|
||||
"pageNumber": "12",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 15,
|
||||
"confidence": 96,
|
||||
"pageNumber": "13",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 16,
|
||||
"confidence": 78,
|
||||
"pageNumber": "14",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 17,
|
||||
"confidence": 96,
|
||||
"pageNumber": "15",
|
||||
"pageProb": 86,
|
||||
"wordConf": 93
|
||||
},
|
||||
{
|
||||
"leafNum": 18,
|
||||
"confidence": 87,
|
||||
"pageNumber": "16",
|
||||
"pageProb": 77,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 19,
|
||||
"confidence": 96,
|
||||
"pageNumber": "17",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 20,
|
||||
"confidence": 79,
|
||||
"pageNumber": "18",
|
||||
"pageProb": 69,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 21,
|
||||
"confidence": 96,
|
||||
"pageNumber": "19",
|
||||
"pageProb": 86,
|
||||
"wordConf": 97
|
||||
},
|
||||
{
|
||||
"leafNum": 22,
|
||||
"confidence": 78,
|
||||
"pageNumber": "20",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 23,
|
||||
"confidence": 96,
|
||||
"pageNumber": "21",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 24,
|
||||
"confidence": 86,
|
||||
"pageNumber": "22",
|
||||
"pageProb": 76,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 25,
|
||||
"confidence": 96,
|
||||
"pageNumber": "23",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 26,
|
||||
"confidence": 78,
|
||||
"pageNumber": "24",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 27,
|
||||
"confidence": 96,
|
||||
"pageNumber": "25",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 28,
|
||||
"confidence": 78,
|
||||
"pageNumber": "26",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 29,
|
||||
"confidence": 96,
|
||||
"pageNumber": "27",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 30,
|
||||
"confidence": 78,
|
||||
"pageNumber": "28",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 31,
|
||||
"confidence": 96,
|
||||
"pageNumber": "29",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 32,
|
||||
"confidence": 78,
|
||||
"pageNumber": "30",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 33,
|
||||
"confidence": 96,
|
||||
"pageNumber": "31",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 34,
|
||||
"confidence": 78,
|
||||
"pageNumber": "32",
|
||||
"pageProb": 68,
|
||||
"wordConf": 97
|
||||
},
|
||||
{
|
||||
"leafNum": 35,
|
||||
"confidence": 96,
|
||||
"pageNumber": "33",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 36,
|
||||
"confidence": 78,
|
||||
"pageNumber": "34",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 37,
|
||||
"confidence": 96,
|
||||
"pageNumber": "35",
|
||||
"pageProb": 86,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 38,
|
||||
"confidence": 78,
|
||||
"pageNumber": "36",
|
||||
"pageProb": 68,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 39,
|
||||
"confidence": 96,
|
||||
"pageNumber": "37",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 40,
|
||||
"confidence": 78,
|
||||
"pageNumber": "38",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 41,
|
||||
"confidence": 96,
|
||||
"pageNumber": "39",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 42,
|
||||
"confidence": 78,
|
||||
"pageNumber": "40",
|
||||
"pageProb": 68,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 43,
|
||||
"confidence": 96,
|
||||
"pageNumber": "41",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 44,
|
||||
"confidence": 78,
|
||||
"pageNumber": "42",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 45,
|
||||
"confidence": 96,
|
||||
"pageNumber": "43",
|
||||
"pageProb": 86,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 46,
|
||||
"confidence": 78,
|
||||
"pageNumber": "44",
|
||||
"pageProb": 68,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 47,
|
||||
"confidence": 96,
|
||||
"pageNumber": "45",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 48,
|
||||
"confidence": 78,
|
||||
"pageNumber": "46",
|
||||
"pageProb": 68,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 49,
|
||||
"confidence": 96,
|
||||
"pageNumber": "47",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 50,
|
||||
"confidence": 78,
|
||||
"pageNumber": "48",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 51,
|
||||
"confidence": 96,
|
||||
"pageNumber": "49",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 52,
|
||||
"confidence": 78,
|
||||
"pageNumber": "50",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 53,
|
||||
"confidence": 96,
|
||||
"pageNumber": "51",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 54,
|
||||
"confidence": 78,
|
||||
"pageNumber": "52",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 55,
|
||||
"confidence": 96,
|
||||
"pageNumber": "53",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 56,
|
||||
"confidence": 78,
|
||||
"pageNumber": "54",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 57,
|
||||
"confidence": 96,
|
||||
"pageNumber": "55",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 58,
|
||||
"confidence": 78,
|
||||
"pageNumber": "56",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 59,
|
||||
"confidence": 96,
|
||||
"pageNumber": "57",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 60,
|
||||
"confidence": 78,
|
||||
"pageNumber": "58",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 61,
|
||||
"confidence": 96,
|
||||
"pageNumber": "59",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 62,
|
||||
"confidence": 78,
|
||||
"pageNumber": "60",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 63,
|
||||
"confidence": 96,
|
||||
"pageNumber": "61",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 64,
|
||||
"confidence": 78,
|
||||
"pageNumber": "62",
|
||||
"pageProb": 68,
|
||||
"wordConf": 97
|
||||
},
|
||||
{
|
||||
"leafNum": 65,
|
||||
"confidence": 96,
|
||||
"pageNumber": "63",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 66,
|
||||
"confidence": 78,
|
||||
"pageNumber": "64",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 67,
|
||||
"confidence": 96,
|
||||
"pageNumber": "65",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 68,
|
||||
"confidence": 78,
|
||||
"pageNumber": "66",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 69,
|
||||
"confidence": 96,
|
||||
"pageNumber": "67",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 70,
|
||||
"confidence": 78,
|
||||
"pageNumber": "68",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 71,
|
||||
"confidence": 96,
|
||||
"pageNumber": "69",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 72,
|
||||
"confidence": 78,
|
||||
"pageNumber": "70",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 73,
|
||||
"confidence": 96,
|
||||
"pageNumber": "71",
|
||||
"pageProb": 86,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 74,
|
||||
"confidence": 78,
|
||||
"pageNumber": "72",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 75,
|
||||
"confidence": 96,
|
||||
"pageNumber": "73",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 76,
|
||||
"confidence": 78,
|
||||
"pageNumber": "74",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 77,
|
||||
"confidence": 96,
|
||||
"pageNumber": "75",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 78,
|
||||
"confidence": 78,
|
||||
"pageNumber": "76",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 79,
|
||||
"confidence": 96,
|
||||
"pageNumber": "77",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 80,
|
||||
"confidence": 78,
|
||||
"pageNumber": "78",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 81,
|
||||
"confidence": 96,
|
||||
"pageNumber": "79",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 82,
|
||||
"confidence": 78,
|
||||
"pageNumber": "80",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 83,
|
||||
"confidence": 96,
|
||||
"pageNumber": "81",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 84,
|
||||
"confidence": 78,
|
||||
"pageNumber": "82",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 85,
|
||||
"confidence": 96,
|
||||
"pageNumber": "83",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 86,
|
||||
"confidence": 78,
|
||||
"pageNumber": "84",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 87,
|
||||
"confidence": 96,
|
||||
"pageNumber": "85",
|
||||
"pageProb": 86,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 88,
|
||||
"confidence": 78,
|
||||
"pageNumber": "86",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 89,
|
||||
"confidence": 96,
|
||||
"pageNumber": "87",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 90,
|
||||
"confidence": 78,
|
||||
"pageNumber": "88",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 91,
|
||||
"confidence": 96,
|
||||
"pageNumber": "89",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 92,
|
||||
"confidence": 78,
|
||||
"pageNumber": "90",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 93,
|
||||
"confidence": 96,
|
||||
"pageNumber": "91",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 94,
|
||||
"confidence": 78,
|
||||
"pageNumber": "92",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 95,
|
||||
"confidence": 96,
|
||||
"pageNumber": "93",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 96,
|
||||
"confidence": 78,
|
||||
"pageNumber": "94",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 97,
|
||||
"confidence": 96,
|
||||
"pageNumber": "95",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 98,
|
||||
"confidence": 78,
|
||||
"pageNumber": "96",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 99,
|
||||
"confidence": 96,
|
||||
"pageNumber": "97",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 100,
|
||||
"confidence": 78,
|
||||
"pageNumber": "98",
|
||||
"pageProb": 68,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 101,
|
||||
"confidence": 96,
|
||||
"pageNumber": "99",
|
||||
"pageProb": 86,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 102,
|
||||
"confidence": 76,
|
||||
"pageNumber": "100",
|
||||
"pageProb": 66,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 103,
|
||||
"confidence": 95,
|
||||
"pageNumber": "101",
|
||||
"pageProb": 85,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 104,
|
||||
"confidence": 76,
|
||||
"pageNumber": "102",
|
||||
"pageProb": 66,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 105,
|
||||
"confidence": 95,
|
||||
"pageNumber": "103",
|
||||
"pageProb": 85,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 106,
|
||||
"confidence": 76,
|
||||
"pageNumber": "104",
|
||||
"pageProb": 66,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 107,
|
||||
"confidence": 95,
|
||||
"pageNumber": "105",
|
||||
"pageProb": 85,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 108,
|
||||
"confidence": 76,
|
||||
"pageNumber": "106",
|
||||
"pageProb": 66,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 109,
|
||||
"confidence": 95,
|
||||
"pageNumber": "107",
|
||||
"pageProb": 85,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 110,
|
||||
"confidence": 76,
|
||||
"pageNumber": "108",
|
||||
"pageProb": 66,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 111,
|
||||
"confidence": 95,
|
||||
"pageNumber": "109",
|
||||
"pageProb": 85,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 112,
|
||||
"confidence": 76,
|
||||
"pageNumber": "110",
|
||||
"pageProb": 66,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 113,
|
||||
"confidence": 95,
|
||||
"pageNumber": "111",
|
||||
"pageProb": 85,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 114,
|
||||
"confidence": 76,
|
||||
"pageNumber": "112",
|
||||
"pageProb": 66,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 115,
|
||||
"confidence": 95,
|
||||
"pageNumber": "113",
|
||||
"pageProb": 85,
|
||||
"wordConf": 96
|
||||
},
|
||||
{
|
||||
"leafNum": 116,
|
||||
"confidence": 75,
|
||||
"pageNumber": "114",
|
||||
"pageProb": 65,
|
||||
"wordConf": 95
|
||||
},
|
||||
{
|
||||
"leafNum": 117,
|
||||
"confidence": 95,
|
||||
"pageNumber": "115",
|
||||
"pageProb": 85,
|
||||
"wordConf": 95
|
||||
}
|
||||
]
|
||||
}
|
||||
+1660
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
||||
Copyright (c) Psion PLC (1995)
|
||||
|
||||
26th May 1995
|
||||
|
||||
CONTENTS OF FILES ON DISK
|
||||
=========================
|
||||
|
||||
readme.txt
|
||||
|
||||
ASSEMBLER INCLUDE FILES
|
||||
epoc.inc
|
||||
epocser.inc
|
||||
epoclib.inc
|
||||
epocsibo.inc
|
||||
ossibo.inc
|
||||
ospack.inc
|
||||
|
||||
C FILES
|
||||
a4test.c ;Fully comprehensive test program for A4EXIF.LDD
|
||||
a4test.pr ;TopSpeed Project file for the above test program
|
||||
|
||||
ASM FILES
|
||||
a4exif.asm ;Source code file for A4EXIF.LDD
|
||||
sys$as5.asm ;Source code file for SYS$AS5.PDD
|
||||
tmpsaldd.asm ;Standard stand-alone LDD template
|
||||
tmpa4ldd.asm ;Template LDD for ASIC4/5-based peripherals
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,808 @@
|
||||
title NAME.LDD device driver for S3/S3a/S3c/S3../HC
|
||||
subttl Copyright PSION PLC November 1995
|
||||
name NAME
|
||||
|
||||
; VERSION DATE DESCRIPTION
|
||||
; ------- -------- ---------------
|
||||
; 1.0 12/01/95 Template Asic4/5 LDD
|
||||
|
||||
; Written by Jason Robinson January 1995
|
||||
|
||||
BUILDSB equ 1
|
||||
Asic4Type =0
|
||||
Asic5Type =0
|
||||
NeedTheInterrupt =0
|
||||
NeedClocking =0
|
||||
StartChannelInOpen =0
|
||||
|
||||
include ..\inc\epoc.inc
|
||||
include ..\inc\epocser.inc
|
||||
include ..\inc\epoclib.inc
|
||||
include ..\inc\epocsibo.inc
|
||||
include ..\srcs\ossibo.inc
|
||||
include ..\srcs\ospack.inc
|
||||
|
||||
WeSupportS3Only equ Lcd240X80
|
||||
WeSupportS3aOnly equ Lcd480X160
|
||||
WeSupportS3cOnly equ Lcd240X100
|
||||
WeSupportHCOnly equ Lcd160X80
|
||||
if Consumer
|
||||
NumberOfChannels equ 1
|
||||
if Asic9
|
||||
TheMachineWeSupport equ WeSupportS3aOnly
|
||||
else
|
||||
TheMachineWeSupport equ WeSupportS3Only
|
||||
endif
|
||||
else
|
||||
NumberOfChannels equ 3
|
||||
if Asic9
|
||||
TheMachineWeSupport equ WeSupportS3cOnly
|
||||
else
|
||||
TheMachineWeSupport equ WeSupportHCOnly
|
||||
endif
|
||||
endif
|
||||
A4PERIPH_MASK equ 0f0h
|
||||
TheInfoByteThatWeWant equ 1
|
||||
|
||||
TmpltEnt struc
|
||||
TmpltEntOpen db ? ; Channel open flag
|
||||
TmpltChannelStarted db ? ; Channel should be running
|
||||
TmpltHwChannel dw ? ; The harware we want
|
||||
TmpltStructPtr dw ? ; Ptr to CB in Apps DS
|
||||
TmpltTckHandle dw ? ; Tick Handle
|
||||
TmpltChannelRunning db ? ; Can channel really run
|
||||
TmpltInterruptMask db ? ; InterruptMask
|
||||
TmpltChannel db ? ; Channel
|
||||
if NeedTheInterrupt
|
||||
TmpltInterruptNumber db ? ; Interrupt Number
|
||||
TmpltInterruptVector dw ? ; Were to Jump To
|
||||
if Asic5Type and NeedClocking
|
||||
TmpltA5Clocking db ? ; Asic5 baud rate clocking
|
||||
TmpltSpare db ?
|
||||
endif
|
||||
else
|
||||
TmpltSpare db ?
|
||||
endif
|
||||
|
||||
TmpltEnt ends
|
||||
|
||||
TmpltStruct struc
|
||||
Tmpltblk ChanEnt <> ; I/O control block
|
||||
TmpltEntPtr dw ? ; Ptr to our CS CB
|
||||
TmpltStruct ends
|
||||
|
||||
dgroup group stack
|
||||
assume ds:dgroup,es:dgroup,ss:dgroup
|
||||
|
||||
CodeSeg
|
||||
|
||||
ProcBegin@ TmpltLDD
|
||||
; ===================
|
||||
|
||||
dw LDDSignature
|
||||
db 'HSB',0,0,0,0,0
|
||||
dw (TableEnd-TableStart)/2
|
||||
TableStart:
|
||||
dw TmpltInstall
|
||||
dw TmpltRemove
|
||||
dw TmpltHold
|
||||
dw TmpltResume
|
||||
dw TmpltReset
|
||||
dw TmpltUnits
|
||||
dw TmpltOpen
|
||||
dw TmpltStrategy
|
||||
MonitorVector:
|
||||
dw MonitorInt
|
||||
TableEnd:
|
||||
|
||||
if Consumer
|
||||
if Asic9
|
||||
SetupTable db mask A9MSlave,SelectChannel5
|
||||
db (mask A9MClockEnable5 shr 8),HwIrq2Revector
|
||||
if NeedTheInterrupt
|
||||
dw offset Interrupt0
|
||||
endif
|
||||
|
||||
else
|
||||
SetupTable db mask Asic2Int,SelectChannel7
|
||||
db (mask ClockEnable7 shr 8),HwIrq4Revector
|
||||
if NeedTheInterrupt
|
||||
dw offset Interrupt0
|
||||
endif
|
||||
endif
|
||||
else
|
||||
if Asic9
|
||||
SetupTable db mask A9MExpIntA,SelectChannel3
|
||||
db (mask A9MClockEnable3 shr 8),HwIrq4Revector
|
||||
if NeedTheInterrupt
|
||||
dw offset Interrupt0
|
||||
endif
|
||||
db mask A9MExpIntB,SelectChannel4
|
||||
db (mask A9MClockEnable4 shr 8),HwIrq5Revector
|
||||
if NeedTheInterrupt
|
||||
dw offset Interrupt1
|
||||
endif
|
||||
db mask A9MSlave,SelectChannel5
|
||||
db (mask A9MClockEnable5 shr 8),HwIrq2Revector
|
||||
if NeedTheInterrupt
|
||||
dw offset Interrupt2
|
||||
endif
|
||||
else
|
||||
SetupTable db mask ExpIntLeftA,ExpChannelLeftA
|
||||
db (mask ClockEnable6 shr 8),HwIrq3Revector
|
||||
if NeedTheInterrupt
|
||||
dw offset Interrupt0
|
||||
endif
|
||||
db mask ExpIntRightB,ExpChannelRightB
|
||||
db (mask ClockEnable5 shr 8),HwIrq2Revector
|
||||
if NeedTheInterrupt
|
||||
dw offset Interrupt1
|
||||
endif
|
||||
db mask Asic2Int,SelectChannel7
|
||||
db (mask ClockEnable7 shr 8),HwIrq4Revector
|
||||
if NeedTheInterrupt
|
||||
dw offset Interrupt2
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
CsHeldFlag db 0 ; Ldd under a hold?
|
||||
MachineType db 0
|
||||
if Consumer
|
||||
Channel0 TmpltEnt <>
|
||||
else
|
||||
Channel0 TmpltEnt <>
|
||||
Channel1 TmpltEnt <>
|
||||
Channel2 TmpltEnt <>
|
||||
endif
|
||||
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltInstall,far
|
||||
; ===========================
|
||||
|
||||
; Install the driver
|
||||
; Exit with carry clear for okay
|
||||
|
||||
GenLcdType ; Do we only run on
|
||||
mov MachineType,al ; particular machines?
|
||||
cmp al,TheMachineWeSupport
|
||||
jne CannotInstallOnThisMachine
|
||||
|
||||
pushf
|
||||
cli
|
||||
push ds
|
||||
mov ax, cs
|
||||
mov ds, ax
|
||||
mov CsHeldFlag, 0 ; Initialise all
|
||||
mov cx, NumberOfChannels ; the variables
|
||||
mov di, offset Channel0
|
||||
mov si, offset SetupTable
|
||||
ResetAllChannelsLoop:
|
||||
mov [di].TmpltEntOpen, 0
|
||||
lodsb
|
||||
mov [di].TmpltInterruptMask, al
|
||||
lodsb
|
||||
mov [di].TmpltChannel, al
|
||||
lodsb
|
||||
if NeedClocking
|
||||
mov [di].TmpltA5Clocking, al
|
||||
endif
|
||||
lodsb
|
||||
if NeedTheInterrupt
|
||||
mov [di].TmpltInterruptNumber, al
|
||||
lodsw
|
||||
mov [di].TmpltInterruptVector, ax
|
||||
endif
|
||||
|
||||
add di,size TmpltEnt
|
||||
loop ResetAllChannelsLoop
|
||||
pop ds
|
||||
popf
|
||||
FinishedOkay:
|
||||
clc
|
||||
ret
|
||||
CannotInstallOnThisMachine:
|
||||
mov ax,NotSupportedErr
|
||||
stc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltRemove,far
|
||||
; ==========================
|
||||
|
||||
; Remove the driver
|
||||
; Exit with carry clear for okay
|
||||
; Exit with carry set if channel still open
|
||||
|
||||
mov cx,NumberOfChannels
|
||||
mov di,offset Channel0
|
||||
xor ax,ax
|
||||
CheckAllChannelsClosedLoop:
|
||||
cmp cs:[di].TmpltEntOpen,al
|
||||
jne WeHaveAnOpenChannelSoFail
|
||||
add di,size TmpltEnt
|
||||
loop CheckAllChannelsClosedLoop
|
||||
jmp FinishedOkay
|
||||
WeHaveAnOpenChannelSoFail:
|
||||
mov ax,InUseErr
|
||||
stc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltUnits,far
|
||||
; =========================
|
||||
|
||||
; Return the Number of channels that can be opened in AX
|
||||
|
||||
mov ax,NumberOfChannels ; We have ? channels
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltReset,far
|
||||
; =========================
|
||||
|
||||
; Reset the open channel
|
||||
|
||||
mov di,cx
|
||||
cmp cs:[di].TmpltEntOpen,0 ; Somethings gone
|
||||
je NotOpenToReset ; wrong with the
|
||||
mov ah,DevHoldPowerDown ; application that
|
||||
call StopTheChannel ; opened us.
|
||||
call FreeHardware ; Stop interupts and
|
||||
mov cs:[di].TmpltEntOpen,0 ; free the channel
|
||||
NotOpenToReset:
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltHold,far
|
||||
; ========================
|
||||
|
||||
; Hold the channels
|
||||
; Hold reason in AH
|
||||
|
||||
mov cx,1
|
||||
xchg cl,CsHeldFlag ; Stop any interrupts
|
||||
cmp cl,0 ; Mark channel as
|
||||
jne AlreadyHeld ; under a normal hold
|
||||
DoHold:
|
||||
mov cx,NumberOfChannels
|
||||
mov di,offset Channel0
|
||||
HoldAllTheChannelsLoop:
|
||||
cmp cs:[di].TmpltEntOpen,0
|
||||
je DontHoldBecauseNotOpen
|
||||
cmp cs:[di].TmpltChannelStarted,0
|
||||
je DontHoldBecauseNotOpen
|
||||
push ax
|
||||
push cx
|
||||
call StopTheChannel
|
||||
pop cx
|
||||
pop ax
|
||||
DontHoldBecauseNotOpen:
|
||||
add di,size TmpltEnt
|
||||
loop HoldAllTheChannelsLoop
|
||||
AlreadyHeld:
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltResume,far
|
||||
; ==========================
|
||||
|
||||
; Resume the channel
|
||||
|
||||
xor cx,cx ; Be warned during an
|
||||
xchg cl,CsHeldFlag ; on/off the power to
|
||||
cmp cl,0 ; ASIC4 is not restored
|
||||
je AlreadyResumed ; until after this
|
||||
GenDataSegment ; A resume is pointless
|
||||
HwGetSsdData ; if there is still no
|
||||
mov bx,ax ; power to the port
|
||||
cmp es:[bx].SsdDoorStatus,DoorOpen ; Leave the resume
|
||||
je DoorsAreOpen ; to the tick
|
||||
DoResume:
|
||||
mov cx,NumberOfChannels
|
||||
mov di,offset Channel0 ; Right hardware?
|
||||
ResumeAllTheChannelsLoop: ; Else restart
|
||||
cmp cs:[di].TmpltEntOpen,0 ; interrupts
|
||||
je DontResumeBecauseNotOpen
|
||||
cmp cs:[di].TmpltChannelStarted,0
|
||||
je DontResumeBecauseNotOpen
|
||||
push cx
|
||||
call StartTheChannel
|
||||
pop cx
|
||||
DontResumeBecauseNotOpen:
|
||||
add di,size TmpltEnt
|
||||
loop ResumeAllTheChannelsLoop
|
||||
AlreadyResumed:
|
||||
ret
|
||||
DoorsAreOpen:
|
||||
mov CsHeldFlag,2
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltOpen,far
|
||||
; ========================
|
||||
|
||||
; Open the channel
|
||||
; DS,ES,SS Applications data space
|
||||
; Handle in DX
|
||||
|
||||
cld
|
||||
pushf
|
||||
cli
|
||||
call FindFreeChannel
|
||||
jnc GotFreeChannel
|
||||
popf
|
||||
LockedError:
|
||||
mov ax,LockedErr
|
||||
stc
|
||||
ret
|
||||
AllErrorsExitHere:
|
||||
push ax
|
||||
HeapFreeCell
|
||||
pop ax
|
||||
FreeTckAndChannel:
|
||||
push ax
|
||||
call FreeHardware
|
||||
pop ax
|
||||
FreeTckAndExit:
|
||||
push ax
|
||||
mov bx,cs:[di].TmpltTckHandle
|
||||
IoClose
|
||||
pop ax
|
||||
CloseThenFree:
|
||||
mov cs:[di].TmpltEntOpen,0
|
||||
stc
|
||||
ret
|
||||
GotFreeChannel:
|
||||
mov cs:[di].TmpltEntOpen,1
|
||||
mov cs:[di].TmpltChannelStarted,0
|
||||
mov cs:[di].TmpltChannelRunning,0
|
||||
popf
|
||||
xor ax,ax
|
||||
push ax
|
||||
mov ax,((':' shl 8)+'K')
|
||||
push ax
|
||||
mov ax,(('C' shl 8)+'T')
|
||||
push ax
|
||||
mov bx,sp
|
||||
IoOpen
|
||||
jnc GotATickChannel
|
||||
add sp,6
|
||||
mov ax,LockedErr
|
||||
jmp CloseThenFree
|
||||
GotATickChannel:
|
||||
add sp,6
|
||||
mov cs:[di].TmpltTckHandle,ax
|
||||
push dx
|
||||
mov bx,ax
|
||||
mov ax,IoFuncStart
|
||||
mov cx,1
|
||||
push cx ; Frequency 1 tick
|
||||
push di ; Data is our CS CB
|
||||
push dx ; Our device handle
|
||||
mov cx,(MonitorVector-TableStart)/2 ; Vector to call
|
||||
push cx
|
||||
mov cx,sp
|
||||
IoWithWait
|
||||
add sp,8
|
||||
pop dx
|
||||
call GetHardware
|
||||
jc FreeTckAndExit
|
||||
|
||||
mov cx,(size TmpltStruct) ; Get ourselfs a CB
|
||||
HeapAllocateCell ; In the applications
|
||||
jc FreeTckAndChannel ; Data space
|
||||
|
||||
mov bx,ax
|
||||
mov [bx].Tmpltblk.ChanNext,bx
|
||||
mov [bx].Tmpltblk.ChanSignature,IoChanSignature
|
||||
mov [bx].Tmpltblk.ChanLibHandle,dx
|
||||
mov [bx].TmpltEntPtr,di
|
||||
push bx
|
||||
mov bx,dx
|
||||
mov cx,di
|
||||
IoRequestReset
|
||||
pop bx
|
||||
if StartChannelInOpen
|
||||
call StartChannelFromOpen
|
||||
endif
|
||||
xor ax,ax
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
StrategyVectorTable label word
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset TmpltClose
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
|
||||
ProcBegin@ TmpltStrategy,far
|
||||
; ============================
|
||||
|
||||
; BX is our control block
|
||||
; SI points to the parameters
|
||||
; DS,ES Applications data space
|
||||
|
||||
mov ax,[si].RqFunction
|
||||
mov dx,[si].RqA1Ptr
|
||||
cmp ax,IoFuncSuperFrame
|
||||
ja StrategyDefault
|
||||
shl ax,1
|
||||
mov di,ax
|
||||
push StrategyVectorTable[di]
|
||||
mov di,[bx].TmpltEntPtr
|
||||
retn
|
||||
StrategyDefault:
|
||||
IoRoot
|
||||
ret
|
||||
ExitStrategyOkay:
|
||||
xor ax,ax
|
||||
ExitStrategy:
|
||||
mov di,[si].RqStatusPtr
|
||||
mov word ptr [di],ax
|
||||
cmp ax,PendingErr
|
||||
je JustExit
|
||||
IoSignal
|
||||
JustExit:
|
||||
xor ax,ax
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltClose,far
|
||||
; =========================
|
||||
|
||||
; Close a channel
|
||||
; DI CS control block
|
||||
; BX DS control block
|
||||
; SI points to aurguments on stack
|
||||
; DX Argument one pointer
|
||||
|
||||
mov ah,DevHoldPowerDown
|
||||
call StopTheChannel
|
||||
call FreeHardware
|
||||
mov cs:[di].TmpltChannelStarted,0
|
||||
push bx
|
||||
mov bx,[bx].Tmpltblk.ChanLibHandle
|
||||
mov cx,di
|
||||
IoRequestResetCancel
|
||||
pop bx
|
||||
HeapFreeCell
|
||||
mov bx,cs:[di].TmpltTckHandle
|
||||
IoClose
|
||||
mov cs:[di].TmpltEntOpen,0
|
||||
jmp short ExitStrategyOkay
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ StartTheChannel
|
||||
; ==========================
|
||||
|
||||
; Start the Channel Running
|
||||
; Assume channel set up and interrupts off
|
||||
|
||||
cmp cs:[di].TmpltChannelRunning,0
|
||||
jne ChannelAlreadyRunning
|
||||
|
||||
if Asic5Type and NeedClocking
|
||||
if Asic9
|
||||
in ax, A9WControlExtraRW ; Start the S3s clock
|
||||
or ah, [bx].TmpltA5Clocking ; Generator
|
||||
out A9WControlExtraRW, ax
|
||||
else
|
||||
mov al, [bx].TmpltA5Clocking
|
||||
HwSetA2Control2Bits
|
||||
endif
|
||||
endif
|
||||
if NeedTheInterrupt
|
||||
mov al, cs:[di].TmpltInterruptNumber ; Load the address of
|
||||
mov cx, cs ; the appropriate
|
||||
mov bx, cs:[di].TmpltInterruptVector ; interrupt routine
|
||||
GenSetRevector ; into the correct vector
|
||||
if Asic9
|
||||
in al,A9BInterruptMaskRW ; Set the mask
|
||||
or al,cs:[di].TmpltInterruptMask ; to enable Interrupts
|
||||
out A9BInterruptMaskRW,al
|
||||
else
|
||||
in al, A1InterruptMask
|
||||
or al,cs:[di].TmpltInterruptMask
|
||||
out A1InterruptMask, al
|
||||
endif
|
||||
endif
|
||||
mov cs:[di].TmpltChannelRunning,1
|
||||
ChannelAlreadyRunning:
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ StopTheChannel
|
||||
; =========================
|
||||
|
||||
; Stop the Channel Running
|
||||
; Assume channel set up and interrupts off
|
||||
; Stop reason in AH
|
||||
|
||||
cmp byte ptr cs:[di].TmpltChannelRunning,0
|
||||
je ChannelAlreadyStopped
|
||||
if NeedTheInterrupt
|
||||
mov ah,cs:[di].TmpltInterruptMask
|
||||
not ah
|
||||
if Asic9
|
||||
in al,A9BInterruptMaskRW ; Stop Interrupts
|
||||
and al,ah ; By clearing the
|
||||
out A9BInterruptMaskRW,al ; Mask and resetting
|
||||
else ; The Vector
|
||||
in al, A1InterruptMask
|
||||
and al,ah
|
||||
out A1InterruptMask, al
|
||||
endif
|
||||
mov al, cs:[di].TmpltInterruptNumber
|
||||
GenResetRevector
|
||||
endif
|
||||
if Asic5Type and NeedClocking
|
||||
if Asic9
|
||||
mov cl, [bx].TmpltA5Clocking ; Turn off baud rate
|
||||
not cl ; clocking from the
|
||||
in ax, A9WControlExtraRW ; S3/3a
|
||||
and ah, cl
|
||||
out A9WControlExtraRW, ax
|
||||
else
|
||||
mov al, [bx].TmpltA5Clocking
|
||||
HwClearA2Control2Bits
|
||||
endif
|
||||
endif
|
||||
mov cs:[di].TmpltChannelRunning,0
|
||||
ChannelAlreadyStopped:
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
if StartChannelInOpen
|
||||
ProcBegin@ StartChannelFromOpen
|
||||
; ===============================
|
||||
|
||||
pushf
|
||||
cli
|
||||
mov cs:[di].TmpltChannelStarted,1
|
||||
mov al,cs:[di].TmpltChannel
|
||||
HwSelectChannel
|
||||
push ax
|
||||
call StartTheChannel
|
||||
pop ax
|
||||
HwSelectChannel
|
||||
popf
|
||||
ret
|
||||
ProcEnd noret
|
||||
endif
|
||||
ProcBegin@ GetHardware
|
||||
; ======================
|
||||
|
||||
mov al, cs:[di].TmpltInterruptMask
|
||||
HwGetChannel
|
||||
jc ChannelNotAvailable
|
||||
pushf
|
||||
cli
|
||||
mov al,cs:[di].TmpltChannel
|
||||
HwSelectChannel
|
||||
push ax
|
||||
call CheckForHardware
|
||||
pop ax
|
||||
jc NoHardwareFreeTheChannel
|
||||
HwSelectChannel
|
||||
popf
|
||||
clc
|
||||
ret
|
||||
NoHardwareFreeTheChannel:
|
||||
HwSelectChannel
|
||||
popf
|
||||
mov al, cs:[di].TmpltInterruptMask
|
||||
HwFreeChannel
|
||||
ChannelNotAvailable:
|
||||
stc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ FreeHardware
|
||||
; =======================
|
||||
|
||||
mov al, cs:[di].TmpltInterruptMask
|
||||
HwFreeChannel
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ FindFreeChannel
|
||||
; ==========================
|
||||
|
||||
mov si,[si].OpenNamePtr
|
||||
mov al,[si+1]
|
||||
CharToFoldedChar
|
||||
cmp al,'A'
|
||||
jb CantGetThatChannel
|
||||
sub al,'A'
|
||||
cmp al,NumberOfChannels
|
||||
jae CantGetThatChannel
|
||||
xor ah,ah
|
||||
push dx
|
||||
mov dx,size TmpltEnt
|
||||
mul dx
|
||||
pop dx
|
||||
mov di,ax
|
||||
add di,offset Channel0
|
||||
cmp cs:[di].TmpltEntOpen,0
|
||||
je FoundAFreeChannel
|
||||
CantGetThatChannel:
|
||||
stc
|
||||
ret
|
||||
FoundAFreeChannel:
|
||||
clc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ CheckForHardware
|
||||
; ===========================
|
||||
|
||||
; Assume Interrupts are off
|
||||
; Correct channel should be selected
|
||||
; Out: clc - got correct hardware
|
||||
; stc - wrong or no hardware
|
||||
|
||||
if Asic5Type
|
||||
HwNullFrame ; Check that the
|
||||
mov al,(SerialSelect or Asic5NormalId) ; Harware is there
|
||||
SBUSY ; And that it is what
|
||||
SCONTOUT ; It should be
|
||||
XNOP ; First look for An
|
||||
SBUSY ; ASIC5 at the other
|
||||
SDATAIN ; End of the link
|
||||
test al,al
|
||||
je ConnectionFailed
|
||||
GotConnection:
|
||||
popf
|
||||
clc
|
||||
ret
|
||||
ConnectionFailed:
|
||||
mov al, SerialSelect or Asic4Id ; Asic4 Id
|
||||
SBUSY
|
||||
SCONTOUT
|
||||
XNOP
|
||||
SBUSY
|
||||
SDATAIN
|
||||
test al, al
|
||||
jne ConnectionFailedExit
|
||||
else
|
||||
HwNullFrame
|
||||
mov al,(SerialSelect or Asic4Id)
|
||||
SBUSY ; First look for An
|
||||
SCONTOUT ; ASIC4 at the other
|
||||
XNOP ; End of the link
|
||||
SBUSY
|
||||
SDATAIN
|
||||
test al, al
|
||||
je ConnectionFailed
|
||||
mov al,SerialReadSingle or A4InfoR ; Now see if we have
|
||||
SBUSY ; The right card
|
||||
SCONTOUT
|
||||
XNOP ; Allows the busy signal to come through for the wait
|
||||
SBUSY
|
||||
SDATAIN
|
||||
and al,A4PERIPH_MASK
|
||||
cmp al,TheInfoByteThatWeWant
|
||||
jne ConnectionFailedExit
|
||||
clc
|
||||
ret
|
||||
ConnectionFailed:
|
||||
mov al,(SerialSelect or Asic5NormalId) ; Select as an
|
||||
SBUSY ; Asic5 peripheral
|
||||
SCONTOUT
|
||||
XNOP
|
||||
SDATAIN
|
||||
test al,al
|
||||
jne ConnectionFailedExit
|
||||
endif
|
||||
mov al, SerialSelect or Asic8Id ; Modem chip Id
|
||||
SBUSY
|
||||
SCONTOUT
|
||||
XNOP
|
||||
SBUSY
|
||||
SDATAIN
|
||||
test al, al
|
||||
jne ConnectionFailedExit
|
||||
mov al, SerialSelect or Asic5PackId ; Asic5pack Id
|
||||
SBUSY
|
||||
SCONTOUT
|
||||
XNOP
|
||||
SBUSY
|
||||
SDATAIN
|
||||
ConnectionFailedExit:
|
||||
stc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ MonitorInt,far
|
||||
; =========================
|
||||
|
||||
; Called on every tick
|
||||
; Issues pack door hold and resumes
|
||||
; In: Door state in SI
|
||||
|
||||
cmp si,DoorOpen
|
||||
je TheDoorIsOpenSoCantDoAnything
|
||||
cmp CsHeldFlag,2
|
||||
je NeedToDoTheResume
|
||||
ret
|
||||
NeedToDoTheResume:
|
||||
mov CsHeldFlag,0
|
||||
jmp DoResume
|
||||
TheDoorIsOpenSoCantDoAnything:
|
||||
cmp CsHeldFlag,0
|
||||
jne DontNeedToHold
|
||||
mov CsHeldFlag,2
|
||||
mov ah,DevHoldPowerFail
|
||||
jmp DoHold
|
||||
DontNeedToHold:
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
if NeedTheInterrupt
|
||||
ife Consumer
|
||||
ProcBegin@ Interrupt2,far
|
||||
; =========================
|
||||
|
||||
mov di,offset Channel2
|
||||
mov ax,PortCActive
|
||||
jmp ComInt
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ Interrupt1,far
|
||||
; =========================
|
||||
|
||||
mov di,offset Channel1
|
||||
mov ax,PortBActive
|
||||
jmp ComInt
|
||||
ProcEnd noret
|
||||
endif
|
||||
|
||||
ProcBegin@ Interrupt0,far
|
||||
; =========================
|
||||
|
||||
mov di,offset Channel0
|
||||
mov ax,PortAActive
|
||||
; FALLTHROUGH to ComInt
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ ComInt,far
|
||||
; =====================
|
||||
|
||||
if Asic9
|
||||
out A9BNonSpecificEoiW,al
|
||||
else
|
||||
out A1NonSpecificEoi, al
|
||||
endif
|
||||
clc
|
||||
ret
|
||||
ProcEnd noret
|
||||
endif
|
||||
|
||||
|
||||
EndCodeSeg
|
||||
stack segment stack para 'data'
|
||||
stack ends
|
||||
end TmpltLDD
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,531 @@
|
||||
title NAME.LDD device driver for S3/S3a/S3c/S3../HC
|
||||
subttl Copyright PSION PLC November 1995
|
||||
name NAME
|
||||
|
||||
; VERSION DATE DESCRIPTION
|
||||
; ------- -------- ---------------
|
||||
; 1.0 12/01/95 Template LDD
|
||||
|
||||
; Written by Jason Robinson January 1995
|
||||
|
||||
BUILDSB equ 1
|
||||
|
||||
include ..\inc\epoc.inc
|
||||
include ..\inc\epocser.inc
|
||||
include ..\inc\epoclib.inc
|
||||
include ..\inc\epocsibo.inc
|
||||
include ..\srcs\ossibo.inc
|
||||
include ..\srcs\ospack.inc
|
||||
|
||||
OpenSpecificChannel =0
|
||||
MachineSpecific =0
|
||||
PeripheralTypeDriver =0
|
||||
TickRequired =0
|
||||
|
||||
NumberOfChannels equ 1
|
||||
WeSupportS3Only equ Lcd240X80
|
||||
WeSupportS3aOnly equ Lcd480X160
|
||||
WeSupportS3cOnly equ Lcd240X100
|
||||
WeSupportHCOnly equ Lcd160X80
|
||||
TheMachineWeSupport equ WeSupportS3aOnly
|
||||
|
||||
TmpltEnt struc
|
||||
TmpltEntOpen db ? ; Channel open flag
|
||||
TmpltChannelStarted db ? ; Channel should be running
|
||||
TmpltChannelRunning db ? ; Can channel really run
|
||||
TmpltSpare db ?
|
||||
TmpltHwChannel dw ? ; The harware we want
|
||||
TmpltStructPtr dw ? ; Ptr to CB in Apps DS
|
||||
if PeripheralTypeDriver or TickRequired
|
||||
TmpltTckHandle dw ? ; Tick Handle
|
||||
endif
|
||||
TmpltEnt ends
|
||||
|
||||
TmpltStruct struc
|
||||
Tmpltblk ChanEnt <> ; I/O control block
|
||||
TmpltEntPtr dw ? ; Ptr to our CS CB
|
||||
TmpltStruct ends
|
||||
|
||||
dgroup group stack
|
||||
assume ds:dgroup,es:dgroup,ss:dgroup
|
||||
|
||||
CodeSeg
|
||||
|
||||
ProcBegin@ TmpltLDD
|
||||
; ===================
|
||||
|
||||
dw LDDSignature
|
||||
db 'HSB',0,0,0,0,0
|
||||
dw (TableEnd-TableStart)/2
|
||||
TableStart:
|
||||
dw TmpltInstall
|
||||
dw TmpltRemove
|
||||
dw TmpltHold
|
||||
dw TmpltResume
|
||||
dw TmpltReset
|
||||
dw TmpltUnits
|
||||
dw TmpltOpen
|
||||
dw TmpltStrategy
|
||||
if PeripheralTypeDriver or TickRequired
|
||||
MonitorVector:
|
||||
dw MonitorInt
|
||||
endif
|
||||
TableEnd:
|
||||
|
||||
CsHeldFlag db 0 ; Ldd under a hold?
|
||||
MachineType db 0
|
||||
|
||||
Channel0 TmpltEnt <>
|
||||
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltInstall,far
|
||||
; ===========================
|
||||
|
||||
; Install the driver
|
||||
; Exit with carry clear for okay
|
||||
|
||||
if MachineSpecific
|
||||
GenLcdType ; Do we only run on
|
||||
mov MachineType,al ; particular machines?
|
||||
cmp al,TheMachineWeSupport
|
||||
jne CannotInstallOnThisMachine
|
||||
endif
|
||||
mov CsHeldFlag,0 ; Initialise all
|
||||
mov cx,NumberOfChannels ; the variables
|
||||
mov di,offset Channel0
|
||||
xor ax,ax
|
||||
ResetAllChannelsLoop:
|
||||
mov cs:[di].TmpltEntOpen,al
|
||||
add di,size TmpltEnt
|
||||
loop ResetAllChannelsLoop
|
||||
FinishedOkay:
|
||||
clc
|
||||
ret
|
||||
CannotInstallOnThisMachine:
|
||||
mov ax,NotSupportedErr
|
||||
stc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltRemove,far
|
||||
; ==========================
|
||||
|
||||
; Remove the driver
|
||||
; Exit with carry clear for okay
|
||||
; Exit with carry set if channel still open
|
||||
|
||||
mov cx,NumberOfChannels
|
||||
mov di,offset Channel0
|
||||
xor ax,ax
|
||||
CheckAllChannelsClosedLoop:
|
||||
cmp cs:[di].TmpltEntOpen,al
|
||||
jne WeHaveAnOpenChannelSoFail
|
||||
add di,size TmpltEnt
|
||||
loop CheckAllChannelsClosedLoop
|
||||
jmp FinishedOkay
|
||||
WeHaveAnOpenChannelSoFail:
|
||||
mov ax,InUseErr
|
||||
stc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltUnits,far
|
||||
; =========================
|
||||
|
||||
; Return the Number of channels that can be opened in AX
|
||||
|
||||
mov ax,NumberOfChannels ; We have ? channels
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltReset,far
|
||||
; =========================
|
||||
|
||||
; Reset the open channel
|
||||
|
||||
mov di,cx
|
||||
cmp cs:[di].TmpltEntOpen,0 ; Somethings gone
|
||||
je NotOpenToReset ; wrong with the
|
||||
mov ah,DevHoldPowerDown ; application that
|
||||
call StopTheChannel ; opened us.
|
||||
call FreeHardware ; Stop interupts and
|
||||
mov cs:[di].TmpltEntOpen,0 ; free the channel
|
||||
NotOpenToReset:
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltHold,far
|
||||
; ========================
|
||||
|
||||
; Hold the channels
|
||||
; Hold reason in AH
|
||||
|
||||
mov cx,1
|
||||
xchg cl,CsHeldFlag ; Stop any interrupts
|
||||
cmp cl,0 ; Mark channel as
|
||||
jne AlreadyHeld ; under a normal hold
|
||||
DoHold:
|
||||
mov cx,NumberOfChannels
|
||||
mov di,offset Channel0
|
||||
HoldAllTheChannelsLoop:
|
||||
cmp cs:[di].TmpltEntOpen,0
|
||||
je DontHoldBecauseNotOpen
|
||||
cmp cs:[di].TmpltChannelStarted,0
|
||||
je DontHoldBecauseNotOpen
|
||||
push ax
|
||||
push cx
|
||||
call StopTheChannel
|
||||
pop cx
|
||||
pop ax
|
||||
DontHoldBecauseNotOpen:
|
||||
add di,size TmpltEnt
|
||||
loop HoldAllTheChannelsLoop
|
||||
AlreadyHeld:
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltResume,far
|
||||
; ==========================
|
||||
|
||||
; Resume the channel
|
||||
|
||||
xor cx,cx ; Be warned during an
|
||||
xchg cl,CsHeldFlag ; on/off the power to
|
||||
cmp cl,0 ; ASIC4 is not restored
|
||||
je AlreadyResumed ; until after this
|
||||
if PeripheralTypeDriver
|
||||
GenDataSegment ; A resume is pointless
|
||||
HwGetSsdData ; if there is still no
|
||||
mov bx,ax ; power to the port
|
||||
cmp es:[bx].SsdDoorStatus,DoorOpen ; Leave the resume
|
||||
je DoorsAreOpen ; to the tick
|
||||
endif
|
||||
DoResume:
|
||||
mov cx,NumberOfChannels
|
||||
mov di,offset Channel0 ; Right hardware?
|
||||
ResumeAllTheChannelsLoop: ; Else restart
|
||||
cmp cs:[di].TmpltEntOpen,0 ; interrupts
|
||||
je DontResumeBecauseNotOpen
|
||||
cmp cs:[di].TmpltChannelStarted,0
|
||||
je DontResumeBecauseNotOpen
|
||||
push cx
|
||||
call StartTheChannel
|
||||
pop cx
|
||||
DontResumeBecauseNotOpen:
|
||||
add di,size TmpltEnt
|
||||
loop ResumeAllTheChannelsLoop
|
||||
AlreadyResumed:
|
||||
ret
|
||||
if PeripheralTypeDriver
|
||||
DoorsAreOpen:
|
||||
mov CsHeldFlag,2
|
||||
ret
|
||||
endif
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltOpen,far
|
||||
; ========================
|
||||
|
||||
; Open the channel
|
||||
; DS,ES,SS Applications data space
|
||||
; Handle in DX
|
||||
|
||||
cld
|
||||
pushf
|
||||
cli
|
||||
call FindFreeChannel
|
||||
jnc GotFreeChannel
|
||||
popf
|
||||
LockedError:
|
||||
mov ax,LockedErr
|
||||
stc
|
||||
ret
|
||||
AllErrorsExitHere:
|
||||
push ax
|
||||
HeapFreeCell
|
||||
pop ax
|
||||
FreeTckAndChannel:
|
||||
push ax
|
||||
call FreeHardware
|
||||
pop ax
|
||||
FreeTckAndExit:
|
||||
if PeripheralTypeDriver or TickRequired
|
||||
push ax
|
||||
mov bx,cs:[di].TmpltTckHandle
|
||||
IoClose
|
||||
pop ax
|
||||
endif
|
||||
CloseThenFree:
|
||||
mov cs:[di].TmpltEntOpen,0
|
||||
stc
|
||||
ret
|
||||
GotFreeChannel:
|
||||
mov cs:[di].TmpltEntOpen,1
|
||||
mov cs:[di].TmpltChannelStarted,0
|
||||
mov cs:[di].TmpltChannelRunning,0
|
||||
popf
|
||||
if PeripheralTypeDriver or TickRequired
|
||||
xor ax,ax
|
||||
push ax
|
||||
mov ax,((':' shl 8)+'K')
|
||||
push ax
|
||||
mov ax,(('C' shl 8)+'T')
|
||||
push ax
|
||||
mov bx,sp
|
||||
IoOpen
|
||||
jnc GotATickChannel
|
||||
add sp,6
|
||||
mov ax,LockedErr
|
||||
jmp CloseThenFree
|
||||
GotATickChannel:
|
||||
add sp,6
|
||||
mov cs:[di].TmpltTckHandle,ax
|
||||
push dx
|
||||
mov bx,ax
|
||||
mov ax,IoFuncStart
|
||||
mov cx,1
|
||||
push cx ; Frequency 1 tick
|
||||
push di ; Data is our CS CB
|
||||
push dx ; Our device handle
|
||||
mov cx,(MonitorVector-TableStart)/2 ; Vector to call
|
||||
push cx
|
||||
mov cx,sp
|
||||
IoWithWait
|
||||
add sp,8
|
||||
pop dx
|
||||
endif
|
||||
call GetHardware
|
||||
jc FreeTckAndExit
|
||||
|
||||
mov cx,(size TmpltStruct) ; Get ourselfs a CB
|
||||
HeapAllocateCell ; In the applications
|
||||
jc FreeTckAndChannel ; Data space
|
||||
|
||||
mov bx,ax
|
||||
mov [bx].Tmpltblk.ChanNext,bx
|
||||
mov [bx].Tmpltblk.ChanSignature,IoChanSignature
|
||||
mov [bx].Tmpltblk.ChanLibHandle,dx
|
||||
mov [bx].TmpltEntPtr,di
|
||||
push bx
|
||||
mov bx,dx
|
||||
mov cx,di
|
||||
IoRequestReset
|
||||
pop bx
|
||||
xor ax,ax
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
StrategyVectorTable label word
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset TmpltClose
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
dw offset StrategyDefault
|
||||
|
||||
ProcBegin@ TmpltStrategy,far
|
||||
; ============================
|
||||
|
||||
; BX is our control block
|
||||
; SI points to the parameters
|
||||
; DS,ES Applications data space
|
||||
|
||||
mov ax,[si].RqFunction
|
||||
mov dx,[si].RqA1Ptr
|
||||
cmp ax,IoFuncSuperFrame
|
||||
ja StrategyDefault
|
||||
shl ax,1
|
||||
mov di,ax
|
||||
push StrategyVectorTable[di]
|
||||
mov di,[bx].TmpltEntPtr
|
||||
retn
|
||||
StrategyDefault:
|
||||
IoRoot
|
||||
ret
|
||||
ExitStrategyOkay:
|
||||
xor ax,ax
|
||||
ExitStrategy:
|
||||
mov di,[si].RqStatusPtr
|
||||
mov word ptr [di],ax
|
||||
cmp ax,PendingErr
|
||||
je JustExit
|
||||
IoSignal
|
||||
JustExit:
|
||||
xor ax,ax
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ TmpltClose,far
|
||||
; =========================
|
||||
|
||||
; Close a channel
|
||||
; DI CS control block
|
||||
; BX DS control block
|
||||
; SI points to aurguments on stack
|
||||
; DX Argument one pointer
|
||||
|
||||
mov ah,DevHoldPowerDown
|
||||
call StopTheChannel
|
||||
call FreeHardware
|
||||
push bx
|
||||
mov bx,[bx].Tmpltblk.ChanLibHandle
|
||||
mov cx,di
|
||||
IoRequestResetCancel
|
||||
pop bx
|
||||
HeapFreeCell
|
||||
if PeripheralTypeDriver or TickRequired
|
||||
mov bx,cs:[di].TmpltTckHandle
|
||||
IoClose
|
||||
endif
|
||||
mov cs:[di].TmpltEntOpen,0
|
||||
jmp short ExitStrategyOkay
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ StartTheChannel
|
||||
; ==========================
|
||||
|
||||
; Start the Channel Running
|
||||
|
||||
cmp byte ptr cs:[di].TmpltChannelRunning,0
|
||||
jne ChannelAlreadyRunning
|
||||
|
||||
mov cs:[di].TmpltChannelRunning,1
|
||||
ChannelAlreadyRunning:
|
||||
clc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ StopTheChannel
|
||||
; =========================
|
||||
|
||||
; Stop the Channel Running
|
||||
|
||||
cmp byte ptr cs:[di].TmpltChannelRunning,0
|
||||
je ChannelAlreadyStopped
|
||||
|
||||
mov cs:[di].TmpltChannelRunning,0
|
||||
ChannelAlreadyStopped:
|
||||
clc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ GetHardware
|
||||
; ======================
|
||||
|
||||
clc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
ProcBegin@ FreeHardware
|
||||
; =======================
|
||||
|
||||
clc
|
||||
ret
|
||||
ProcEnd noret
|
||||
|
||||
If OpenSpecificChannel
|
||||
ProcBegin@ FindFreeChannel
|
||||
; ==========================
|
||||
|
||||
; Called from Open
|
||||
; Must preserve DX,SI
|
||||
; Channel out in DI or carry set if failure
|
||||
|
||||
mov si,[si].OpenNamePtr
|
||||
mov al,[si+1]
|
||||
CharToFoldedChar
|
||||
cmp al,'A'
|
||||
jb CantGetThatChannel
|
||||
sub al,'A'
|
||||
cmp al,NumberOfChannels
|
||||
jae CantGetThatChannel
|
||||
xor ah,ah
|
||||
push dx
|
||||
mov dx,size TmpltEnt
|
||||
mul dx
|
||||
pop dx
|
||||
mov di,ax
|
||||
add di,offset Channel0
|
||||
cmp cs:[di].TmpltEntOpen,0
|
||||
je FoundAFreeChannel
|
||||
CantGetThatChannel:
|
||||
stc
|
||||
ret
|
||||
FoundAFreeChannel:
|
||||
clc
|
||||
ret
|
||||
ProcEnd noret
|
||||
else
|
||||
ProcBegin@ FindFreeChannel
|
||||
; ==========================
|
||||
|
||||
mov cx,NumberOfChannels
|
||||
mov di,offset Channel0
|
||||
HuntAllChannelsLoop:
|
||||
cmp cs:[di].TmpltEntOpen,0
|
||||
je FoundAFreeChannel
|
||||
add di,size TmpltEnt
|
||||
loop HuntAllChannelsLoop
|
||||
stc
|
||||
ret
|
||||
FoundAFreeChannel:
|
||||
clc
|
||||
ret
|
||||
ProcEnd noret
|
||||
endif
|
||||
|
||||
if PeripheralTypeDriver or TickRequired
|
||||
ProcBegin@ MonitorInt,far
|
||||
; =========================
|
||||
|
||||
if PeripheralTypeDriver
|
||||
; Called on every tick
|
||||
; Issues pack door hold and resumes
|
||||
; In: Door state in SI
|
||||
|
||||
cmp si,DoorOpen
|
||||
je TheDoorIsOpenSoCantDoAnything
|
||||
cmp CsHeldFlag,2
|
||||
je NeedToDoTheResume
|
||||
ret
|
||||
NeedToDoTheResume:
|
||||
mov CsHeldFlag,0
|
||||
jmp DoResume
|
||||
TheDoorIsOpenSoCantDoAnything:
|
||||
cmp CsHeldFlag,0
|
||||
jne DontNeedToHold
|
||||
mov CsHeldFlag,2
|
||||
mov ah,DevHoldPowerFail
|
||||
jmp DoHold
|
||||
DontNeedToHold:
|
||||
endif
|
||||
ret
|
||||
ProcEnd noret
|
||||
endif
|
||||
|
||||
EndCodeSeg
|
||||
stack segment stack para 'data'
|
||||
stack ends
|
||||
end TmpltLDD
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user