;**************************************** ;* SNG v1.0 * ;* Shell avec Niveaux de Gris * ;* * ;* par Marc Plouhinec * ;* le 05/08/2004 * ;* site: http://thebestof.vze.com * ;* Email: mailto://m_plouhinec@yahoo.fr * ;* * ;**************************************** ;Zones de la mémoire: ;-------------------- KEY_0 = $8000 KEY_1 = $8001 KEY_2 = $8002 KEY_STAT = $8004 LAST_KEY = $8006 CONTRAST = $8008 APD_COUNTER = $800A CURSOR_POS = $800C CURSOR_ROW = $800C CURSOR_COL = $800D BUSY_COUNTER = $8026 BUSY_BITMAP = $8027 OP1 = $8028 OP2 = $8033 OP3 = $803E OP4 = $8049 OP5 = $8054 OP6 = $805F TEXT_MEM = $808F GRAF_CURS = $8215 CURSOR_X = $8215 CURSOR_Y = $8216 APD_BUF = $8228 _IY_TABLE = $8528 GRAPH_MEM = $88B8 TEXT_MEM2 = $8BDF WIN_START = $8C8F WIN_END = $8C90 VAT_START = $FE6E VAT_END = $8D18 ;Attention la fin de la VAT est indiquée à l'adresse $8D18 LIB_BUFFER = $8D77 NB_LIB = $8DC7 ROM_CALL_DIFF = $92CA ROM_CALL_ZONE = $9318 ;Appels de la ROM: ;----------------- ;Utilisez CALL pour ces instructions: ;- - - - - - - - - - - - - - - - - - LD_HL_MHL = $0033 ;HL=(HL), A=L CP_HL_DE = $0095 ;CP HL, DE UNPACK_HL = $00A1 ;HL=int(HL/10), A=HL MOD 10 DIV_HL_A = $00A3 ;HL=int(HL/A), A=HL MOD A FIND_PIXEL = $4166 ;Find pixel (rom page must be 4) ;Utilisez ROM_CALL() pour ces instructions: ;- - - - - - - - - - - - - - - - - - - - - KEY_READ = $01B8 ;Does raw keyboard read with mask A; returns A STORE_KEY = $01C7 ;Store keystroke from A GET_KEY = $01D4 ;Get immediate keystroke into A ;DISP_DELAY = $07F3 ;Delay for display controller (60 clocks) INSERT_MEM = $2258 ;Allocates a region of memory: HL = size DE = address MEM_FREE = $22AE ;Checks if there is enough memory: HL = number of bytes that need to be allocated CREATE_PRGM = $2397 ;Creates a program: DE -> name HL = size DEL_MEM = $258D ;Deletes a region of allocated memory: HL = address DE = size DEL_TMP = $3606 ;Delete temporary use memory region TR_CHARPUT = $3738 ;Raw display of A on screen, normal text style CREATE_TMP = $38D0 ;Create temporary use memory region TX_CHARPUT = $39D2 ;Xlated display of A on screen, normal text style D_ZT_STR = $38FA ;Display zero-terminated normal text string D_LT_STR = $373E ;Display length-byte normal text string D_HL_DECI = $387C ;Disp HL as 5-char, right just., blank-pad. integer LAST_LINE = $3774 ;Is it the last line? NEXT_LINE = $377A ;Goto next line (might scroll) SCROLL_UP = $3786 ;Scroll text screen up UP_TEXT = $37F2 ;Update text mem from command shadow M_CHARPUT = $37CE ;Display %A on screen, menu style D_ZM_STR = $37D4 ;Display zero-terminated string, menu style D_LM_STR = $37DA ;Display length indexed string, menu style CLEARLCD = $389A ;Clear LCD, but not text or graphics memory CLEARTEXT_W = $37B0 ;Clear LCD and text memory, but only current window (affected by 1,(IY+13)) CLEARTEXT_F = $37A4 ;Clear LCD and text memory (affected by 1,(IY+13)) CLEAR_DISP = $38CA ;Clear display BACKUP_DISP = $39C6 ;Copy display to APD_BUF RESTOR_DISP = $38DC ;Copy APD_BUF to display DISP_GRAPH = $38AC ;Display contents of GRAPH_MEM on LCD KEY_HAND = $3924 ;Get key using key handler (2nd, alpha, contrast) GET_T_CUR = $37C8 ; HL = absolute address of text cursor BUSY_OFF = $3918 ; turn off "busy" indicator BUSY_ON = $3930 ; turn on "busy" indicator DONE = $386A ; Print DONE at end of current line FIND_VAT = $2124 NB_2_STRING = $30f6 ;Appels de SNG : ;--------------- CP_HL_BC = $8D28 ;CP HL, BC FILL = $8D2B ;Remplit BC octets du contenu de A, débute à HL GRB_FILL = $8D2E ;Remplit GRAPH_MEM du contenu de A GRB_COPY = $8D31 ;AFFICHE GRAPH_MEM CLEAR_TEXT_MEM = $8D34 ;REMPLI TEXT_MEM DE 0 FILL_TEXT_MEM_SPACE = $8D37 ;REMPLI TEXT_MEM DE CARACTERES 'ESPACE' DISP_DELAY = $8D3A ;68 clocks NEW_INTERRUPT = $8D3D ;DE=adresse de la routine à installer comme interruption STOP_INTERRUPT = $8D40 ;A=NUMERO DE LA ROUTINE à désinstaller MUL_HL_BC = $8D43 ;HL=HL*BC EXT_INSTR = $8D46 ;Execute du code placé dans un buffer sans qu'aucun programmes ne soit lancé ;HL=adresse des instructions à déplacer ;DE=adresse du buffer où sera executé les instructions ;BC=taille des instructions INIT_LIBRARY = $8D49 ;Initialise une librairie ;entrée: ;DE->pointe vers le nom (chaine terminée par un zero) de la librairie (8 lettres au max) ;sortie; ;A=1 librairie initialisée correctement ;A=0 echec de l'initialisation de la librairie STOP_LIBRARY = $8D4C ;A=Numéro de la lib à désinitialiser CP_STRING = $8D4F ;Compare 2 chaines de caractères ;entrée: ;HL->chaine 1 (terminée par un 0) ;DE->chaine 2 (terminée par un 0) ;C=0 la chaine pointée par HL est écrite à l'endroit ;C=1 la chaine pointée par HL est écrite à l'envers ;sortie: ;A=1 - mêmes chaines ;A=0 - chaines différentes ;B=Nombre de lettres testées CALL_HL = $8D69 ;CALL HL ;Ports: ;------ P_LINK = $00 P_KEYBOARD = $01 P_ROM = $02 P_STATUS = $03 P_INT = $04 P_LCD_CON = $10 P_LCD_DATA = $11 ;Touches: ;-------- G_NONE = $00 G_DOWN = $01 G_LEFT = $02 G_RIGHT = $03 G_UP = $04 G_ENTER = $09 G_PLUS = $0A G_MINUS = $0B G_TIMES = $0C G_DIV = $0D G_CARROT = $0E G_CLEAR = $0F G_NEG = $11 G_3 = $12 G_6 = $13 G_9 = $14 G_PARENR = $15 G_TAN = $16 G_VARS = $17 G_PERIOD = $19 G_2 = $1A G_5 = $1B G_8 = $1C G_PARENL = $1D G_COS = $1E G_PRGM = $1F G_STAT = $20 G_0 = $21 G_1 = $22 G_4 = $23 G_7 = $24 G_COMMA = $25 G_SIN = $26 G_MATRIX = $27 G_XTO = $28 G_ON = $29 G_STO = $2A G_LN = $2B G_LOG = $2C G_SQR = $2D G_INVE = $2E G_MATH = $2F G_ALPHA = $30 G_GRAPH = $31 G_TRACE = $32 G_ZOOM = $33 G_WINDOW = $34 G_YEDIT = $35 G_2ND = $36 G_MODE = $37 G_DEL = $38 K_RIGHT = 1 ; RIGHT RIGHT K_LEFT = 2 ; LEFT LEFT K_UP = 3 ; UP UP K_DOWN = 4 ; DOWN DOWN K_ENTER = 5 ; ENTER ENTER K_CLEAR = 6 ; CLEAR CLEAR K_DEL = 7 ; DEL DEL K_INS = 8 ; DEL INS K_RCL = 9 ; STO> RCL K_ENTRY = 10 ; ENTER ENTRY K_BOL = 11 ; LEFT BOL K_EOL = 12 ; RIGHT EOL K_PRGM = 45 ; PRGM PRGM K_ZOOM = 46 ; ZOOM ZOOM K_DRAW = 47 ; PRGM DRAW K_PLOT = 48 ; Y= STAT PLOT K_MATH = 49 ; MATH MATH K_TEST = 50 ; MATH TEST K_VARS = 52 ; VARS VARS K_MEM = 53 ; + MEM K_MATRIX = 54 ; MATRIX MATRIX K_STAT = 55 ; STAT STAT K_Y-VARS = 56 ; VARS Y-VARS K_ANGLE = 57 ; MATRIX ANGLE K_LIST = 58 ; STAT LIST K_CALC = 59 ; TRACE CALC K_QUIT = 64 ; MODE QUIT K_LINK = 65 ; X,T,theta LINK K_GRAPH = 69 ; GRAPH GRAPH K_MODE = 70 ; MODE MODE K_WINDOW = 73 ; WINDOW WINDOW K_YEDIT = 74 ; Y= Y= K_TABLE = 75 ; GRAPH TABLE K_TBLSET = 76 ; WINDOW TblSet K_TRACE = 93 ; TRACE TRACE K_PLUS = 129 ; + + K_MINUS = 130 ; - - K_TIMES = 131 ; * * K_DIV = 132 ; / / K_POWER = 133 ; ^ ^ K_LPAREN = 134 ; ( ( K_RPAREN = 135 ; ) ) K_LBRACK = 136 ; * [ K_RBRACK = 137 ; - ] K_STO = 139 ; STO> STO> K_COMMA = 140 ; , , K_NEG = 141 ; (-) (-) K_PERIOD = 142 ; . . K_0 = 143 ; 0 0 K_1 = 144 ; 1 1 K_2 = 145 ; 2 2 K_3 = 146 ; 3 3 K_4 = 147 ; 4 4 K_5 = 148 ; 5 5 K_6 = 149 ; 6 6 K_7 = 150 ; 7 7 K_8 = 151 ; 8 8 K_9 = 152 ; 9 9 K_EE = 153 ; , EE K_SEMI = 154 ; 0 ; K_A = 155 ; MATH A K_B = 156 ; MATRIX B K_C = 157 ; PRGM C K_D = 158 ; X^-1 D K_E = 159 ; SIN E K_F = 160 ; COS F K_G = 161 ; TAN G K_H = 162 ; ^ H K_I = 163 ; X^2 I K_J = 164 ; , J K_K = 165 ; ( K K_L = 166 ; ) L K_M = 167 ; / M K_N = 168 ; LOG N K_O = 169 ; 7 O K_P = 170 ; 8 P K_Q = 171 ; 9 Q K_R = 172 ; * R K_S = 173 ; LN S K_T = 174 ; 4 T K_U = 175 ; 5 U K_V = 176 ; 6 V K_W = 177 ; - W K_X = 178 ; STO> X K_Y = 179 ; 1 Y K_Z = 180 ; 2 Z K_XTO = 181 ; X,T,theta X,T,theta K_PI = 182 ; ^ Pi K_INVERSE = 183 ; X^-1 X^-1 K_SIN = 184 ; SIN SIN K_ASIN = 185 ; SIN SIN^-1 K_COS = 186 ; COS COS K_ACOS = 187 ; COS COS^-1 K_TAN = 188 ; TAN TAN K_ATAN = 189 ; TAN TAN^-1 K_SQR = 190 ; X^2 X^2 K_SQRT = 191 ; X^2 SQRT K_LN = 192 ; LN LN K_EX = 193 ; LN e^X K_LOG = 194 ; LOG LOG K_TENP = 195 ; LOG 10^X K_ANS = 198 ; (-) ANS K_COLON = 199 ; . : K_QUEST = 203 ; (-) ? K_QUOTE = 204 ; + " K_THETA = 205 ; 3 THETA K_LBRACE = 237 ; ( { K_RBRACE = 238 ; ) } K_ABS = 244 ; X^-1 ABS K_L1 = 245 ; 1 L1 K_L2 = 246 ; 2 L2 K_L3 = 247 ; 3 L3 K_L4 = 248 ; 4 L4 K_L5 = 249 ; 5 L5 K_L6 = 250 ; 6 L6 K_n = 251 ; 9 n K_Vn1 = 252 ; 8 Vn-1 K_Un1 = 253 ; 7 Un-1 ;Multiple définitions ;-------------------- KHAND = KEY_HAND CR_KHAND = KHAND CR_GRBCopy = GRB_COPY ;Macros ;------ #Define PRINTN(a,b) LD HL,a\ LD (CURSOR_POS),HL\ LD HL,b\ ROM_CALL(D_ZT_STR) #Define PRINTM(a,b) LD HL,a\ LD (GRAF_CURS),HL\ LD HL,b\ ROM_CALL(D_ZM_STR) #Define PRINTN2(a,b) LD HL,a\ LD (CURSOR_POS),HL\ LD HL,b\ ROM_CALL(D_LT_STR) #Define PRINTM2(a,b) LD HL,a\ LD (GRAF_CURS),HL\ LD HL,b\ ROM_CALL(D_LM_STR) #DEFINE ROM_CALL(addr) CALL $8D74 \ .DW addr ;Créer un buffer sans tester s'il y a assez de mémoire #Define CREATEBUFFER(Taille,AdresseBuffer) ROM_CALL(DEL_TMP)\ LD HL,Taille\ LD DE,AdresseBuffer\ ROM_CALL(INSERT_MEM)\ ROM_CALL(CREATE_TMP) ;Créer un buffer s'il y a assez de mémoire, quitte sinon (ret) #Define CREATEBUFFERANDTESTMEM1(Taille,AdresseBuffer) ROM_CALL(DEL_TMP)\ LD HL,Taille\ ROM_CALL(MEM_FREE)\ JR NC,AssezDeMem\ ROM_CALL(CREATE_TMP)\ RET\AssezDeMem:\ LD HL,Taille\ LD DE,AdresseBuffer\ ROM_CALL(INSERT_MEM)\ ROM_CALL(CREATE_TMP) ;Créer un buffer s'il y a assez de mémoire, saute à LabelPasAssezdeMem sinon #Define CREATEBUFFERANDTESTMEM2(Taille,AdresseBuffer,LabelPasAssezdeMem) ROM_CALL(DEL_TMP)\ LD HL,Taille\ ROM_CALL(MEM_FREE)\ JR NC,AssezDeMem\ ROM_CALL(CREATE_TMP)\ JR LabelPasAssezdeMem\AssezDeMem:\ LD HL,Taille\ LD DE,AdresseBuffer\ ROM_CALL(INSERT_MEM)\ ROM_CALL(CREATE_TMP) ;Détruit le buffer qu'on a alloué #Define DELBUFFER(Taille,AdresseBuffer) ROM_CALL(DEL_TMP)\ LD DE,Taille\ LD HL,AdresseBuffer\ ROM_CALL(DEL_MEM)\ ROM_CALL(CREATE_TMP) START_ADDR = $9445 .ORG START_ADDR .END