HP Articles Forum
[Return to the Index ]
[ Previous | Next ]
Some information on the CCD-Rom -W&W CCD A or -W&W CCD B
Posted by Reinhard Breuer on 24 July 2000, 11:10 p.m.
It was built by the german company W&W Software. This company currently exists, but they don't give any response on questions about this module.
This module extends all models of HP41 but best is a CX or having X-Functions- and Time-Module plus printer and IL.
This description is made from the quick-reference-card.
It uses XROM-numbers 09,00 to 09,63 and 11,00 to 11,41.
Cat 2 Headlines:XROM Title contains functions 09,00 -W&W CCD A or -W&W CCD B --> General functions 09,08 -ARR FNS --> Array functions (Arrays could be defined in Data-Registers or in X-Memory-Files) 09,47 -HEX FNS --> Hex functions 11,00 -I/O FNS --> I/O functions (provides a special function) 11,17 -ADV FNS --> ADV-Functions (provides a special function) 11,35 -XF/M FNS --> XF-Memory-Functions (provides a special function)
Incompatibilities:
If used together with the IL-Development-Module, the CCD-Module must be plugged into a lower portnumber than the IL-Development-Module, otherwise the OS-extensions will not work.
If used together with a ZENROM, the CCD-lowercase-mode should be disabled (register 13 byte 4 bit 7 has to be set to 1).
The OS-extensions will not work on HP41 with serialnumbers less than 2035! There is a workaround available (see special headline-functions).
Special headline-functions:
-XF/M FNS
This function either prompts for a 4 digit Hexadecimal-ROM-address or uses a
2 character string in ALPHA treated as a ROM-address ("@A" -> $4041), which
will be called. With this function it is possible to jump to any microcode
instruction in the whole 64K address-space. However, only in bank 0!
Workaround for ASN, CAT, XEQ:The call addresses are as follows (PORTx is the slot-number where the module is plugged in): PORT1 PORT2 PORT3 PORT4 ASN : 9869 B869 D869 F869 CAT : 984A B84A D84A F84A XEQ : 9865 B865 D865 F865
Manual handling:
Assign -XF/M FNS (XROM 11,35) to a key. Press this key. Enter the above
value of the preferred function. The function will be executed.
Programmatical handling:
create a textline containing two characters, where the first is the upper
half of the address and the second is the lower half of the address.
Press the assigned key (see manual handling)
01 'XX < character 98 (hex) + character 69 (hex) 02 -XF/M FNSthis lines will do the same as described under manual handling.
Several synthetik way exist for entering program bytes to the memory.
-I/O FNS
This function checks if a printer is connected. Printer Mode flag 25 action no running a program clear STOP-execution no running a program set CF 25, continue execution no manual clear message 'NO PRINTER' no manual set CF 25 yes running a program clear \ yes running a program set / continue execution (like NOP) yes manual clear \ yes manual set / nothing (like NOP)-ADV FNS
Statusbits used (only ??) by the CCD-module:
register byte bit usage
13 4 7 1 disabled CCD-lowercase-mode 0 enabled 13 4 6 1 on CCD-autostart 0 off 13 4 5 1 2. part CCD-input-sequence 0 1. part 13 4 1 0 0 0 unsigned Hexmode 0 1 2cmp 1 0 1cmp 1 1 (not documented)Operatingsystem extensions:
CAT 0..F general on Cat 0,2,4,6,8-F: SHIFT-state will be active until SHIFT-key is pressed againCAT 0 displays ID/AID of IL-peripherals ENTER selects the device C forces Device Clear
CAT 1 calls standard catalog 1
CAT 2 shows headings only ENTER opens the functionblock XEQ executes or programs that function A assigns that function
CAT 3 calls standard catalog 3
CAT 4 like EMDIR (X-Functions-Memory-Module), but Buffer-, Matrix- and Key-Files are shown correctly
CAT 5 calls ALMCAT-function of Time-Module
CAT 6 Shows any Key-Assignments but synthetic codes are shown correctly 'TEXT7' or 'RCL M' C deletes an assignment
CAT 7 calls DIR-function of IL-module
CAT 8..F like CAT 2, but beginning with the module on addressblock 8..F CAT 8 port 1 lower ROM CAT 9 port 1 upper ROM CAT A port 2 lower ROM CAT B port 2 upper ROM CAT C port 3 lower ROM CAT D port 3 upper ROM CAT E port 4 lower ROM CAT F port 5 upper ROM
ASN also allows decimal/hex input of any possible 2 byte sequence (144 117 for RCL M)
XEQ also allows decimal/hex input of any possible 2 byte sequence (144 117 for RCL M)
CALC-mode direct input of ANY stack register function just like RCL.Z or STO IND T, ... RCL.e STO.c X<>.a STO IND .M RCL IND P ...
ALPHA-mode direct upper-/lower-case input to ALPHA includes also decimal and hex entry of charactercodes!
General functions:
B? exists a buffer with this identity (X) (CCD uses ID 5 for WSIZE, actual MATRIX, ...)CAS clear CCD-autostartbit
CLB clear buffer with this identity (X)
RNDM get a random number (0 <= N < 1)
SAS set CCD-autostartbit
SEED define a startvalue for RNDM
SORT sorts a range of registers (Riii, Rjjj) X=iii,jjj or X=jjj,iii up/or down includes ALPHA
Array-functions:
Array functions require an information in ALPHA in the form of OPERAND1,OPERAND2,RESULT.
Arrays can be located in a X-Memory-file (any name is allowed) or in USER-memory (name is Rxxx, xxx is the base register).
>C+ X to column and increment i, column oriented dataentryHexfunctions:>R+ X to row and increment i, row oriented dataentry
?IJ retrieve the current pointer to X in the form iii,jjj
?IJA retrieve the current pointer of the array defined in ALPHA to X in the form iii,jjj
C<>C exchange columns, exchanges columns kkk and lll (kkk,lll in X)
C>+ from column to X and increment, column oriented dataretrival
C>- from column to X and decrement, column oriented dataretrival
CMAXAB column maximum absolute, sets the pointer to the largest absolute element of the specified column (in X) and reads it to X
CNRM column norm, calculates the columnnorm of the named array
CSUM column sum, calculates all column sums, requires OPERAND1,RESULT in ALPHA
DIM dimension, retrieves the dimension of the named array (in APLHA)
FNRM Froebius norm, calculates the Froebius-norm of the named array (in ALPHA)
IJ= set arraypointer of current array to iii,jjj (in X)
IJ=A set arraypointer to ii,jjj (in X) of array (in ALPHA)
M+ matrix +, adds all elements of two matrices, requires OPERAND1,OPERAND2,RESULT in ALPHA
M- matrix -, subtracts all elements of two matrices, requires OPERAND1,OPERAND2,RESULT in ALPHA
M* matrix *, multiplies all elements of two matrices, requires OPERAND1,OPERAND2,RESULT in ALPHA
M*M multiplies two matrices, requires OPERAND1,OPERAND2,RESULT in ALPHA
M/ matrix /, divides all elements of two matrices, requires OPERAND1,OPERAND2,RESULT in ALPHA MAX maximum element, sets matrixpointer to the larges element of the given array and returns it's value to X MAXAB maximum absolute element, sets matrixpointer to the largest absolute element of a given array and returns it's value to X
MDIM create a matrix, NAME in ALPHA, size mmm,nnn in X
MOVE moves on part (Aij to Akl) of an array into a second one (Bnm) ALPHA: OPERAND1,RESULT X : iii,jjj Y : kkk,lll Z : mmm,nnn
PIVOT move the array pointer to the Pivot-element of the array and returns its value to X
R-PR row - P * row, P in X (LR)
R-QR row - Q * row, Q in X (Gauß)
R<>R exchange rows kkk an lll, kkk,lll in X
R>+ from row to X and increment, row oriented dataretrival
R>- from row to X and decrement, row oriented dataretrival
R>R? compare all elements of row kkk to all elements of row lll and skips the next instruction, if one element of row lll is greater than the corresponding element in row kkk, kkk,lll in X
RMAXAB row maximum absolute,, sets the pointer to the largest absolute element of the specified row (in X) and reads it to X
RNRM row norm, calculates the rownorm of the named array
RSUM row sum, calculates all row sums, requires OPERAND1,RESULT in ALPHA
SUM sum, adds all elements of the matrix, stores result in X
SUMAB sum absolute, adds absolutevalues of all elements of the matrix, stores result in X
SWAP exchanges two blocks of two arrays (see MOVE)
YC+C Y * column + column, adds column kkk multiplied by Y to column lll, kkk,lll in X
1CMP 1's complement mode2CMP 2's complement mode
AND X AND Y -> X
bC? X-bit in Y clear?
bS? X-bit in Y set?
Cb clear X bit in Y
NOT X = NOT X
OR X OR Y -> X
R< rotate Y left by X (FLAG 0 IS CARRY)
R> rotate Y right by X "
S< shift Y left by X "
S> shift Y right by X "
Sb set X bit in Y
UNS unsigned mode
WSIZE presets the bitsize for all hex-fns (1..32 bits)
XOR X XOR Y -> X
I/O functions:
ABSP alphabackspace (one character)ACAXY accumulate ALPHA by X and Y to Printerbuffer ALPHA left, X right, total width in Y
ACLX accumulate line by X (aa,bbb) puts bbb count of char aa into printerbuffer
ARCLE ARCL's 10 E3 into ALPHA as 10K 23 E7 -> 230M 2.2 E-9 -> 2.2N ...
ARCHLH ARCLS's X as HEX-CHARS into ALPHA depends on mode and WSIZE
ARCLI ARCL's 33.33 into ALPHA as 33
CLA- deletes ALPHA from right to left until a space is found 'ABCD 123' --> 'ABCD '
F/E sets FIX/ENG-Mode
INPT universal input routine prompts ALPHA, allows input from Riii to Rjjj stepby cc includes range-checking R000 iii,jjjcc R001 min-value R002 max-value
PMTA same as PROMPT, AON, STOP, AOFF sequence
PMTH prompts ALPHA, asks for a HEX-number (see WSIZE)
PMTK prompts ALPHA, get only allowed keys, returns it's position 'Text JN' N returns 2, J returns 1 unallowed chars rejected with a tone, one or more spaces required before valid keys!
PRAXY like ACAXY, but directly printed
PRL prints a line of '-' chars (depending on flag 12)
VIEWH shows X as HEX (see WSIZE)
XTOAH like XTOA, instead of a char a Hex-string is appended
ADV-Functions:
A+ increments RAM-address in X (X=RRR,B) one byteA+B address(X) +-bytes(Y)
A- decrements RAM-address in X (X=RRR,B) one byte
A-A subtracts address in X from address in Y result is bytes
DCD decodes X to ALPHA (appends) 14 HEX-digits
PC<>RTN exchanges PC with the first return-address
PC>X gets the current PC into (X=RRR,B)
PEEKB gets one BYTE from RAM like RCL IND X
PEEKR gets one REGISTER from RAM like RCL IND X
PHD Program head, returns the address of the first instruction (not programmable)
PLNG returns the length of a program in bytes
POKEB STO IND Y see PEEKB
POKER STO IND Y see PEEKR
PPLNG programmable PHD
X>PC sets the PC from X
X>RTN sets first RTN-address from X
XR>RTN sets first RTN-address to any line of a program in a ROM, X=linenumber, Y=kk,ll (XROM-number)
XF-Memory-Functions:
GETB GET Buffer from X-MEM-fileGETK GET Keys from X-MEM-file (deletes any userkeys before)
MRGK MeRGes Keys from X-MEM-file
SAVEB SAVE Buffer to X-MEM-file
SAVEK SAVE Keys to X-MEM-file
SORTFL sorts a file (only up)
Hints:
ALPHA lowercase mode may not work correctly in REV. A, when in PRGM-mode.
Programming example:
Title: Change Programs Privateflag (CPP)
Description: Execute CPP. On prompt key in a name of a global label plus R/S. CPP will change this program from being private or vice-versa.
01 LBL "CPP" 02 CF 25 ; do not allow errorskipping!! 03 'NAME: ; ask user for the name 04 PMTA ; stop here with ALPHA on and wait for input, press R/S to continue 05 PHD ; retrieve the address of the first instruction of the wanted program 06 PPLNG ; retrieve the size of that program in bytes 07 1 ; the private flag is stored in the last byte of the program 08 - ; subtract this from the size to get address of the last byte 09 CHS ; program-memory goes from upper to lower adresses, so subtract 10 A+B ; calculate startaddress + distance 11 PEEKB ; retrieve the last program byte 12 64 ; Bit 6 holds the private-flag 13 XOR ; toggle private-flag 14 POKEB ; put the last program byte back 15 CLA ; clear alpha 16 CLX ; clear X 17 STO Y ; clear Y 18 STO L ; clear Last-X 19 END ; 43 Bytes used, 15-17 clear only used registers, ; if used CLST , line 16 could be skipped, saving two bytesHope this will help.
For questions mail to: reinhard.breuer@imail.de