Changes
Created page with '== Kernel RST Vectors == 0000 RESET (RST0/RESET) 0008 KL_LO_JUMP (RST1) 000B KL_LO_CALL_HL 000E KL_JP_BC ;in: BC=addr 0010 KL_SIDE_CALL_SP (RST2) 0013…'
== Kernel RST Vectors ==
0000 RESET (RST0/RESET)
0008 KL_LO_JUMP (RST1)
000B KL_LO_CALL_HL
000E KL_JP_BC ;in: BC=addr
0010 KL_SIDE_CALL_SP (RST2)
0013 KL_SIDE_CALL_HL
0016 KL_JP_DE ;in: DE=addr
0018 KL_FAR_CALL_SP (RST3)
001B KL_FAR_CALL_C_HL
001E KL_JP_HL ;in: HL=addr
0020 KL_RAM_LD_A_HL (RST4) ;in: HL=src, out: A=[HL]
0023 KL_FAR_CALL_HL
0028 KL_FIRM_JUMP (RST5)
002B DATA (OLD C' WHEN RST 30h OCCURRED WITH LO_ROM ENABLED)
0030 FREE_FOR_USER (RST6)
0038 INTERRUPT (RST7/IRQ)
003B EXT_INTERRUPT_VECTOR
0066 GARBAGE (THERE'S NO NMI HANDLER IN ROM)
== Kernel RAM Functions ==
B900 KL_U_ROM_ENABLE ;out: A=old C'
B903 KL_U_ROM_DISABLE ;out: A=old C'
B906 KL_L_ROM_ENABLE ;out: A=old C'
B909 KL_L_ROM_DISABLE ;out: A=old C'
B90C KL_ROM_RESTORE ;in: A=new C' (Bit2,3)
B90F KL_ROM_SELECT ;in: C=upper ROM bank (select, and enable that bank)
B912 KL_CURR_SELECTION ;out: A=upper ROM bank
B915 KL_PROBE_ROM ;in: C=upper ROM bank, out: A=[C000h], HL=[C001h]
B918 KL_ROM_DESELECT ;in: B=new C', C=upper ROM bank, out: B=A, C=old bank
B91B KL_RAM_LDIR ;in: HL=src, DE=dest, BC=len
B91E KL_RAM_LDDR ;in: HL=src_end, DE=dest_end, BC=len
B921 KL_POLL_SYNCHRONOUS
664 and up only
B92A KL_SCAN_NEEDED_664
== Keyboard Manager ==
BB00 KM_INITIALIZE
BB03 KM_RESET
BB06 KM_WAIT_CHAR out: A=char (waits until valid char)
BB09 KM_READ_CHAR out: A=char, cy=1=valid char
BB0C KM_CHAR_RETURN in: A=char (writeback max one char to keybuf)
BB0F KM_SET_EXPAND in: B=code, HL=ptr to new string, C=length
BB12 KM_GET_EXPAND in: A=code (0-1F,80-9F), L=index, out:A=char, cy,zf
BB15 KM_EXP_BUF_RESET in: de=begin, hl=length of buffer, out: cy: 1=okay
BB18 KM_WAIT_KEY out: A=char (waits until key pressed)
BB1B KM_READ_KEY out: cy:0=none, cy:1=key pressed, A=char
BB1E KM_TEST_KEY in: A=keyno, out: nz=pressed, C=ctrl/shift flags
BB21 KM_GET_LOCKS out: H=caps lock (caps), L=shift lock (ctrl+caps)
BB24 KM_GET_JOYSTICK out: H=joystick 0, L=joystick 1
BB27 KM_SET_TRANSLATE in: A=keyno, B=char (normal)
BB2A KM_GET_TRANSLATE in: A=keyno, out: A=char (normal)
BB2D KM_SET_SHIFT in: A=keyno, B=char (with shift)
BB30 KM_GET_SHIFT in: A=keyno, out: A=char (with shift)
BB33 KM_SET_CTRL in: A=keyno, B=char (with control)
BB36 KM_GET_CTRL in: A=keyno, out: A=char (with control)
BB39 KM_SET_REPEAT in: A=keyno, B=repeat flag (FFh=on)
BB3C KM_GET_REPEAT in: A=keyno, out: nz=repeat
BB3F KM_SET_DELAY in: H=1st delay, L=repeat delay
BB42 KM_GET_DELAY out: H=1st delay, L=repeat delay
BB45 KM_ARM_BREAK in: de=procedure, c=ROM config
BB48 KM_DISARM_BREAK in: none
BB4B KM_BREAK_EVENT
== Text Output Functions ==
BB4E TXT_INITIALIZE
BB51 TXT_RESET
BB54 TXT_VDU_DISABLE
BB57 TXT_VDU_ENABLE
BB5A TXT_OUTPUT in: A=char ;display 20h..FFh, or handle 00h..1Fh
BB5D TXT_WR_CHAR in: A=char ;display 00h..FFh
BB60 TXT_RD_CHAR out: A=char, Z=space, cy=1=okay
BB63 TXT_SET_GRAPHIC in: A=0=normal text position, A>0=graphics position
BB66 TXT_SET_WINDOW in: H=x1, L=y1, D=x2, E=y2 (x=0..79, y=0..24)
BB69 TXT_GET_WINDOW out: H=x1, L=y1, D=x2, E=y2, cy=0=hardware scrolling
BB6C TXT_CLEAR_WINDOW fill window by PAPER color
BB6F TXT_SET_COLUMN in: A=x
BB72 TXT_SET_ROW in: A=y
BB75 TXT_SET_CURSOR in: H=x, L=y
BB78 TXT_GET_CURSOR out: H=x, L=y
BB7B TXT_CUR_ENABLE
BB7E TXT_CUR_DISABLE
BB81 TXT_CUR_ON
BB84 TXT_CUR_OFF
BB87 TXT_VALIDATE io: H=x, L=y, out: cy: 1=position ok, 0=scroll
BB8A TXT_PLACE_CURSOR
BB8D TXT_REMOVE_CURSOR
BB90 TXT_SET_PEN in: A=foreground color 0..15
BB93 TXT_GET_PEN out: A=foreground color 0..15
BB96 TXT_SET_PAPER in: A=background color 0..15
BB99 TXT_GET_PAPER out: A=background color 0..15
BB9C TXT_INVERSE exchange foreground and background colors
BB9F TXT_SET_BACK in: A=0=normal, A=1=transparent/OR
BBA2 TXT_GET_BACK out: Z=normal, NZ=transparent/OR
BBA5 TXT_GET_MATRIX in: A=char, out: HL=char bitmap ptr, cy:0=ROM,1=RAM
BBA8 TXT_SET_MATRIX in: A=char, HL=ptr to 8x8 char bitmap
BBAB TXT_SET_M_TABLE in: D=00h=RAM, E=1st char, HL=RAM chars, out: cy,A,HL
BBAE TXT_GET_M_TABLE out: cy=1=RAM, A=1st char, HL=RAM chars
BBB1 TXT_GET_CONTROLS out: HL=ptr to table of control characters
BBB4 TXT_STR_SELECT in: A=new window number, out: A=old (# 0..7)
BBB7 TXT_SWAP_STREAMS in: B,C=window numbers to be exchanged
== Graphics Functions ==
BBBA GRA_INITIALIZE
BBBD GRA_RESET_HOOKS ;out: [BDDC+00h..0Ah]=Default jump opcodes/addresses
BBC0 GRA_MOVE_ABSOLUTE ;in: de=x, hl=y ;\set current coordinate
BBC3 GRA_MOVE_RELATIVE ;in: de=x, hl=y ;/
BBC6 GRA_ASK_CURSOR ;out: de=x, hl=y ;-get current coordinate
BBC9 GRA_SET_ORIGIN ;in: de=x, hl=y (also does MOVE 0,0)
BBCC GRA_GET_ORIGIN ;out: de=x, hl=y
BBCF GRA_SET_WIN_WIDTH ;in: de=x1/left, hl=x2/right
BBD2 GRA_SET_WIN_HEIGHT;in: de=y1/top, hl=y2/bottom
BBD5 GRA_GET_WIN_WIDTH ;out: de=x1/left, hl=x2/right
BBD8 GRA_GET_WIN_HEIGHT;out: de=y1/top, hl=y2/bottom
BBDB GRA_CLEAR_WINDOW ;fill window by PAPER (also does MOVE 0,0)
BBDE GRA_SET_PEN ;in: A=color (0..15) for PLOT/LINE/WR_CHAR
BBE1 GRA_GET_PEN ;out: A=color (0..15)
BBE4 GRA_SET_PAPER ;in: A=color (0..15) for CLEAR_WINDOW/WR_CHAR
BBE7 GRA_GET_PAPER ;out: A=color (0..15
BBEA GRA_PLOT_ABSOLUTE ;in: de=x, hl=y ;\draw pixel at specified coordinate
BBED GRA_PLOT_RELATIVE ;in: de=x, hl=y ;/
BBF0 GRA_TEST_ABSOLUTE ;in: de=x, hl=y, out: A=color (0..15) of pixel
BBF3 GRA_TEST_RELATIVE ;in: de=x, hl=y, out: A=color (0..15) of pixel
BBF6 GRA_LINE_ABSOLUTE ;in: de=x, hl=y ;\draw line from current coordinate
BBF9 GRA_LINE_RELATIVE ;in: de=x, hl=y ;/to specified target coordinate
BBFC GRA_WR_CHAR ;in: A=char ;-draw char at current coordinate
== Screen Functions ==
BBFF SCR_INITIALIZE
BC02 SCR_RESET
BC05 SCR_SET_OFFSET ;in: HL.bit10..0 = vram offset 0..7FFh
BC08 SCR_SET_BASE ;in: A.bit7-6 = vram block 0..3
BC0B SCR_GET_LOCATION ;out: A.bit7-6=block, HL.bit10..0=offset
BC0E SCR_SET_MODE ;in: A=mode (0=160x200x16, 1=320x200x4, 2=640x200x2)
BC11 SCR_GET_MODE ;out: A=mode (cy=mode0, z=mode1, ie. cmp mode,1)
BC14 SCR_MODE_CLEAR ;clear vram, set offset=0000h, update inks
BC17 SCR_CHAR_LIMITS ;out: B=max_x(19,39,79), C=max_y(24)
BC1A SCR_CHAR_POSITION ;in: H=x, L=y, out: HL=vram addr, B=bytes/char
BC1D SCR_DOT_POSITION ;in: DE=x, HL=y, out: HL=vram addr, C=mask, DE, B
BC20 SCR_NEXT_BYTE ;out: HL=HL+1 (wrapped within 800h-byte block)
BC23 SCR_PREV_BYTE ;out: HL=HL-1 (wrapped within 800h-byte block)
BC26 SCR_NEXT_LINE ;out: HL=HL+800h, or HL=HL+50h-3800h (or so)
BC29 SCR_PREV_LINE ;out: HL=HL-800h, or HL=HL-50h+3800h (or so)
BC2C SCR_INK_ENCODE ;in: A=color, out: A=color_mask
BC2F SCR_INK_DECODE ;in: A=color_mask, out: A=color
BC32 SCR_SET_INK ;in: A=index, B=color1, C=color2
BC35 SCR_GET_INK ;in: A=index, out: B=color1, C=color2
BC38 SCR_SET_BORDER ;in: B=color1, C=color2
BC3B SCR_GET_BORDER ;out: B=color1, C=color2
BC3E SCR_SET_FLASHING ;in: H=count1, L=count2
BC41 SCR_GET_FLASHING ;out: H=count1, L=count2
BC44 SCR_FILL_BOX ;in: A=fillbyte, H=x1, L=y1, D=x2, E=y2
BC47 SCR_FLOOD_BOX ;in: A=fillbyte, HL=vram addr, D=xsiz, E=ysiz
BC4A SCR_CHAR_INVERT ;in: H=x, L=y, B=paper, C=pen
BC4D SCR_HARDWARE_ROLL ;in: A=paper, B=dir(0=down, FFh=up)
BC50 SCR_SOFTWARE_ROLL ;in: A=paper, B=dir(""), H=x1, L=y1, D=x2, E=y2
BC53 SCR_UNPACK ;in: HL=src, DE=dest (mono 8x8 char to colored 8x8)
BC56 SCR_REPACK ;in: H=x, L=y, A=pen, DE=dest (colored 8x8 to mono)
BC59 SCR_ACCESS ;in: A=drawmode (0=Normal, 1=XOR, 2=AND, 3=OR)
BC5C SCR_PIXELS ;in: HL=vram addr, C=xmask, B=color
BC5F SCR_HORIZONTAL ;in: A=pen, DE=x1, BC=x2, HL=y
BC62 SCR_VERTICAL ;in: A=pen, HL=y1, BC=y2, DE=x
== Cassette (or Diskette) Functions ==
BC65 CAS_INITIALIZE
BC68 CAS_SET_SPEED ;in: HL=upper16bit, A=lower8bit
BC6B CAS_NOISY ;in: A=output cassette messages (0=yes, >0=no)
BC6E CAS_START_MOTOR ;out: A.bit4 old motor status (0=off, 1=on), cy=0, z=1
BC71 CAS_STOP_MOTOR ;out: A.bit4 old motor status (0=off, 1=on), cy=0, z=1
BC74 CAS_RESTORE_MOTOR ;in: A.bit4 new motor status (0=off, 1=on), cy=0, z=1
BC77 CAS_IN_OPEN ;in: HL=fname, B=fnamelen, DE=workbuf,
;out: HL=header, DE=dest, BC=siz, A=type, cy=err, zf
BC7A CAS_IN_CLOSE ;out: DE=workbuf, cy=0=failed (no open file)
BC7D CAS_IN_ABANDON ;out: DE=workbuf, cy=1, z=0, A=all_closed (FFh=yes)
BC80 CAS_IN_CHAR ;out: A=char, cy=0=error, zf=errtype
BC83 CAS_IN_DIRECT ;in: HL=dest, out: HL=entrypoint, cy=0=err, zf=errtype
BC86 CAS_RETURN ;in: A=char (undo CAS_IN_CHAR, char back to buffer)
BC89 CAS_TEST_EOF ;out: CY=0=eof (end of file)
BC8C CAS_OUT_OPEN ;in: HL=fname, B=fnamelen, DE=workbuf, out: HL,cy,zf
BC8F CAS_OUT_CLOSE ;out: DE=workbuf, cy=0=failed (zf=errtype)
BC92 CAS_OUT_ABANDON ;out: DE=workbuf, cy=1, z=0, A=all_closed (FFh=yes)
BC95 CAS_OUT_CHAR ;in: A=char, out: cy=0=error, zf=errtype
BC98 CAS_OUT_DIRECT ;in: HL=src, DE=len, BC=entrypoint, A=type, out: cy/zf
BC9B CAS_CATALOG ;in: DE=workbuf, out: DE=workbuf, cy=0=error
BC9E CAS_WRITE ;in: HL=src, DE=len, A=ID(2Ch=header, 16h=data), out?
BCA1 CAS_READ ;in: HL=dest, DE=len, A=ID(2Ch=header, 16h=data), out?
BCA4 CAS_CHECK ;in: HL=src, DE=len, A=ID(2Ch=header, 16h=data), out?
== Sound Functions ==
BCA7 SOUND_RESET
BCAA SOUND_QUEUE ;in: HL=dat ;ch,env,ent,freq(lo,hi,noise),vol,len(lo,hi)
BCAD SOUND_CHECK ;in: A=channel mask, out: A=channel status
BCB0 SOUND_ARM_EVENT
BCB3 SOUND_RELEASE ;in: A=channel mask
BCB6 SOUND_PAUSE
BCB9 SOUND_UNPAUSE
BCBC SOUND_SET_ENV ;in: A=number (1..15), HL=data (must be >3FFFh)
BCBF SOUND_SET_ENT ;in: A=number (1..15), HL=data (must be >3FFFh)
BCC2 SOUND_GET_ENV ;in: A=number (1..15), out: HL=data
BCC5 SOUND_GET_ENT ;in: A=number (1..15), out: HL=data
== Kernel ROM Functions ==
BCC8 KL_CHOKE_OFF
BCCB KL_ROM_WALK
BCCE KL_INIT_BACK
BCD1 KL_LOG_EXT
BCD4 KL_FIND_COMMAND
== Kernel Timer/Event Functions ==
BCD7 KL_NEW_FRAME_FLY
BCDA KL_ADD_FRAME_FLY
BCDD KL_DELETE_FRAME_FLY
BCE0 KL_NEW_FAST_TICKER
BCE3 KL_ADD_FAST_TICKER
BCE6 KL_DELETE_FAST_TICKER
BCE9 KL_ADD_TICKER
BCEC KL_DELETE_TICKER
BCEF KL_INIT_EVENT
BCF2 KL_EVENT
BCF5 KL_SYNC_RESET
BCF8 KL_DEL_SYNCHRONOUS
BCFB KL_NEXT_SYNC
BCFE KL_DO_SYNC
BD01 KL_DONE_SYNC
BD04 KL_EVENT_DISABLE
BD07 KL_EVENT_ENABLE
BD0A KL_DISARM_EVENT
BD0D KL_TIME_PLEASE ;out: hl=low, de=high (64bit, incremented at 300Hz)
BD10 KL_TIME_SET ;in: hl=low, de=high (64bit, incremented at 300Hz)
== Machine Pack ==
BD13 MC_BOOT_PROGRAM ;in: HL=loader_callback, out: starts program
BD16 MC_START_PROGRAM ;in: HL=entrypoint (0000h=BASIC), C=ROMcfg
BD19 MC_WAIT_FLYBACK ;wait until/unless PIO.Port B bit0=1 (vsync)
BD1C MC_SET_MODE ;in: A=video mode (0..2) (for C' and gate array)
BD1F MC_SCREEN_OFFSET ;in: A=base, HL=offset (for CRTC)
BD22 MC_CLEAR_INKS ;in: DE=ptr to border and 1 ink
BD25 MC_SET_INKS ;in: DE=ptr to border and 16 inks
BD28 MC_RESET_PRINTER ;out: [BDF1]=default jp opcode
BD2B MC_PRINT_CHAR ;in: A=char, out: CY=1=okay, CY=0=busy/timeout
BD2E MC_BUSY_PRINTER ;out: CY=1=busy, CY=0=ready
BD31 MC_SEND_PRINTER ;in: A=char, out: CY=1
BD34 MC_SOUND_REGISTER ;in: A=PSG index, C=PSG data
BD37 JUMP_RESTORE ;out: [BB00..BDCC]=defaults
== Edit and Floating Point Functions (Addresses changed in each version) ==
464 664 6128
BD3A BD5B BD5E EDIT ;io: HL=input buffer, out: CY=0=ESC (also Z=1=ESC)
BD3D BD5E BD61 FLO_COPY [HL]=[DE], A=exponent
BD40 BD61 BD64 FLO_int to real ;DE=dest, HL=unsigned16bit, A.7=sign
BD43 BD64 BD67 FLO_ 4-byte to real
BD46 BD67 BD6A FLO_ real to int
BD49 BD6A BD6D FLO_ round
BD4C BD6D BD70 FLO_ FIX
BD4F BD70 BD73 FLO_ INT
BD52 BD73 BD76 FLO_ prepare for decimal
BD55 BD76 BD79 FLO_ mul 10^A
BD58 BD79 BD7C FLO_ ADD [HL]=[HL]+[DE]
BD5B N/A N/A FLO_SUB1 [HL]=[HL]-[DE]
BD5E BD7F BD82 FLO_SUB2 [HL]=[DE]-[HL] (swapped operands)
BD61 BD82 BD85 FLO_MUL [HL]=[HL]*[DE]
BD64 BD85 BD88 FLO_DIV [HL]=[HL]/[DE]
BD67 N/A N/A FLO_SHIFT [HL]=[HL]*2^A
BD6A BD8B BD8E FLO_COMPARE [HL]-[DE]
BD6D BD8E BD91 FLO_NEG
BD70 BD91 BD94 FLO_SGN
BD73 BD94 BD97 FLO_DEG/RAD ;in: A=00h=RAD, FFh=DEG
BD76 BD97 BD9A FLO_PI [HL]=PI
BD79 BD9A BD9D FLO_SQRT [HL]=[HL]^0.5
BD7C BD9D BDA0 FLO_POT [HL]=[HL]^[DE]
BD7F BDA0 BDA3 FLO_LOG [HL]=LOG([HL])
BD82 BDA3 BDA6 FLO_LOG10 [HL]=LOG10([HL])
BD85 BDA6 BDA9 FLO_EXP [HL]=EXP([HL])
BD88 BDA9 BDAC FLO_SIN [HL]=SIN([HL])
BD8B BDAC BDAF FLO_COS [HL]=COS([HL])
BD8E BDAF BDB2 FLO_TAN [HL]=TAN([HL])
BD91 BDB2 BDB5 FLO_ATN [HL]=ATN([HL])
BD94 BDB5 BDB8 FLO_5-byte to REAL
BD97 BDB8 BDBB FLO_RND_INIT ;seed=89656C07h
BD9A BDBB BDBE FLO_RND_SEED ;seed=89656C07h xor [HL]
BD9D BD7C BD7F FLO_RND ;\on 664/6128 these are "inserted"
BDA0 BD88 BD8B FLO_RND last value ;/in the above "N/A" locations
== Integer Functions - 464 only (moved/replaced by other stuff on 664 and up) ==
464 664 6128
BDA3 N/A N/A INT_ABS HL=ABS(HL), B.7=SIGN(HL), C=2=Mantisse, E=0=Int
BDA6 N/A N/A INT_POS HL=HL, B.7=0=Positive, C=2=Mantisse, E=0=Int
BDA9 N/A N/A INT_UNDO in: HL=unsigned, B.7=sign, out: HL=signed, cy,zf
BDAC N/A N/A INT_ADD HL=HL+DE, Z=1=zero, CY=1=signed_overflow
BDAF N/A N/A INT_SUB1 HL=HL-DE, Z=1=zero, CY=0=signed_overflow
BDB2 N/A N/A INT_SUB2 HL=DE-HL, Z=1=zero, CY=0=signed_overflow
BDB5 N/A N/A INT_MUL HL=HL*DE
BDB8 N/A N/A INT_DIV HL=HL/DE
BDBB N/A N/A INT_MOD HL=HL MOD DE
BDBE N/A N/A INT_UMUL HL=HL*DE, CY=1=unsigned_overflow
BDC1 N/A N/A INT_UDIV HL=HL/DE, DE=HL MOD DE, Z=1=error (div0)
BDC4 N/A N/A INT_CMP A=SGN(HL-DE) ;00h=zero, 01h=pos, FFh=neg
BDC7 N/A N/A INT_NEG HL=-HL ;cy=0=overflow (HL=+8000h)
BDCA N/A N/A INT_SGN A=SGN(HL) ;00h=zero, 01h=pos, FFh=neg
== Additional 664/6128 Functions ==
664 and up only...
BD3A KM_SET_LOCKS_664 ;in: H=caps lock (caps), L=shift lock (ctrl caps)
BD3D KM_FLUSH_664 ;calls KM_READ_CHAR until cy=0
BD40 TXT_ASK_STATE_664
BD43 GRA_DEFAULT_664 ;SCR_WRITE=?, BACK=00h,FIRST=FFh,MASK=FFh
BD46 GRA_SET_BACK_664 ;A=background mode (FFh=transparent)
BD49 GRA_SET_FIRST_664 ;in: A=flag (00h,FFh;1st pix of LINE)
BD4C GRA_SET_LINE_MASK_664 ;in: A=mask
BD4F GRA_FROM_USER_664 ;in: de=x, hl=y, out: de,hl=real x,y
BD52 GRA_FILL_664 ;in: A=color,hl=buf,de=bufsize, out:cy=0=err
BD55 SCR_SET_POSITION_664 ;in: A=BASE,HL=OFFSET, out: A AND C0h, HL AND 7FEh
BD58 MC_PRINT_TRANSLATION_664
6128 and up only...
BD5B KL_RAM_SELECT_6128 --6128 only--
== Indirections (List of JUMPs into BIOS area -- LO ROM must be enabled!) ==
BDCD HOOK_TXT_DRAW_CURSOR
BDD0 HOOK_TXT_UNDRAW_CURSOR
BDD3 HOOK_TXT_WRITE_CHAR ;in: H=x, L=y, A=char
BDD6 HOOK_TXT_UNWRITE ;in: H=x, L=y, out: A=char, Z=space, cy=1=okay
BDD9 HOOK_TXT_OUT_ACTION ;in: A=char
BDDC HOOK_GRA_PLOT ;in: de=x, hl=y
BDDF HOOK_GRA_TEST ;in: de=x, hl=y, out: A=color
BDE2 HOOK_GRA_LINE ;in: de=x, hl=y
BDE5 HOOK_SCR_READ ;in: HL=vram addr, C=xmask, out: A=color
BDE8 HOOK_SCR_WRITE ;in: HL=vram addr, C=xmask, B=color
BDEB HOOK_SCR_MODE_CLEAR ;clear vram, etc. (same as BC14)
BDEE HOOK_KM_TEST_BREAK
BDF1 HOOK_MC_PRINT_CHAR ;in: A=char, out: CY=1=okay, CY=0=busy/timeout
664 and up only:
BDF4 HOOK_KM_SCAN_KEYS_664
== RSX Functions (Resident System Extensions) ==
C000 (ROM Header)
C004 Pointer to RSX Function Names ;Names end with bit7=1, list ends with 00h
C006 List of 16bit RSX Function Addresses
Note: RSX function 3-byte FAR addresses can be retrieved via KL_FIND_COMMAND.
== BASIC RSX Functions ==
;RSX Name: "BASIC"+80h ;io: DE=LORAM, HL=HIRAM
== AMSDOS RSX Functions ==
CPM ;in: A=00h (no params) ;start boot sector
DISC ;in: A=00h (no params)
DISC.IN ;in: A=00h (no params) ;not supported by CPC+
DISC.OUT ;in: A=00h (no params) ;not supported by CPC+
TAPE ;in: A=00h (no params) ;not supported by VDOS
TAPE.IN ;in: A=00h (no params) ;not supported by VDOS and CPC+
TAPE.OUT ;in: A=00h (no params) ;not supported by VDOS and CPC+
A ;in: A=00h (no params) ;set default drive = A
B ;in: A=00h (no params) ;set default drive = B
DRIVE ;in: A=01h, [IX+0]=ptr to "A","a","B","b" ;\not supported
USER ;in: A=01h, [IX+0]=user number (0000h..000Fh) ;/by VDOS
DIR ;in: A=00h, or A=01h, [IX+0]=ptr to "filename"
ERA ;in: A=01h, [IX+0]=ptr to "filename"
REN ;in: A=02h, [IX+0]=ptr to "oldname",[IX+2]=to "newname"
== AMSDOS Hidden RSX Functions ==
[C006h] INIT ;in/out: DE=LORAM, HL=HIRAM, CY=?
chr(81h) MESSAGE_ON_OFF ;in: A=flag(00h=on, >=01h=off) (R,I,C) ;out:A=old
chr(82h) SET_DRIVE_SPEED ;in: HL=ptr to 9 bytes
chr(83h) SET_DISK_TYPE ;in: A=type (0xh=IBM, 4xh=CPM, Cxh=DATA)
chr(84h) READ_SECTOR ;in: E=drv, D=trk, C=sec, HL=dest
chr(85h) WRITE_SECTOR ;in: E=drv, D=trk, C=sec, HL=src
chr(86h) FORMAT_TRACK ;in: E=drv, D=trk, C=sec1, HL=ptr to 9x4 byte
chr(87h) SEEK_TRACK ;in: E=drv, D=trk, out: cy=1=okay
chr(88h) TEST_DRIVE ;in: A=drv, out: cy=1=okay
chr(89h) SET_RETRY_COUNT ;in: A=retry count (default=10) (01h..(1)00h)
0000 RESET (RST0/RESET)
0008 KL_LO_JUMP (RST1)
000B KL_LO_CALL_HL
000E KL_JP_BC ;in: BC=addr
0010 KL_SIDE_CALL_SP (RST2)
0013 KL_SIDE_CALL_HL
0016 KL_JP_DE ;in: DE=addr
0018 KL_FAR_CALL_SP (RST3)
001B KL_FAR_CALL_C_HL
001E KL_JP_HL ;in: HL=addr
0020 KL_RAM_LD_A_HL (RST4) ;in: HL=src, out: A=[HL]
0023 KL_FAR_CALL_HL
0028 KL_FIRM_JUMP (RST5)
002B DATA (OLD C' WHEN RST 30h OCCURRED WITH LO_ROM ENABLED)
0030 FREE_FOR_USER (RST6)
0038 INTERRUPT (RST7/IRQ)
003B EXT_INTERRUPT_VECTOR
0066 GARBAGE (THERE'S NO NMI HANDLER IN ROM)
== Kernel RAM Functions ==
B900 KL_U_ROM_ENABLE ;out: A=old C'
B903 KL_U_ROM_DISABLE ;out: A=old C'
B906 KL_L_ROM_ENABLE ;out: A=old C'
B909 KL_L_ROM_DISABLE ;out: A=old C'
B90C KL_ROM_RESTORE ;in: A=new C' (Bit2,3)
B90F KL_ROM_SELECT ;in: C=upper ROM bank (select, and enable that bank)
B912 KL_CURR_SELECTION ;out: A=upper ROM bank
B915 KL_PROBE_ROM ;in: C=upper ROM bank, out: A=[C000h], HL=[C001h]
B918 KL_ROM_DESELECT ;in: B=new C', C=upper ROM bank, out: B=A, C=old bank
B91B KL_RAM_LDIR ;in: HL=src, DE=dest, BC=len
B91E KL_RAM_LDDR ;in: HL=src_end, DE=dest_end, BC=len
B921 KL_POLL_SYNCHRONOUS
664 and up only
B92A KL_SCAN_NEEDED_664
== Keyboard Manager ==
BB00 KM_INITIALIZE
BB03 KM_RESET
BB06 KM_WAIT_CHAR out: A=char (waits until valid char)
BB09 KM_READ_CHAR out: A=char, cy=1=valid char
BB0C KM_CHAR_RETURN in: A=char (writeback max one char to keybuf)
BB0F KM_SET_EXPAND in: B=code, HL=ptr to new string, C=length
BB12 KM_GET_EXPAND in: A=code (0-1F,80-9F), L=index, out:A=char, cy,zf
BB15 KM_EXP_BUF_RESET in: de=begin, hl=length of buffer, out: cy: 1=okay
BB18 KM_WAIT_KEY out: A=char (waits until key pressed)
BB1B KM_READ_KEY out: cy:0=none, cy:1=key pressed, A=char
BB1E KM_TEST_KEY in: A=keyno, out: nz=pressed, C=ctrl/shift flags
BB21 KM_GET_LOCKS out: H=caps lock (caps), L=shift lock (ctrl+caps)
BB24 KM_GET_JOYSTICK out: H=joystick 0, L=joystick 1
BB27 KM_SET_TRANSLATE in: A=keyno, B=char (normal)
BB2A KM_GET_TRANSLATE in: A=keyno, out: A=char (normal)
BB2D KM_SET_SHIFT in: A=keyno, B=char (with shift)
BB30 KM_GET_SHIFT in: A=keyno, out: A=char (with shift)
BB33 KM_SET_CTRL in: A=keyno, B=char (with control)
BB36 KM_GET_CTRL in: A=keyno, out: A=char (with control)
BB39 KM_SET_REPEAT in: A=keyno, B=repeat flag (FFh=on)
BB3C KM_GET_REPEAT in: A=keyno, out: nz=repeat
BB3F KM_SET_DELAY in: H=1st delay, L=repeat delay
BB42 KM_GET_DELAY out: H=1st delay, L=repeat delay
BB45 KM_ARM_BREAK in: de=procedure, c=ROM config
BB48 KM_DISARM_BREAK in: none
BB4B KM_BREAK_EVENT
== Text Output Functions ==
BB4E TXT_INITIALIZE
BB51 TXT_RESET
BB54 TXT_VDU_DISABLE
BB57 TXT_VDU_ENABLE
BB5A TXT_OUTPUT in: A=char ;display 20h..FFh, or handle 00h..1Fh
BB5D TXT_WR_CHAR in: A=char ;display 00h..FFh
BB60 TXT_RD_CHAR out: A=char, Z=space, cy=1=okay
BB63 TXT_SET_GRAPHIC in: A=0=normal text position, A>0=graphics position
BB66 TXT_SET_WINDOW in: H=x1, L=y1, D=x2, E=y2 (x=0..79, y=0..24)
BB69 TXT_GET_WINDOW out: H=x1, L=y1, D=x2, E=y2, cy=0=hardware scrolling
BB6C TXT_CLEAR_WINDOW fill window by PAPER color
BB6F TXT_SET_COLUMN in: A=x
BB72 TXT_SET_ROW in: A=y
BB75 TXT_SET_CURSOR in: H=x, L=y
BB78 TXT_GET_CURSOR out: H=x, L=y
BB7B TXT_CUR_ENABLE
BB7E TXT_CUR_DISABLE
BB81 TXT_CUR_ON
BB84 TXT_CUR_OFF
BB87 TXT_VALIDATE io: H=x, L=y, out: cy: 1=position ok, 0=scroll
BB8A TXT_PLACE_CURSOR
BB8D TXT_REMOVE_CURSOR
BB90 TXT_SET_PEN in: A=foreground color 0..15
BB93 TXT_GET_PEN out: A=foreground color 0..15
BB96 TXT_SET_PAPER in: A=background color 0..15
BB99 TXT_GET_PAPER out: A=background color 0..15
BB9C TXT_INVERSE exchange foreground and background colors
BB9F TXT_SET_BACK in: A=0=normal, A=1=transparent/OR
BBA2 TXT_GET_BACK out: Z=normal, NZ=transparent/OR
BBA5 TXT_GET_MATRIX in: A=char, out: HL=char bitmap ptr, cy:0=ROM,1=RAM
BBA8 TXT_SET_MATRIX in: A=char, HL=ptr to 8x8 char bitmap
BBAB TXT_SET_M_TABLE in: D=00h=RAM, E=1st char, HL=RAM chars, out: cy,A,HL
BBAE TXT_GET_M_TABLE out: cy=1=RAM, A=1st char, HL=RAM chars
BBB1 TXT_GET_CONTROLS out: HL=ptr to table of control characters
BBB4 TXT_STR_SELECT in: A=new window number, out: A=old (# 0..7)
BBB7 TXT_SWAP_STREAMS in: B,C=window numbers to be exchanged
== Graphics Functions ==
BBBA GRA_INITIALIZE
BBBD GRA_RESET_HOOKS ;out: [BDDC+00h..0Ah]=Default jump opcodes/addresses
BBC0 GRA_MOVE_ABSOLUTE ;in: de=x, hl=y ;\set current coordinate
BBC3 GRA_MOVE_RELATIVE ;in: de=x, hl=y ;/
BBC6 GRA_ASK_CURSOR ;out: de=x, hl=y ;-get current coordinate
BBC9 GRA_SET_ORIGIN ;in: de=x, hl=y (also does MOVE 0,0)
BBCC GRA_GET_ORIGIN ;out: de=x, hl=y
BBCF GRA_SET_WIN_WIDTH ;in: de=x1/left, hl=x2/right
BBD2 GRA_SET_WIN_HEIGHT;in: de=y1/top, hl=y2/bottom
BBD5 GRA_GET_WIN_WIDTH ;out: de=x1/left, hl=x2/right
BBD8 GRA_GET_WIN_HEIGHT;out: de=y1/top, hl=y2/bottom
BBDB GRA_CLEAR_WINDOW ;fill window by PAPER (also does MOVE 0,0)
BBDE GRA_SET_PEN ;in: A=color (0..15) for PLOT/LINE/WR_CHAR
BBE1 GRA_GET_PEN ;out: A=color (0..15)
BBE4 GRA_SET_PAPER ;in: A=color (0..15) for CLEAR_WINDOW/WR_CHAR
BBE7 GRA_GET_PAPER ;out: A=color (0..15
BBEA GRA_PLOT_ABSOLUTE ;in: de=x, hl=y ;\draw pixel at specified coordinate
BBED GRA_PLOT_RELATIVE ;in: de=x, hl=y ;/
BBF0 GRA_TEST_ABSOLUTE ;in: de=x, hl=y, out: A=color (0..15) of pixel
BBF3 GRA_TEST_RELATIVE ;in: de=x, hl=y, out: A=color (0..15) of pixel
BBF6 GRA_LINE_ABSOLUTE ;in: de=x, hl=y ;\draw line from current coordinate
BBF9 GRA_LINE_RELATIVE ;in: de=x, hl=y ;/to specified target coordinate
BBFC GRA_WR_CHAR ;in: A=char ;-draw char at current coordinate
== Screen Functions ==
BBFF SCR_INITIALIZE
BC02 SCR_RESET
BC05 SCR_SET_OFFSET ;in: HL.bit10..0 = vram offset 0..7FFh
BC08 SCR_SET_BASE ;in: A.bit7-6 = vram block 0..3
BC0B SCR_GET_LOCATION ;out: A.bit7-6=block, HL.bit10..0=offset
BC0E SCR_SET_MODE ;in: A=mode (0=160x200x16, 1=320x200x4, 2=640x200x2)
BC11 SCR_GET_MODE ;out: A=mode (cy=mode0, z=mode1, ie. cmp mode,1)
BC14 SCR_MODE_CLEAR ;clear vram, set offset=0000h, update inks
BC17 SCR_CHAR_LIMITS ;out: B=max_x(19,39,79), C=max_y(24)
BC1A SCR_CHAR_POSITION ;in: H=x, L=y, out: HL=vram addr, B=bytes/char
BC1D SCR_DOT_POSITION ;in: DE=x, HL=y, out: HL=vram addr, C=mask, DE, B
BC20 SCR_NEXT_BYTE ;out: HL=HL+1 (wrapped within 800h-byte block)
BC23 SCR_PREV_BYTE ;out: HL=HL-1 (wrapped within 800h-byte block)
BC26 SCR_NEXT_LINE ;out: HL=HL+800h, or HL=HL+50h-3800h (or so)
BC29 SCR_PREV_LINE ;out: HL=HL-800h, or HL=HL-50h+3800h (or so)
BC2C SCR_INK_ENCODE ;in: A=color, out: A=color_mask
BC2F SCR_INK_DECODE ;in: A=color_mask, out: A=color
BC32 SCR_SET_INK ;in: A=index, B=color1, C=color2
BC35 SCR_GET_INK ;in: A=index, out: B=color1, C=color2
BC38 SCR_SET_BORDER ;in: B=color1, C=color2
BC3B SCR_GET_BORDER ;out: B=color1, C=color2
BC3E SCR_SET_FLASHING ;in: H=count1, L=count2
BC41 SCR_GET_FLASHING ;out: H=count1, L=count2
BC44 SCR_FILL_BOX ;in: A=fillbyte, H=x1, L=y1, D=x2, E=y2
BC47 SCR_FLOOD_BOX ;in: A=fillbyte, HL=vram addr, D=xsiz, E=ysiz
BC4A SCR_CHAR_INVERT ;in: H=x, L=y, B=paper, C=pen
BC4D SCR_HARDWARE_ROLL ;in: A=paper, B=dir(0=down, FFh=up)
BC50 SCR_SOFTWARE_ROLL ;in: A=paper, B=dir(""), H=x1, L=y1, D=x2, E=y2
BC53 SCR_UNPACK ;in: HL=src, DE=dest (mono 8x8 char to colored 8x8)
BC56 SCR_REPACK ;in: H=x, L=y, A=pen, DE=dest (colored 8x8 to mono)
BC59 SCR_ACCESS ;in: A=drawmode (0=Normal, 1=XOR, 2=AND, 3=OR)
BC5C SCR_PIXELS ;in: HL=vram addr, C=xmask, B=color
BC5F SCR_HORIZONTAL ;in: A=pen, DE=x1, BC=x2, HL=y
BC62 SCR_VERTICAL ;in: A=pen, HL=y1, BC=y2, DE=x
== Cassette (or Diskette) Functions ==
BC65 CAS_INITIALIZE
BC68 CAS_SET_SPEED ;in: HL=upper16bit, A=lower8bit
BC6B CAS_NOISY ;in: A=output cassette messages (0=yes, >0=no)
BC6E CAS_START_MOTOR ;out: A.bit4 old motor status (0=off, 1=on), cy=0, z=1
BC71 CAS_STOP_MOTOR ;out: A.bit4 old motor status (0=off, 1=on), cy=0, z=1
BC74 CAS_RESTORE_MOTOR ;in: A.bit4 new motor status (0=off, 1=on), cy=0, z=1
BC77 CAS_IN_OPEN ;in: HL=fname, B=fnamelen, DE=workbuf,
;out: HL=header, DE=dest, BC=siz, A=type, cy=err, zf
BC7A CAS_IN_CLOSE ;out: DE=workbuf, cy=0=failed (no open file)
BC7D CAS_IN_ABANDON ;out: DE=workbuf, cy=1, z=0, A=all_closed (FFh=yes)
BC80 CAS_IN_CHAR ;out: A=char, cy=0=error, zf=errtype
BC83 CAS_IN_DIRECT ;in: HL=dest, out: HL=entrypoint, cy=0=err, zf=errtype
BC86 CAS_RETURN ;in: A=char (undo CAS_IN_CHAR, char back to buffer)
BC89 CAS_TEST_EOF ;out: CY=0=eof (end of file)
BC8C CAS_OUT_OPEN ;in: HL=fname, B=fnamelen, DE=workbuf, out: HL,cy,zf
BC8F CAS_OUT_CLOSE ;out: DE=workbuf, cy=0=failed (zf=errtype)
BC92 CAS_OUT_ABANDON ;out: DE=workbuf, cy=1, z=0, A=all_closed (FFh=yes)
BC95 CAS_OUT_CHAR ;in: A=char, out: cy=0=error, zf=errtype
BC98 CAS_OUT_DIRECT ;in: HL=src, DE=len, BC=entrypoint, A=type, out: cy/zf
BC9B CAS_CATALOG ;in: DE=workbuf, out: DE=workbuf, cy=0=error
BC9E CAS_WRITE ;in: HL=src, DE=len, A=ID(2Ch=header, 16h=data), out?
BCA1 CAS_READ ;in: HL=dest, DE=len, A=ID(2Ch=header, 16h=data), out?
BCA4 CAS_CHECK ;in: HL=src, DE=len, A=ID(2Ch=header, 16h=data), out?
== Sound Functions ==
BCA7 SOUND_RESET
BCAA SOUND_QUEUE ;in: HL=dat ;ch,env,ent,freq(lo,hi,noise),vol,len(lo,hi)
BCAD SOUND_CHECK ;in: A=channel mask, out: A=channel status
BCB0 SOUND_ARM_EVENT
BCB3 SOUND_RELEASE ;in: A=channel mask
BCB6 SOUND_PAUSE
BCB9 SOUND_UNPAUSE
BCBC SOUND_SET_ENV ;in: A=number (1..15), HL=data (must be >3FFFh)
BCBF SOUND_SET_ENT ;in: A=number (1..15), HL=data (must be >3FFFh)
BCC2 SOUND_GET_ENV ;in: A=number (1..15), out: HL=data
BCC5 SOUND_GET_ENT ;in: A=number (1..15), out: HL=data
== Kernel ROM Functions ==
BCC8 KL_CHOKE_OFF
BCCB KL_ROM_WALK
BCCE KL_INIT_BACK
BCD1 KL_LOG_EXT
BCD4 KL_FIND_COMMAND
== Kernel Timer/Event Functions ==
BCD7 KL_NEW_FRAME_FLY
BCDA KL_ADD_FRAME_FLY
BCDD KL_DELETE_FRAME_FLY
BCE0 KL_NEW_FAST_TICKER
BCE3 KL_ADD_FAST_TICKER
BCE6 KL_DELETE_FAST_TICKER
BCE9 KL_ADD_TICKER
BCEC KL_DELETE_TICKER
BCEF KL_INIT_EVENT
BCF2 KL_EVENT
BCF5 KL_SYNC_RESET
BCF8 KL_DEL_SYNCHRONOUS
BCFB KL_NEXT_SYNC
BCFE KL_DO_SYNC
BD01 KL_DONE_SYNC
BD04 KL_EVENT_DISABLE
BD07 KL_EVENT_ENABLE
BD0A KL_DISARM_EVENT
BD0D KL_TIME_PLEASE ;out: hl=low, de=high (64bit, incremented at 300Hz)
BD10 KL_TIME_SET ;in: hl=low, de=high (64bit, incremented at 300Hz)
== Machine Pack ==
BD13 MC_BOOT_PROGRAM ;in: HL=loader_callback, out: starts program
BD16 MC_START_PROGRAM ;in: HL=entrypoint (0000h=BASIC), C=ROMcfg
BD19 MC_WAIT_FLYBACK ;wait until/unless PIO.Port B bit0=1 (vsync)
BD1C MC_SET_MODE ;in: A=video mode (0..2) (for C' and gate array)
BD1F MC_SCREEN_OFFSET ;in: A=base, HL=offset (for CRTC)
BD22 MC_CLEAR_INKS ;in: DE=ptr to border and 1 ink
BD25 MC_SET_INKS ;in: DE=ptr to border and 16 inks
BD28 MC_RESET_PRINTER ;out: [BDF1]=default jp opcode
BD2B MC_PRINT_CHAR ;in: A=char, out: CY=1=okay, CY=0=busy/timeout
BD2E MC_BUSY_PRINTER ;out: CY=1=busy, CY=0=ready
BD31 MC_SEND_PRINTER ;in: A=char, out: CY=1
BD34 MC_SOUND_REGISTER ;in: A=PSG index, C=PSG data
BD37 JUMP_RESTORE ;out: [BB00..BDCC]=defaults
== Edit and Floating Point Functions (Addresses changed in each version) ==
464 664 6128
BD3A BD5B BD5E EDIT ;io: HL=input buffer, out: CY=0=ESC (also Z=1=ESC)
BD3D BD5E BD61 FLO_COPY [HL]=[DE], A=exponent
BD40 BD61 BD64 FLO_int to real ;DE=dest, HL=unsigned16bit, A.7=sign
BD43 BD64 BD67 FLO_ 4-byte to real
BD46 BD67 BD6A FLO_ real to int
BD49 BD6A BD6D FLO_ round
BD4C BD6D BD70 FLO_ FIX
BD4F BD70 BD73 FLO_ INT
BD52 BD73 BD76 FLO_ prepare for decimal
BD55 BD76 BD79 FLO_ mul 10^A
BD58 BD79 BD7C FLO_ ADD [HL]=[HL]+[DE]
BD5B N/A N/A FLO_SUB1 [HL]=[HL]-[DE]
BD5E BD7F BD82 FLO_SUB2 [HL]=[DE]-[HL] (swapped operands)
BD61 BD82 BD85 FLO_MUL [HL]=[HL]*[DE]
BD64 BD85 BD88 FLO_DIV [HL]=[HL]/[DE]
BD67 N/A N/A FLO_SHIFT [HL]=[HL]*2^A
BD6A BD8B BD8E FLO_COMPARE [HL]-[DE]
BD6D BD8E BD91 FLO_NEG
BD70 BD91 BD94 FLO_SGN
BD73 BD94 BD97 FLO_DEG/RAD ;in: A=00h=RAD, FFh=DEG
BD76 BD97 BD9A FLO_PI [HL]=PI
BD79 BD9A BD9D FLO_SQRT [HL]=[HL]^0.5
BD7C BD9D BDA0 FLO_POT [HL]=[HL]^[DE]
BD7F BDA0 BDA3 FLO_LOG [HL]=LOG([HL])
BD82 BDA3 BDA6 FLO_LOG10 [HL]=LOG10([HL])
BD85 BDA6 BDA9 FLO_EXP [HL]=EXP([HL])
BD88 BDA9 BDAC FLO_SIN [HL]=SIN([HL])
BD8B BDAC BDAF FLO_COS [HL]=COS([HL])
BD8E BDAF BDB2 FLO_TAN [HL]=TAN([HL])
BD91 BDB2 BDB5 FLO_ATN [HL]=ATN([HL])
BD94 BDB5 BDB8 FLO_5-byte to REAL
BD97 BDB8 BDBB FLO_RND_INIT ;seed=89656C07h
BD9A BDBB BDBE FLO_RND_SEED ;seed=89656C07h xor [HL]
BD9D BD7C BD7F FLO_RND ;\on 664/6128 these are "inserted"
BDA0 BD88 BD8B FLO_RND last value ;/in the above "N/A" locations
== Integer Functions - 464 only (moved/replaced by other stuff on 664 and up) ==
464 664 6128
BDA3 N/A N/A INT_ABS HL=ABS(HL), B.7=SIGN(HL), C=2=Mantisse, E=0=Int
BDA6 N/A N/A INT_POS HL=HL, B.7=0=Positive, C=2=Mantisse, E=0=Int
BDA9 N/A N/A INT_UNDO in: HL=unsigned, B.7=sign, out: HL=signed, cy,zf
BDAC N/A N/A INT_ADD HL=HL+DE, Z=1=zero, CY=1=signed_overflow
BDAF N/A N/A INT_SUB1 HL=HL-DE, Z=1=zero, CY=0=signed_overflow
BDB2 N/A N/A INT_SUB2 HL=DE-HL, Z=1=zero, CY=0=signed_overflow
BDB5 N/A N/A INT_MUL HL=HL*DE
BDB8 N/A N/A INT_DIV HL=HL/DE
BDBB N/A N/A INT_MOD HL=HL MOD DE
BDBE N/A N/A INT_UMUL HL=HL*DE, CY=1=unsigned_overflow
BDC1 N/A N/A INT_UDIV HL=HL/DE, DE=HL MOD DE, Z=1=error (div0)
BDC4 N/A N/A INT_CMP A=SGN(HL-DE) ;00h=zero, 01h=pos, FFh=neg
BDC7 N/A N/A INT_NEG HL=-HL ;cy=0=overflow (HL=+8000h)
BDCA N/A N/A INT_SGN A=SGN(HL) ;00h=zero, 01h=pos, FFh=neg
== Additional 664/6128 Functions ==
664 and up only...
BD3A KM_SET_LOCKS_664 ;in: H=caps lock (caps), L=shift lock (ctrl caps)
BD3D KM_FLUSH_664 ;calls KM_READ_CHAR until cy=0
BD40 TXT_ASK_STATE_664
BD43 GRA_DEFAULT_664 ;SCR_WRITE=?, BACK=00h,FIRST=FFh,MASK=FFh
BD46 GRA_SET_BACK_664 ;A=background mode (FFh=transparent)
BD49 GRA_SET_FIRST_664 ;in: A=flag (00h,FFh;1st pix of LINE)
BD4C GRA_SET_LINE_MASK_664 ;in: A=mask
BD4F GRA_FROM_USER_664 ;in: de=x, hl=y, out: de,hl=real x,y
BD52 GRA_FILL_664 ;in: A=color,hl=buf,de=bufsize, out:cy=0=err
BD55 SCR_SET_POSITION_664 ;in: A=BASE,HL=OFFSET, out: A AND C0h, HL AND 7FEh
BD58 MC_PRINT_TRANSLATION_664
6128 and up only...
BD5B KL_RAM_SELECT_6128 --6128 only--
== Indirections (List of JUMPs into BIOS area -- LO ROM must be enabled!) ==
BDCD HOOK_TXT_DRAW_CURSOR
BDD0 HOOK_TXT_UNDRAW_CURSOR
BDD3 HOOK_TXT_WRITE_CHAR ;in: H=x, L=y, A=char
BDD6 HOOK_TXT_UNWRITE ;in: H=x, L=y, out: A=char, Z=space, cy=1=okay
BDD9 HOOK_TXT_OUT_ACTION ;in: A=char
BDDC HOOK_GRA_PLOT ;in: de=x, hl=y
BDDF HOOK_GRA_TEST ;in: de=x, hl=y, out: A=color
BDE2 HOOK_GRA_LINE ;in: de=x, hl=y
BDE5 HOOK_SCR_READ ;in: HL=vram addr, C=xmask, out: A=color
BDE8 HOOK_SCR_WRITE ;in: HL=vram addr, C=xmask, B=color
BDEB HOOK_SCR_MODE_CLEAR ;clear vram, etc. (same as BC14)
BDEE HOOK_KM_TEST_BREAK
BDF1 HOOK_MC_PRINT_CHAR ;in: A=char, out: CY=1=okay, CY=0=busy/timeout
664 and up only:
BDF4 HOOK_KM_SCAN_KEYS_664
== RSX Functions (Resident System Extensions) ==
C000 (ROM Header)
C004 Pointer to RSX Function Names ;Names end with bit7=1, list ends with 00h
C006 List of 16bit RSX Function Addresses
Note: RSX function 3-byte FAR addresses can be retrieved via KL_FIND_COMMAND.
== BASIC RSX Functions ==
;RSX Name: "BASIC"+80h ;io: DE=LORAM, HL=HIRAM
== AMSDOS RSX Functions ==
CPM ;in: A=00h (no params) ;start boot sector
DISC ;in: A=00h (no params)
DISC.IN ;in: A=00h (no params) ;not supported by CPC+
DISC.OUT ;in: A=00h (no params) ;not supported by CPC+
TAPE ;in: A=00h (no params) ;not supported by VDOS
TAPE.IN ;in: A=00h (no params) ;not supported by VDOS and CPC+
TAPE.OUT ;in: A=00h (no params) ;not supported by VDOS and CPC+
A ;in: A=00h (no params) ;set default drive = A
B ;in: A=00h (no params) ;set default drive = B
DRIVE ;in: A=01h, [IX+0]=ptr to "A","a","B","b" ;\not supported
USER ;in: A=01h, [IX+0]=user number (0000h..000Fh) ;/by VDOS
DIR ;in: A=00h, or A=01h, [IX+0]=ptr to "filename"
ERA ;in: A=01h, [IX+0]=ptr to "filename"
REN ;in: A=02h, [IX+0]=ptr to "oldname",[IX+2]=to "newname"
== AMSDOS Hidden RSX Functions ==
[C006h] INIT ;in/out: DE=LORAM, HL=HIRAM, CY=?
chr(81h) MESSAGE_ON_OFF ;in: A=flag(00h=on, >=01h=off) (R,I,C) ;out:A=old
chr(82h) SET_DRIVE_SPEED ;in: HL=ptr to 9 bytes
chr(83h) SET_DISK_TYPE ;in: A=type (0xh=IBM, 4xh=CPM, Cxh=DATA)
chr(84h) READ_SECTOR ;in: E=drv, D=trk, C=sec, HL=dest
chr(85h) WRITE_SECTOR ;in: E=drv, D=trk, C=sec, HL=src
chr(86h) FORMAT_TRACK ;in: E=drv, D=trk, C=sec1, HL=ptr to 9x4 byte
chr(87h) SEEK_TRACK ;in: E=drv, D=trk, out: cy=1=okay
chr(88h) TEST_DRIVE ;in: A=drv, out: cy=1=okay
chr(89h) SET_RETRY_COUNT ;in: A=retry count (default=10) (01h..(1)00h)