The Museum of HP Calculators

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.

Some information on the CCD-Rom -W&W CCD A or -W&W CCD B.

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)


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:

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 FNS
this lines will do the same as described under manual handling.

Several synthetik way exist for entering program bytes to the memory.


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)
This function prompts 'KEY?' and waits for a single key. The 'ON'-key escapes, any other key sounds a short tone and puts it's keycode to X.

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 again

CAT 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 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 dataentry

>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 mode

2CMP 2's complement mode


bC? X-bit in Y clear?

bS? X-bit in Y set?

Cb clear X bit in Y


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)


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


  A+       increments RAM-address in X (X=RRR,B) one byte

A+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



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)


  GETB     GET Buffer from X-MEM-file

GETK 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)


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 bytes 
Hope this will help.

For questions mail to:


[ Return to the Message Index ]

Go back to the main exhibit hall