; -------- ; LOXLEY ; -------- ; ; (C) 2022 ARIEL RUIZ PARA WORLD XXI SOFT INC. ; ; DOCUMENTO ANEXO AL CODIGO FUENTE ; -------------------------------- ; ; LOXLEY ES UN JUEGO REALIZADO EN BASIC INTERPRETADO (PURO) CON LLAMADAS A LA ROM. ; NO CONTIENE EJECUCION DE CODIGO MAQUINA EN LA RAM (REGISTRO PC NO SALE DEL RANGO ; #0000-#3FFF). A CONTINUACION SE EXPLICAN LOS ASPECTOS MAS DESTACADOS DE LA ; PROGRAMACION DEL JUEGO. ; ;****************************************************************************** ; PSEUDO-COMANDOS A TRAVES DE PRINT ;****************************************************************************** ; ; LA VARIABLE DE SISTEMA ERR-SP ESTA RETOCADA PARA QUE APUNTE AL GESTOR DE PILA ; (LX_ERRSP) CADA VEZ QUE SE PRODUZCA UN ERROR BASIC. ; ; ESTE GESTOR DE PILA NO ES MAS QUE UNA SERIE DE PALABRAS (WORD, NUMEROS DE 16 BITS ; COLOCADOS EN DOS BYTES CADA UNO) QUE REPRESENTAN DIRECCIONES DE LA ROM A LAS ; QUE EL Z80 SALTA CUANDO SE ENCUENTRA CON UN "RET". CADA VEZ QUE SE ENCUENTRA ; UN "RET", LO QUE HACE EL Z80 ES LEER LA PALABRA DIRECCIONADA POR EL REGISTRO SP ; Y COLOCARLA EN PC (SIMILAR A UN "POP PC"), INCREMENTANDO EL REGISTRO SP EN DOS. ; (SP=SP+2). DE ESTA FORMA, SE PUEDEN ENCADENAR LLAMADAS A LA ROM PROVEYENDO ; SOLO UNA LISTA DE DIRECCIONES DE SALTO DENTRO DE LA ROM, SIN UTILIZAR ; CODIGO MAQUINA (CALL, JP, JR, RST) EN RAM. ; ; UNO DE LOS ERRORES QUE ES ADMINISTRADO ES EL "INVALID COLOUR" ; ; LAS CADENAS PRINT ESTAN PREPARADAS PARA ENVIAR PSEUDO-COMANDOS AL GESTOR DE PILA ; EJEMPLO: PRINT "°LSE°PAG°016°GAB°DXY°004°004°CLD°ANI°LX_RITAB°SPR°FIN"; ; PRINT "|020|135|016|143|133|004|004|131|128|192|0185|129|136"; ; ; EL PRIMER BYTE DENTRO DE LA CADENA CORRESPONDE A UN CARACTER DE CONTROL DE ; INVERSE (20), QUE NORMALMENTE REQUIERE ESTAR SEGUIDO DE VALORES 0,1 O 9. ; CUALQUIER OTRO VALOR PRODUCE EL ERROR "INVALID COLOUR" QUE ES INTERCEPTADO ; POR EL GESTOR DE PILA. ; ; ESTE GESTOR DE PILA ESTA PREPARADO PARA RECONOCER EL "INVALID COLOUR" Y ; REACCIONAR FRENTE A LOS PSEUDO-COMANDOS QUE VIENEN A CONTINUACION. ; ; LA LISTA DE PSEUDO-COMANDOS ES: ; ; LSE = $14 = INVOCA GESTOR (Loxley Sprite Engine) ; ANI = $80 = INCREMENTA CONTADOR DE ANIMACION DEL SPRITE SEGUN TABLA SUBSIGUIENTE ; SPR = $81 = DIBUJA SPRITE CON MASCARA EN PANTALLA PRINCIPAL ($4000), ; CON FONDO DE PANTALLA DE DECORADO ($A000) ; RLE = $82 = DIBUJA UNA PANTALLA (DECORADO). EN LA INTRO, DIBUJA UN CUADRO DE VIDEO ; CLD = $83 = DETECCION COLISIONES ; DIR = $84 = INDICA DIRECCION DEL SPRITE ; DXY = $85 = INDICA DIMENSIONES SPRITE ; LOC = $86 = INDICA COORDENADAS SPRITE ; PAG = $87 = CAMBIA PAGINA 128K ; FIN = $88 = SALE DEL GESTOR DE PILA ; ESC = $89 = DETECTA ESCALERA ; FLE = $8A = DIBUJA FLECHA, DETECTA COLISIONES O BORDE ; SPO = $8B = DIBUJA SPRITE EN LA PANTALLA DE FONDO ($A000) ; LDI = $8C = REALIZA UN LDIR (COPIA DE BLOQUE DE BYTES) ; SPD = $8D = DIBUJA SPRITE EN PANTALLA PRINCIPAL CON FONDO DE PANTALLA PRINCIPAL ; CLE = $8E = DETECTA COLISION POR PARTE DE UN ENEMIGO (VIBORA, MURCIELAGO, AVISPA) ; GAB = $8F = INDICA COORDENADAS SPRITES SEGUN VARIABLES A Y B+ ; COP = $90 = COPIA UN AREA DESDE PANTALLA DE FONDO HACIA PANTALLA PRINCIPAL ; SND = $91 = SONIDO DIGITAL ; MUS = $92 = REPRODUCE UNA NOTA DE UNA MELODIA ; AYS = $93 = SONIDO CON REGISTROS AY ; CLX = $94 = DETECCION COLISIONES EXTENDIDA ; CLI = $95 = BORRA PARAMETROS DE COLISION Y REALIZA UN CLX ; PJP = $96 = INDICA UNA NUEVA DIRECCION DE CARACTERES A IMPRIMIR ; POK = $97 = POKE ; ; EN EL EJEMPLO: ; PRINT "°LSE°PAG°016°GAB°DXY°004°004°CLD°ANI°LX_RITAB°SPR°FIN"; ; ; SE INICIALIZA EL GESTOR (LSE) ; SE COLOCA PAGINA 0 CON ROM 1 (PAG,016), ; SE LEEN LAS VARIABLES A Y B (GAB) Y SE EFECTUA UN "AT" (COORDENADAS DE SPRITE) ; SE ESPECIFICAN LAS DIMENSIONES DEL SPRITE 4X4 CARACTERES (DXY,004,004) ; SE DETECTAN COLISIONES (CLD) ; SE CAMBIAN LOS PUNTEROS DE ANIMACION SEGUN TABLA LX_RITAB (ANI,LX_RITAB) ; SE PINTA EL SPRITE EN PANTALLA PRINCIPAL CON FONDO DE PANTALLA DE DECORADO (SPR) ; SE TERMINA LA GESTION DE SPRITES (FIN) ; ; ; A CONTINUACION, SE DETALLAN LAS PSEUDORUTINAS MAS IMPORTANTES DEL JUEGO, ; ES DECIR, SPR, RLE (DECORADO Y VIDEO), SON Y MUS ; LAS OTRAS PSEUDORUTINAS CONTIENEN EL MISMO RACIONAL ; SE DETALLA CODIGO ENSAMBLADOR PARA EXPLICAR LA OPERACION, RECORDANDO QUE ; EL CODIGO MAQUINA CORRESPONDIENTE SE ENCUENTRA EN LA ROM. ; ; ;****************************************************************************** ; PSEUDO-RUTINAS DE SPRITES CON MASCARA ;****************************************************************************** ; - ESTE ES EL NUCLEO DE LA PSEUDO-RUTINA DE IMPRESION DE SPRITES CON MASCARA ; - ESTA SITUADO EN LAS PRIMERAS POSICIONES DE LA PAGINA 0 Y PAGINA 6 (CLONADO) YA QUE ; EN ESAS PAGINAS TAMBIEN ESTAN LOS SPRITES. ; - LA IDEA ES TOMAR LA MASCARA DESDE PAG0 O PAG6, AND CON EL DECORADO EN $A000, ; LUEGO XOR CON EL GRAFICO Y POR ULTIMO PINTAR EN PANTALLA $4000 ; - TAMBIEN SE UTILIZA PARA PINTAR EN EL DECORADO ($A000), Y PARA TOMAR COMO DECORADO LA PANTALLA $4000. ; ESTO SE HACE POKEANDO LAS DIRECCIONES Y OPERADORES EN LA PROPIA RUTINA LX_SPRITE ; - DEBE LLAMARSE CON LA DIRECCION DEL SPRITE COLOCADA EN CHARS (23606) Y CON LAS COORDENADAS ; EN SPOSN (23688) Y DFCC (23684). TAMBIEN, CON LAS DIMENSIONES DEL SPRITE EN SPRDIMXYP (23317) LX_SPRITE ; ESTO ES PARA SELECCIONAR ENTRE IMPRIMIR EN PANTALLA DECORADO O EN LA PANTALLA ; PRINCIPAL, Y QUE ESTA SELECCION AFECTE TANTO A LA IMPRESION DEL PERSONAJE ; COMO TAMBIEN A LOS CARACTERES VACIOS QUE LO RODEAN. DW $1A45,LX_ORIDES,LX_ORIDESSK ,$16F9 ; POP HL,DE, (HL)>(DE) DW $1A45,LX_ORIORI,LX_ORIORISK ,$16F9 ; POP HL,DE, (HL)>(DE) ; DW $1A45,LISTSP,LX_SPR_BUK ; POP HL,DE | PREPARA BUCLE, CARGA LISTSP (23615) CON ; | LA DIRECCION DEL BUCLE DE IMPRESION DE SPRITES DW $1118 ; (HL) ,DE | PARA PODER ITERAR HASTA IMPRIMIR TODOS LOS CARACTERES DW $1A45, SPRDIMXYP, SPRDIMXYC ; POP HL,DE | COPIA LAS DIMENSIONES DEL SPRITE HACIA LOS CONTADORES DW $16F9 ; (HL)>(DE) | X E Y DEL BUCLE DE IMPRESION DW $10A6,CHARS ; POP HL | TOMA EL VALOR EN CHARS (23606) QUE CONTIENE LA DIRECCION DW $2AF0 ; (HL)>DE | DEL SPRITE A DIBUJAR Y LO DEJA EN "DE" DW $3447,$2BEF,$3447 ; EX DE,HL: | DECREMENTA "DE" PORQUE DESPUES SE INCREMENTARA ANTES DE COPIAR ; DEC HL: | EL PRIMER BYTE ; EX DE,HL ; ENTRADA AL BUCLE PRINCIPAL DE IMPRESION SPRITE CON MASCARA ; DE= DIR SPRITE LX_SPR_BUK ; EN ESTE BLOQUE SE VERIFICA SI HAY UN CARACTER VACIO ALREDEDOR DEL PERSONAJE A IMPRIMIR ; SI ES ASI, HAY QUE IMPRIMIR SOLO EL DECORADO. ASI SE AHORRA MEMORIA DE ALMACENAMIENTO ; DEL SPRITE (LOS CARACTERES VACIOS NO ESTAN ALMACENADOS, SOLO TIENEN UN CODIGO EN SU LUGAR) DW $16AD ; EX DE,HL: INC HL DW $16AE ; INC HL DW $1984 ; LD A,(HL): DEC HL: CP C DW $2BEF ; DEC HL DW $168D ; EX DE,HL DW $2994 ; INC A DW $10A6 ; POP HL:RET DW LX_SPR_SKIPC ; SALTA PARA IMPRIMIR SOLO DECORADO DW $102E ; RET NZ: LD SP,HL ; AQUI SE CALCULA LA DIRECCION DE LA PANTALLA DONDE SE VA A IMPRIMIR EL SPRITE DW $0B0D ; FETCH HL=(DFCC) DW $0E98 ; B,H: C,L DW $16AE ; INC HL DW $0AEC ; POSTORE DW $1734 ; DEC HL DW $05DF ; LD A,H DW $0361, $0361, $0361 ; ADD A,$20,$40,$60 LX_ORIDES DW $0EAA ; LD H,A LX_ORIORI DW $0E9A ; (APUNTA A UN RET) ; A PARTIR DE AQUI ; HL= DIR EN PANTALLA DECORADO ($A000=PANTFONDO) ; BC= DIR EN PANTALLA PRINCIPAL ($4000) DW $007B ; LD A,(HL) | TOMA PANTALLA DECORADO DW $16AD ; EX DE,HL: INC HL | INTERCAMBIO DE Y HL, INCREMENTA PUNTERO SPRITE DW $0C84 ; AND (HL) | AND ENTRE FONDO Y MASCARA DW $16AE ; INC HL | INCREMENTA PUNTERO SPRITE DW $1F52 ; XOR (HL) | XOR CON EL GRAFICO DW $168D ; EX DE,HL | INTERCAMBIO DE Y HL DW $1E83, $035F ; LD (BC),A: INC B | CARGA EN PANT PRINCIPAL, INCREM. DIR. MAS SIGNIFICATIVA DW $23A2 ; INC H | INCREMENTA DIR. MAS SIGNIFICATIVA PANT. DECORADO ; AQUI REPITE ESTAS MISMAS OPERACIONES SIETE VECES MAS PARA CADA UNO DE LOS SCANS DEL CARACTER DW $007B,$16AD,$0C84,$16AE,$1F52,$168D,$1E83,$035F,$23A2 DW $007B,$16AD,$0C84,$16AE,$1F52,$168D,$1E83,$035F,$23A2 DW $007B,$16AD,$0C84,$16AE,$1F52,$168D,$1E83,$035F,$23A2 DW $007B,$16AD,$0C84,$16AE,$1F52,$168D,$1E83,$035F,$23A2 DW $007B,$16AD,$0C84,$16AE,$1F52,$168D,$1E83,$035F,$23A2 DW $007B,$16AD,$0C84,$16AE,$1F52,$168D,$1E83,$035F,$23A2 DW $007B,$16AD,$0C84,$16AE,$1F52,$168D,$1E83 ; AL TERMINAR, TIENE QUE ACTUALIZAR LOS CONTADORES Y VERIFICAR SI TERMINÓ DE IMPRIMIR TODOS ; LOS CARACTERES QUE COMPONEN EL SPRITE LX_SPRRETSK DW $10A6 ; POP HL: DW SPRDIMXYC DW $1731 ; LD C,(HL): INC HL :LD B,(HL): DEC HL DW $1B6D ; DEC B DECREMENTA CONTADOR X DW $16FD ; LD (HL),C: INC HL: LD (HL),B ; SI NO EL CONTADOR X NO ES CERO, EJECUTA EL BUCLE (LX_SPR_BUK) NUEVAMENTE ; HASTA IMPRIMIR TODA LA FILA DE CARACTERES DW $1FC6 ; POP HL: RET Z :JP HL DW $0C7D ; SP,(LISTSP) ; SI LLEGO A CERO SIGNIFICA QUE SE TERMINO DE IMPRIMIR UNA FILA ; Y HAY QUE VER SI DEBEN IMPRIMIRSE MAS FILAS ABAJO ; PRIMERO RECUPERA DIMENSION X DEL SPRITE Y LA COLOCA COMO CONTADOR X DW $10A6 ; POP HL: DW SPRDIMXYP+1 DW $1733 ; LD B,(HL): DEC HL ; DECREMENTA CONTADOR Y ; Y GUARDA LOS CONTADORES EN MEMORIA DW $0BD0 ; DEC C: INC HL DW $10A6 ; POP HL: DW SPRDIMXYC DW $16FD ; LD (HL),C: INC HL: LD (HL),B ; SI EL CONTADOR Y LLEGO A CERO SIGNIFICA QUE TERMINAMOS DE IMPRIMIR EL SPRITE ; Y RETORNA AL GESTOR DEL LOXLEY SPRITES ENGINE (LSE) DW $10A6 ; POP HL:RET DW LX_K_SPRTBUK1 ; DW $102E ; RET NZ: LD SP,HL: RET ; SI NO, HAY QUE MOVER EL PUNTERO DE IMPRESION PARA IMPRIMIR LA PROXIMA FILA DW $0F8D ; LD (KCUR),DE DW $0B09 ; FETCH DW $1B6D ; DEC B DW $0E9B ; CL-ADDR DW $0DF4 ; CL-SET2 POSTORE FETCH DW $0F9C ; LD HL,(K-CUR) DW $168D ; EX DE,HL ; CIERRA BUCLE EN LX_SPR_BUK, POKEADO EN LISTSP DW $0C7D ; SP,(LISTSP) ; AQUI SE IMPRIME UN CARACTER DE DECORADO, SIN OPERAR CON EL GRAFICO. ; SIMILAR AL BUCLE DE IMPRESION CON MASCARA PERO MAS SIMPLE LX_SPR_SKIPC DW $16AD ; EX DE,HL: INC HL DW $16AE ; INC HL DW $168D ; EX DE,HL ; AVANZA DOS BYTES DW $0B0D ; FETCH HL=(DFCC) DW $0E98 ; B,H: C,L: RET DW $16AE ; INC HL DW $0AEC ; POSTORE DW $1734 ; DEC HL DW $05DF ; LD A,H DW $0361, $0361, $0361 ; ADD A,$20,$40,$60 LX_ORIDESSK DW $0EAA ; LD H,A LX_ORIORISK DW $0E9A ; (APUNTA A UN RET) DW $007B ; LD A,(HL) DW $1E83, $035F ; LD (BC),A : INC B DW $23A2 ; INC H DW $007B,$1E83,$035F,$23A2 DW $007B,$1E83,$035F,$23A2 DW $007B,$1E83,$035F,$23A2 DW $007B,$1E83,$035F,$23A2 DW $007B,$1E83,$035F,$23A2 DW $007B,$1E83,$035F,$23A2 DW $007B,$1E83 ; RETORNA PARA ANALIZAR EL SIGUIENTE CARACTER DEL SPRITE DW $10A6 ; POP HL:RET DW LX_SPRRETSK DW $102F ; LD SP,HL: RET ;****************************************************************************** ; PSEUDO-RUTINAS DE IMPRESION DE PANTALLAS ;****************************************************************************** ; - ESTE ES EL NUCLEO DE LA PSEUDO-RUTINA DE DESCOMPRESION RLE DE PANTALLAS. ; - CADA TILE MIDE 8X8 PIXELS (UN CARACTER) ; - DEBE LLAMARSE CON LA DIRECCION DE LA PANTALLA A DESCOMPRIMIR COLOCADA EN K-CUR (23643) Y CON LAS COORDENADAS ; EN SPOSN (23688) Y DFCC (23684). LX_SCRLE ; PRIMERO SE PRECALCULA EL PUNTERO DE PANTALLA Y ATRIBUTOS DW $0B09 ; FETCH DW $0CF6, $0800 ; POP BC DW $2A2A ; ADD HL,BC DW $0E88 ; FIND ATT=DE DW $168D ; EX DE,HL DW $0AFF ; (PRCC),HL DW $15FF ; EXX DW $0B20 ; HL,(PRCC) DW $15FF ; EXX ; TOMA DIRECCION DW $0F9C ; LD HL,(K-CUR) DW $2AEF ; INC HL: DE,(HL) DW $168D ; EX DE,HL ; HL= NUEVA DIRECCION DATOS ; TOMA NUEVO FONT DESDE LAS PRIMERAS DIRECCIONES DEL PAQUETE ; COMPRIMIDO DE LA PANTALLA Y LO COLOCA EN LX_TILEDIR DW $096E, LX_TILEDIR ; POP DE DW $16F9 ; (HL)>(DE) ; ALMACENA LA DIRECCION DE LOS DATOS COMPRIMIDOS DE LA PANTALLA DW $0F8C ; INC DE : (KCUR),DE ; ACTUALIZA PUNTERO PRINT DW $206E ; CP A