Nuevo proyecto Basic CoCo/Dragon/DP400

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 31 Ago 2017 02:27

Último mensaje de la página anterior:

Muy interesante lo que dices y me anima mucho más, imagina un solo sistemas para dragon y coco, que acepte todo esto, con las mejores ventajas de todos estos DOS y que se pueda quemar para cualquier equipo, sería lo mejor, sacariamos updates poco a poco, operativas y con cada número de versión aceptamos más periféricos y quitamos incompatibilidades, seria lo mejor.

Lo de terminar proyectos es relativo, mis sistemas nunca terminan (los que vendo) solo terminan hasta un punto, y aun recién salidos ya empiezo otra version, solo mejoran, dime tu, si windows o linux están listos, y te diré que nunca estarán terminados. solo se termina una versión hasta cierto punto.

Con respecto al proyecto, pongamos algunos puntos.
* Tengo que aprender como lo hace todo el basic, ya tengo una buena idea, pero siempre tuve una tranca en entender la generación del audio del cassette, un dia nos explayamos.
* Iré decodificando y planteando mejoras a cada comando o rutina, con estrategias concretas y espero que opineis para poder decidir.
* Tratare de hacer trozos claros para que los vayamos trabajando como hiciste en el HOBBIT.
* Tratare de ir guiando el camino a ver hasta dónde llegamos, y lo mas sensato seria (pienso yo), tener funcionando el compilado de los BASIC Actuales e ir modificando paso a paso, quedando operativos, claro siempre habrá que hacer cambios masivos los cuales habrá que planear, y ver su alcance para que tengan un principio y un fin.

Vere si puedo hacer todo esto con los mecanismos que me da el FORO, que al parecer se quedan cortos para hacer esquemas, hacer sub-proyectos y llevar quien hace que. pero tratare.

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 31 Ago 2017 04:03

RUTINA DE LECTURA DE TECLADO (KEYIN)($A1C1-$A244)
Esta versión de BASIC (la 1.2) posee una pequeña mejora con respecto a las anteriores (información no exacta), en la que al preguntar por una tecla el hace una pre lectura rápida para salir de la rutina si no hay teclas. Esa es la rutina ($A1C1-$A1CB). luego continúa con la (KEYIN)

Resumen
$A1C1 - $A1CB Pre Lectura rápida, si no hay teclas retorna, si hay teclas pasa a KEYIN (Esta rutina modifica ACCA)
$A1CB - $A22D KEYIN (Preserva U,X,B), engloba estas ruinas:
* $A1F2 - $A1FA Convierte las teclas en un número del 0 al 50
* $A1FB - $A22D Lo convierte en ASCII
$A22E - $A237 SubRutina para verificar el SHIFT (TEST FOR THE SHIFT KEY)
$A238 - $A26E lectura del teclado(READ THE KEYBOARD), Que contiene
* $A265 - $A26D Chequeo de la tabla de valores con shift y sin el (TABLE FOR EACH KEY - ONE SHIFTED, ONE NOT)
$A26E - $A280 CONTAB Tabla de códigos de algunas teclas con shift y sin el


El teclado se lee al escribir un cero(0) en cada bit que representan las columnas en PIA0+2 y luego lee las filas y la que tenga 0 es la tecla presionada. en un primer intento (si se usa la rutina LA1C1) pone a cero todas las columnas y verifica si hay alguna tecla presionada, sin importar mucho cual tecla es, tambien descarta el comparador de joystick que está en el bit 7 de PIA0, los botones de los Joysticks tambien cuentan como teclas, si lee solo unos, no hay tecla presionada ni botón y retorna.
Si en cambio si hay tecla, entonces pasa a la verdadera rutina de lectura de teclado, la (KEYIN)

Comencé haciendo un recorrido de la función, pero por ahora veré sus problemas y posibles mejoras.
Esta rutina es bastante larga y con cierta complejidad, hace un buen trabajo previniendo la repetición de teclas y resolviendo su valor, pero carece de la funcionalidad que necesitamos.
básicamente carece de:
* Repetición de teclas al dejarlas presionadas. (Se necesitaran los intervalos de tardanza al comienzo de la repetición y la velocidad de repetición).
* Sonido al presionar cada tecla, debido a que en los COCO1 las teclas no se sienten y no se sabe si ya se presiono la tecla.
* Leer el teclado por interrupciones y memorizar al menos 8 teclas. Con pitido de buffer lleno.
* Tal vez separar lo que es Scancode (matriz) y el valor final de la tecla (ya con shift y otras cosas)
* Tener soporte para códigos de dos o más teclas para acentos y ñ.
* Ojala tener algún soporte de hardware para encender capslook.
* Le faltan muchas teclas como el delete y escape, para estar cómodo, pero tenemos 4 teclas extra.

Código: Seleccionar todo

En la posición $0152 hay 8 bytes del buffer de teclado, pero no es para guardar 8 teclas, sino para ayudar a componer una tecla.

KEYIN comienza colocando todo a unos en el puerto de columnas PIA0+2.
* Luego rotando A introduciendo un cero 0 desde el carry con la instrucción ROL, va colocando ceros en cada columna(bits).
* También lleva un contador de veces en el stack.
* Luego lee en A el contenido de FF00 para ver qué filas están en cero,(tecla presionada), y pone la lectura en Stack+1.
* Hace un OR exclusivo (EXOA) entre A(valor recien leido de las filas) y el primer byte del buffer de teclado para ver qué tecla ha cambiado. [highlight=yellow]El problema que veo es que no se quien inicializó este buffer,[/highlight] (debe ser en el arranque, revisare), esto coloca en A unos donde las filas han cambiado de estado desde la última lectura.
* También hace un ANDA contra el mismo byte del buffer dejando cero en A si no hay movimientos en las filas
* Coloca el valor leído de filas en el buffer para guardar la nueva posición de las filas y avanza la posición para usar otro byte.
* Si no hay nuevas filas presionadas avanza a la siguiente columna.
* Sí no, guarda el valor de las columnas en el tercer bytes del stack (s+2).
* luego convierte el valor leído en un valor de 0 a 50, las posibles teclas
* Después lo convierte en ASCII
* previene las mayúsculas fijas y el shift además de los botones de los joysticks que forman parte del teclado

Continuará


Código actual de la función

Código: Seleccionar todo

0222         * THIS ROUTINE GETS A KEYSTROKE FROM THE KEYBOARD IF A KEY
0223         * IS DOWN. IT RETURNS ZERO TRUE IF THERE WAS NO KEY DOWN.
0224         *
0225   A1C1 7F FF 02   LA1C1   CLR   PIA0+2   CLEAR COLUMN STROBE
0226   A1C4 B6 FF 00      LDA   PIA0   READ KEY ROWS
0227   A1C7 43         COMA      COMPLEMENT ROW DATA
0228   A1C8 48         ASLA      SHIFT OFF JOYSTICK DATA
0229   A1C9 27 79      BEQ   LA244   RETURN IF NO KEYS OR FIRE BUTTONS DOWN
0230   A1CB 34 54   KEYIN   PSHS   U,X,B   SAVE REGISTERS
0231   A1CD CE FF 00      LDU   #PIA0   POINT U TO PIA0
0232   A1D0 8E 01 52      LDX   #KEYBUF   POINT X TO KEYBOARD MEMORY BUFFER
0233   A1D3 4F         CLRA      * CLEAR CARRY FLAG, SET COLUMN COUNTER (ACCA)
0234   A1D4 4A         DECA      * TO $FF
0235   A1D5 34 12      PSHS   X,A   SAVE COLUMN CTR & 2 BLANK (X REG) ON STACK
0236   A1D7 A7 42      STA   2,U   INITIALIZE COLUMN STROBE TO $FF
0237   A1D9 69 42   LA1D9   ROL   2,U   * ROTATE COLUMN STROBE DATA LEFT 1 BIT, CARRY
0238   A1DB 24 43      BCC   LA220   * INTO BIT 0 - BRANCH IF 8 SHIFTS DONE
0239   A1DD 6C 60      INC   ,S   INCREMENT COLUMN COUNTER
0240   A1DF 8D 59      BSR   LA23A   READ KEYBOARD ROW DATA
0241   A1E1 A7 61      STA   1,S   TEMP STORE KEY DATA
0242   A1E3 A8 84      EORA   ,X   SET ANY BIT WHERE A KEY HAS MOVED
0243   A1E5 A4 84      ANDA   ,X   ACCA=0 IF NO NEW KEY DOWN, <70 IF KEY WAS RELEASED
0244   A1E7 E6 61      LDB   1,S   GET NEW KEY DATA
0245   A1E9 E7 80      STB   ,X+   STORE IT IN KEY MEMORY
0246   A1EB 4D         TSTA      WAS A NEW KEY DOWN?
0247   A1EC 27 EB      BEQ   LA1D9   NO-CHECK ANOTHER COLUMN
0248   A1EE E6 42      LDB   2,U   * GET COLUMN STROBE DATA AND
0249   A1F0 E7 62      STB   2,S   * TEMP STORE IT ON THE STACK
0250         * THIS ROUTINE CONVERTS THE KEY DEPRESSION INTO A NUMBER
0251         * FROM 0-50 IN ACCB CORRESPONDING TO THE KEY THAT WAS DOWN
0252   A1F2 C6 F8      LDB   #$F8   TO MAKE SURE ACCB=0 AFTER FIRST ADDB #8
0253   A1F4 CB 08   LA1F4   ADDB   #$08   ADD 8 FOR EACH ROW OF KEYBOARD
0254   A1F6 44         LSRA      ACCA HAS THE ROW NUMBER OF THIS KEY - ADD 8 FOR EACH ROW
0255   A1F7 24 FB      BCC   LA1F4   GO ON UNTIL A ZERO APPEARS IN THE CARRY FLAG
0256   A1F9 EB 60      ADDB   ,S   ADD IN THE COLUMN NUMBER
0257         * NOW CONVERT THE VALUE IN ACCB INTO ASCII
0258   A1FB 27 48      BEQ   LA245   THE ‘AT SIGN’ KEY WAS DOWN
0259   A1FD C1 1A      CMPB   #26   WAS IT A LETTER?
0260   A1FF 22 46      BHI   LA247   NO
0261   A201 CA 40      ORB   #$40   YES, CONVERT TO UPPER CASE ASCII
0262   A203 8D 29      BSR   LA22E   CHECK FOR THE SHIFT KEY
0263   A205 BA 01 1A      ORA   CASFLG   * ‘OR’ IN THE CASE FLAG & BRANCH IF IN UPPER
0264   A208 26 02      BNE   LA20C   * CASE MODE OR SHIFT KEY DOWN
0265   A20A CA 20      ORB   #$20   CONVERT TO LOWER CASE
0266   A20C E7 60   LA20C   STB   ,S   TEMP STORE ASCII VALUE
0267   A20E BE 01 1B      LDX   DEBVAL   GET KEYBOARD DEBOUNCE
0268   A211 8D 9B      BSR   LA1AE
0269   A213 C6 FF      LDB   #$FF   SET COLUMN STROBE TO ALL ONES (NO
0270   A215 8D 21      BSR   LA238   STROBE) AND READ KEYBOARD
0271   A217 4C         INCA      = INCR ROW DATA, ACCA NOW 0 IF NO JOYSTICK
0272   A218 26 06      BNE   LA220   = BUTTON DOWN. BRANCH IF JOYSTICK BUTTON DOWN
0273   A21A E6 62   LA21A   LDB   2,S   GET COLUMN STROBE DATA
0274   A21C 8D 1A      BSR   LA238   READ A KEY
0275   A21E A1 61      CMPA   1,S   IS IT THE SAME KEY AS BEFORE DEBOUNCE?
0276   A220 35 12   LA220   PULS   A,X   REMOVE TEMP SLOTS FROM THE STACK AND RECOVER
0277         *               THE ASCII VALUE OF THE KEY
0278   A222 26 07      BNE   LA22B   NOT THE SAME KEY OR JOYSTICK BUTTON
0279   A224 81 12      CMPA   #$12   IS SHIFT ZERO DOWN?
0280   A226 26 04      BNE   LA22C   NO
0281   A228 73 01 1A      COM   CASFLG   YES, TOGGLE UPPER CASE/LOWER CASE FLAG
0282   A22B 4F      LA22B   CLRA   SET   ZERO FLAG TO INDICATE NO NEW KEY DOWN
0283   A22C 35 D4   LA22C   PULS   B,X,U,PC   RESTORE REGISTERS
0284
0285         * TEST FOR THE SHIFT KEY
0286   A22E 86 7F   LA22E   LDA   #$7F   COLUMN STROBE
0287   A230 A7 42      STA   2,U   STORE TO PlA
0288   A232 A6 C4      LDA   ,U   READ KEY DATA
0289   A234 43         COMA      *
0290   A235 84 40      ANDA   #$40   * SET BIT 6 IF SHIFT KEY DOWN
0291   A237 39         RTS      RETURN
0292
0293         * READ THE KEYBOARD
0294   A238 E7 42   LA238   STB   2,U   SAVE NEW COLUMN STROBE VALUE
0295   A23A A6 C4   LA23A   LDA   ,U   READ PIA0, PORT A TO SEE IF KEY IS DOWN
0296         *                A BIT WILL BE ZERO IF ONE IS
0297   A23C 8A 80      ORA   #$80   MASK OFF THE JOYSTICK COMPARATOR INPUT
0298   A23E 6D 42      TST   $02,U   ARE WE STROBING COLUMN 7?
0299   A240 2B 02      BMI   LA244   NO
0300   A242 8A C0      ORA   #$C0   YES, FORCE ROW 6 TO BE HIGH - THIS WILL CAUSE
0301         *             THE SHIFT KEY TO BE IGNORED
0302 A244 39      LA244   RTS      RETURN
0303
0304   A245 C6 33   LA245   LDB   #51   CODE FOR ‘AT SIGN’
0305   A247 8E A2 38   LA247   LDX   #CONTAB-$36   POINT X TO CONTROL CODE TABLE
0306   A24A C1 21      CMPB   #33   KEY NUMBER <33?
0307   A24C 25 16      BLO   LA264   YES (ARROW KEYS, SPACE BAR, ZERO)
0308   A24E 8E A2 1A      LDX   #CONTAB-$54   POINT X TO MIDDLE OF CONTROL TABLE
0309   A251 C1 30      CMPB   #48   KEY NUMBER >48?
0310   A253 24 0F      BHS   LA264   YES (ENTER,CLEAR,BREAK,AT SIGN)
0311   A255 8D D7      BSR   LA22E   CHECK SHIFT KEY (ACCA WILL CONTAIN STATUS)
0312   A257 C1 2B      CMPB   #43   IS KEY A NUMBER, COLON OR SEMICOLON?
0313   A259 23 02      BLS   LA25D   YES
0314   A25B 88 40      EORA   #$40   TOGGLE BIT 6 OF ACCA WHICH CONTAINS THE SHIFT DATA
0315         *                ONLY FOR SLASH,HYPHEN,PERIOD,COMMA
0316   A25D 4D      LA25D   TSTA   SHIFT   KEY DOWN?
0317   A25E 26 AC      BNE   LA20C   YES
0318   A260 CB 10      ADDB   #$10   NO, ADD IN ASCII OFFSET CORRECTION
0319   A262 20 A8      BRA   LA20C   GO CHECK FOR DEBOUNCE
0320   A264 58      LA264   ASLB   MULT   ACCB BY 2 - THERE ARE 2 ENTRIES IN CONTROL
0321         * TABLE FOR EACH KEY - ONE SHIFTED, ONE NOT
0322   A265 8D C7      BSR   LA22E   CHECK SHIFT KEY
0323   A267 27 01      BEQ   LA26A   NOT DOWN
0324   A269 5C         INCB   ADD   ONE TO GET THE SHIFTED VALUE
0325   A26A E6 85   LA26A   LDB   B,X   GET ASCII CODE FROM CONTROL TABLE
0326   A26C 20 9E      BRA   LA20C   GO CHECK DEBOUNCE
0327         *
0328         *
0329         * CONTROL TABLE UNSHIFTED, SHIFTED VALUES
0330   A26E 5E 5F   CONTAB   FCB   $5E,$5F   UP ARROW
0331   A270 0A 5B      FCB   $0A,$5B   DOWN ARROW
0332   A272 08 15      FCB   $08,$15   RIGHT ARROW
0333   A274 09 5D      FCB   $09,$5D   LEFT ARROW
0334   A276 20 20      FCB   $20,$20   SPACE BAR
0335   A278 30 12      FCB   $30,$12   ZERO
0336   A27A 0D 0D      FCB   $0D,$0D   ENTER
0337   A27C 0C 5C      FCB   $0C,$5C   CLEAR
0338   A27E 03 03      FCB   $03,$03   BREAK
0339   A280 40 13      FCB   $40,$13   AT SIGN


Avatar de Usuario
pser1
Mensajes: 2013
Registrado: 08 Dic 2012 18:34
Agradecido : 198 veces
Agradecimiento recibido: 181 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor pser1 » 31 Ago 2017 12:37

luiscoco escribió:Lo de terminar proyectos es relativo, mis sistemas nunca terminan (los que vendo) solo terminan hasta un punto, y aun recién salidos ya empiezo otra version, solo mejoran, dime tu, si windows o linux están listos, y te diré que nunca estarán terminados. solo se termina una versión hasta cierto punto.

El objetivo ha de ser FINALIZARLOS y como mucho aceptar sugerencias de usuarios para AÑADIR mejoras, aparte claro está que hay que CORREGIR
los errores que se vayan detectando.
Insisto en que SI SE DEFINE con anterioridad lo que DEBE hacer el programa, se puede cerrar el proyecto. Si no no es un proyecto!
Un error demasiado frecuente es ir modificando sobre la marcha lo que hará/debería hacer la aplicación en curso.
Los 'añadidos' a posteriori suelen crear problemas de implementación dando lugar a pequeños "windows" en crecimiento continuo -banghead
Respecto a Window$, mejor NO hablar, es la negación de un Proyecto! Si fueran serios, ya habrían desechado lo que tienen y habrían
hecho una nueva versión desde cero en lugar de ir parcheando lo imparcheable, es vergonzoso! Y la excusa es la retro-compatibilidad
o sea que todas las versiones futuras han de ser tan MALAS como las anteriores, solo les salva la velocidad de las CPUs que crece y crece!
Linux es otra historia, al ser libre, te puedes encontrar con demasiadas 'versiones' o distribuciones. Pero éste aumenta en base a aportaciones
de muchos usuarios/desarrolladores, trabajando en equipo.
De hecho los super-extra-proyectos son mamotretos que entran en otra categoría.
Los proyectos que yo he cerrado, han sufrido poquísimos cambios, mejoras sugeridas por usuarios y ahí están cerraditos y funcionando:
- DOSPlus50 extended que se monta en todas las unidades CoCo-SDC, fabricado por Ed Snider
- Orchestra90 para Dragón que se monta en CoCoDAC16, fabricado también por Ed Snider
- The Hobbit para CoCo/Dragón
- Una cantidad importante de mini aplicaciones para Drivewire para Dragón, llamadas DWEEBs, se pueden ver en:
http://archive.worldofdragon.org/phpBB3 ... f=5&t=4968
En fin, para mí, lo ideal sería crear mini proyectos pero con alguien que tuviera la visión global de todos ellos (previendo el resultado final)
Y considerar cada sub-proyecto 'cerrado' en cuanto a funcionalidades una vez se haya definido y empezado a programar!
Lo contrario lleva a trabajar en plan guerrilla, no me parece conveniente para temas importantes como lo que propones.
saludos
pere

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 31 Ago 2017 14:22

Bueno, puede hacerse como dices, una ves que estudie que bien el problema (el basic actual) y prevenga las soluciones por hacer, yo tengo la visión global que quiero, aunque aparecen cosas nuevas y ya que no está cuajado el proyecto, aún se pueden incorporar y tambien nos encontraremos con limitaciones que de no superarse o rodearse, habrá que suprimir del proyecto.

Voy a crear otro hilo para estas y otras discusiones para mantener algo más limpio el proyecto, en ese otro hilo te hago una pregunta técnica.

Por ahora voy viendo función por función que mejorar a cada una y las mejoras globales las haré en los primeros post.

Luego haré un resumen de lo que hay para ver el alcance del proyecto y discutir caminos.

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 31 Ago 2017 17:37

CONSOLE OUT

Esta rutina decide a donde va una salida de caracteres y elige entre pantalla, impresora o cassette
Consta de algunas subrutinas usables
$A282 - $A2A7 CONSOLE OUT, que incluye:
* $A290 - $A2A7 SEND TO CASSETTE
$A2A8 - $A2BE WRITE A BLOCK OF DATA TO TAPE
$A2BF - $A309 SOFTWARE UART TO LINE PRINTER
$A30A - $A34D PUT A CHARACTER ON THE SCREEN
$A34E - $A35D SCROLL THE SCREEN

CONSOLE OUT
* SEND TO CASSETTE

Código: Seleccionar todo

0341         * CONSOLE OUT
0342   A282 BD 01 67   PUTCHR   JSR   RVEC3   HOOK INTO RAM
0343   A285 34 04      PSHS   B   SAVE ACCB
0344   A287 D6 6F      LDB   DEVNUM   GET DEVICE NUMBER
0345   A289 5C         INCB      SET FLAGS
0346   A28A 35 04      PULS   B   RESTORE ACCB
0347   A28C 2B 31      BMI   LA2BF   SEND TO LINE PRINTER
0348   A28E 26 7A      BNE   LA30A   SEND TO SCREEN
0349         * SEND TO CASSETTE
0350   A290 34 16      PSHS   X,B,A   RESTORE REGISTERS
0351   A292 D6 78      LDB   FILSTA   GET FILE STATUS
0352   A294 5A         DECB      INPUT FILE?
0353   A295 27 0F      BEQ   LA2A6   YES, Exit
0354   A297 D6 79      LDB   CINCTR   TEMP CHAR CTR
0355   A299 5C         INCB      IS THE BUFFER FULL
0356   A29A 26 02      BNE   LA29E   NO
0357   A29C 8D 0A      BSR   LA2A8   YES, WRITE DATA BLOCK TO TAPE
0358   A29E 9E 7ª   LA29E   LDX   CINPTR   GET BUFFER POINTER
0359   A2A0 A7 80      STA   ,X+   PUT CHAR IN CASSETTE BUFFER
0360   A2A2 9F 7A      STX   CINPTR   STORE NEW BUFFER POINTER
0361   A2A4 0C 79      INC   CINCTR   INCR BYTE COUNT
0362   A2A6 35 96   LA2A6   PULS   A,B,X,PC

WRITE A BLOCK OF DATA TO TAPE
Escribe un bloque de datos en cassette (max 255? bytes)

Código: Seleccionar todo

0364         * WRITE A BLOCK OF DATA TO TAPE
0365   A2A8 C6 01   LA2A8   LDB   #1   DATA BLOCK TYPE - NOT A HEADER BLOCK
0366   A2AA D7 7C   LA2AA   STB   BLKTYP   BLOCK NUMBER
0367   A2AC 8E 01 DA      LDX   #CASBUF   CASSETTE BUFFER
0368   A2AF 9F 7E      STX   CBUFAD   STARTING ADDRESS
0369   A2B1 D6 79      LDB   CINCTR   GET NUMBER OF BYTES
0370   A2B3 D7 7D      STB   BLKLEN   BYTE COUNT
0371   A2B5 34 62      PSHS   U,Y,A   SAVE REGISTERS
0372   A2B7 BD A7 E5      JSR   LA7E5   WRITE A BLOCK ON TAPE
0373   A2BA 35 62      PULS   A,Y,U   RESTORE REGISTERS
0374   A2BC 7E A6 50      JMP   LA650   RESET BUFFER POINTERS

SOFTWARE UART TO LINE PRINTER
Rutina para imprimir por puerto serial a la impresora
Salva los registros X,B,A,CC incluido el estado de IRQ,FIRQ
Trasmite el carácter en "A" por serial a la impresora

Código: Seleccionar todo

0376         * SOFTWARE UART TO LINE PRINTER
0377   A2BF 34 17   LA2BF   PSHS   X,B,A,CC   SAVE REGISTERS AND INTERRUPT STATUS
0378   A2C1 1A 50      ORCC   #$50   DISABLE IRQ,FIRQ
0379   A2C3 F6 FF 22   LA2C3   LDB   PIA1+2   GET RS 232 STATUS
0380   A2C6 54         LSRB      SHIFT RS 232 STATUS BIT INTO CARRY
0381   A2C7 25 FA      BCS   LA2C3   LOOP UNTIL READY
0382   A2C9 8D 30      BSR   LA2FB   SET OUTPUT TO MARKING
0383   A2CB 5F         CLRB      *
0384   A2CC 8D 2F      BSR   LA2FD   * TRANSMIT ONE START BIT
0385   A2CE C6 08      LDB   #8   SEND 8 BITS
0386   A2D0 34 04   LA2D0   PSHS   B   SAVE BIT COUNTER
0387   A2D2 5F         CLRB      CLEAR DA IMAGE I ZEROES TO DA WHEN SENDING RS 232 DATA
0388   A2D3 44         LSRA      ROTATE NEXT BIT OF OUTPUT CHARACTER TO CARRY FLAG
0389   A2D4 59         ROLB      * ROTATE CARRY FLAG INTO BIT ONE
0390   A2D5 58         ASLB      * AND ALL OTHER BITS SET TO ZERO
0391   A2D6 8D 25      BSR   LA2FD   TRANSMIT DATA BYTE
0392   A2D8 35 04      PULS   B   GET BIT COUNTER
0393   A2DA 5A         DECB   SENT   ALL 8 BITS?
0394   A2DB 26 F3      BNE   LA2D0   NO
0395   A2DD 8D 1C      BSR   LA2FB   SEND STOP BIT (ACCB:0)
0396   A2DF 35 03      PULS   CC,A   RESTORE OUTPUT CHARACTER & INTERRUPT STATUS
0397   A2E1 81 0D      CMPA   #CR   IS IT CARRIAGE RETURN?
0398   A2E3 27 08      BEQ   LA2ED   YES
0399   A2E5 0C 9C      INC   LPTPOS   INCREMENT CHARACTER COUNTER
0400   A2E7 D6 9C      LDB   LPTPOS   CHECK FOR END OF LINE PRINTER LINE
0401   A2E9 D1 9B      CMPB   LPTWID   AT END OF LINE PRINTER LINE?
0402   A2EB 25 06      BLO   LA2F3   NO
0403   A2ED 0F 9C   LA2ED   CLR   LPTPOS   RESET CHARACTER COUNTER
0404   A2EF 8D 14      BSR   LA305   *
0405   A2F1 8D 12      BSR   LA305   * DELAY FOR CARRIAGE RETURN
0406   A2F3 F6 FF 22   LA2F3   LDB   PIA1+2   WAIT FOR HANDSHAKE
0407   A2F6 54         LSRB      CHECK FOR R5232 STATUS?
0408   A2F7 25 FA      BCS   LA2F3   NOT YET READY
0409   A2F9 35 94      PULS B,X,PC   RESTORE REGISTERS
0410   A2FB C6 02   LA2FB   LDB   #2   SET RS232 OUTPUT HIGH (MARKING)
0411   A2FD F7 FF 20   LA2FD   STB   DA   STORE TO THE D/A CONVERTER REGISTER
0412   A300 8D 00      BSR   LA302   GO WAIT A WHILE
0413   A302 9E 95   LA302   LDX   LPTBTD   GET BAUD RATE
0414   A304 8C 9E 97      FCB   SKP2   SKIP NEXT TWO BYTES
0415   A305 9E 97   LA305   LDX   LPTLND   PRINTER CARRIAGE RETURN DELAY
0416   A307 7E A7 D3      JMP   LA7D3   DELAY ON DECREMENTING X

PUT A CHARACTER ON THE SCREEN
Coloca un carácter que viene en "A" en la pantalla.
* Previene si es retroceso (backspace). Borrando el espacio bajo el cursor, retrocediendo la posición, solo si no está al principio de la pantalla
* Si es CR borra hasta el final de línea y se posiciona
* Si es minúscula la pasa a mayúscula, zona desde $40 a $60
* Previene si se necesita scroll.
Entrada:
Guarda los registros X,B,A

Código: Seleccionar todo

0418         * PUT A CHARACTER ON THE SCREEN
0419   A30A 34 16   LA30A   PSHS   X,B,A   SAVE REGISTERS
0420   A30C 9E 88      LDX   CURPOS   POINT X TO CURRENT CHARACTER POSITION
0421   A30E 81 08      CMPA   #BS   IS IT BACKSPACE?
0422   A310 26 0B      BNE   LA31D   NO
0423   A312 8C 04 00      CMPX   #VIDRAM   AT TOP OF SCREEN?
0424   A315 27 46      BEQ   LA35D   YES - DO NOT ALLOW BACKSPACE
0425   A317 86 60      LDA   #$60   BLANK
0426   A319 A7 82      STA   ,-X   PUT IN PREVIOUS POSITION
0427   A31B 20 27      BRA   LA344   SAVE NEW CURPOS
0428   A31D 81 0D   LA31D   CMPA   #CR   ENTER KEY?
0429   A31F 26 0E      BNE   LA32F   BRANCH IF NOT
0430   A321 9E 88      LDX   CURPOS   GET CURRENT CHAR POSITION
0431   A323 86 60   LA323   LDA   #$60   BLANK
0432   A325 A7 80      STA   ,X+   PUT IT ON SCREEN
0433   A327 1F 10      TFR   X,D   *
0434   A329 C5 1F      BITB   #$1F   * TEST FOR BEGINNING OF NEW LINE
0435   A32B 26 F6      BNE   LA323   PUT OUT BLANKS TILL NEW LINE
0436   A32D 20 15      BRA   LA344   CHECK FOR SCROLLING
0437   A32F 81 20   LA32F   CMPA   #SPACE   *
0438   A331 25 2A      BCS   LA35D   * BRANCH IF CONTROL CHARACTER
0439   A333 4D         TSTA      SET FLAGS
0440   A334 2B 0C      BMI   LA342   IT IS GRAPHIC CHARACTER
0441   A336 81 40      CMPA   #$40   *
0442   A338 25 06      BCS   LA340   * BRANCH IF NUMBER OR SPECIAL CHARACTER
0443   A33A 81 60      CMPA   #$60   UPPER/LOWER CASE?
0444   A33C 25 04      BCS   LA342   BRANCH IF UPPER CASE ALPHA
0445   A33E 84 DF      ANDA   #$DF   CLEAR BIT 5, FORCE ASCII LOWER CASE TO BE UPPER CASE
0446   A340 88 40   LA340   EORA   #$40   INVERT BIT 6, CHANGE UPPER CASE TO LOWER & VICE VERSA
0447   A342 A7 80   LA342   STA   ,X+   STORE CHARACTER TO SCREEN
0448   A344 9F 88   LA344   STX   CURPOS   SAVE CURRENT CHAR POSITION
0449   A346 8C 05 FF      CMPX   #VIDRAM+511   END OF SCREEN BUFFER?
0450   A349 23 12      BLS   LA35D   RETURN IF NO NEED TO SCROLL
0451   A34B 8E 04 00      LDX   #VIDRAM   TOP OF SCREEN

SCROLL THE SCREEN
Mueve la pantalla una linea arriba, borrando la última línea
Necesita la posición inicial en X como dato de entrada, normalmente $400 y un PUSH de X,B,A

Código: Seleccionar todo

0453         * SCROLL THE SCREEN
0454   A34E EC 88 20   LA34E   LDD   32,X   GET TWO BYTES
0455   A351 ED 81      STD   ,X++   MOVE THEM UP ONE ROW
0456   A353 8C 05 E0      CMPX   #VIDRAM+$1E0   AT THE LAST LINE?
0457   A356 25 F6      BCS   LA34E   NO
0458   A358 C6 60      LDB   #$60   BLANK
0459   A35A BD A9 2D      JSR   LA92D   BLANK LAST LINE
0460   A35D 35 96   LA35D   PULS   A,B,X,PC   RESTORE REGISTERS

Avatar de Usuario
pser1
Mensajes: 2013
Registrado: 08 Dic 2012 18:34
Agradecido : 198 veces
Agradecimiento recibido: 181 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor pser1 » 31 Ago 2017 18:54

Hola Luis,
si te propones ir listando trocitos de la ROM de Basic desensamblada ... va para largo el tema!
Supongo que te estás basando en el CoCo unravelled, que tiene *algunas* diferencias con Dragón
Por ejemplo el tema de teclado, las teclas están conectadas a columnas diferentes, así nos fastidian
si la lectura del teclado se hace a bajo nivel en lugar de usar la ROM (jsr [A000])
saludos
pere

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 31 Ago 2017 18:59

RUTINA PARA MANEJO DE TABS, SEGÚN EL DEVICE ($A35F - $A38B)
Toda esta rutina lo único que hace es setear los parámetros del ancho de los tabs, Zona de Tab (que es, la posición del último tab), el ancho a imprimir y la posición, según el Device a imprimir. Salvando X,B,A (que son los registros que utiliza)

Primero pone a cero un parámetro de las impresoras, un tal PRTDEV (no es el device donde se imprime) es una propiedad de la impresora para saber (0=No Cassette, -1=$FF=Cassette).
Luego según DEVNUM:
Si es 0=PANTALLA; toma la parte baja (2do byte) de la posición del cursor de pantalla, y desprecia la fila, solo toma en qué columna está.
Configurando: POS=fila, Ancho=32, TABs=16 y TAB Zone (ultimo Tab)=16.
Si es -1=cassette ; Setea el anterior PRTDEV a -1=$FF, Pone TABs=1, Zone TAB =0, Ancho=0 y POS=0 .
Si no, para todo lo demás (-2 incluido=Printer), pone, lo que está en LPTCFW-LPTCFW+1($99 -$9A) y LPTWID y LPTWID+1 ($9B-$9C); normalmente: TABs=16 y Zone Tabs=16, Ancho=132, Posición=0.

Esto tiene el siguiente problema, no permite parametrizar la pantalla ni el cassette, el cassette no importaría, pero si tenemos una pantalla de 52, 64 o 80 columnas ya no funciona.

Código: Seleccionar todo

0462         * SET UP TAB FIELD WIDTH, TAB ZONE, CURRENT POSITION
0463         * AND LINE WIDTH ACCORDING TO THE DEVICE SELECTED
0464   A35F BD 01 64   LA35F   JSR   RVEC2   HOOK INTO RAM
0465   A362 34 16      PSHS   X,B,A   SAVE REGISTERS
0466   A364 0F 6E      CLR   PRTDEV   RESET PRINT DEVICE NUMBER
0467   A366 96 6F      LDA   DEVNUM   GET DEVICE NUMBER
0468   A368 27 09      BEQ   LA373   BRANCH IF SCREEN
0469   A36A 4C         INCA      CHECK FOR CASSETTE
0470   A36B 27 17      BEQ   LA384   BRANCH IF CASSETTE
0471         * END UP HERE IF PRINTER
0472   A36D 9E 99      LDX   LPTCFW   TAB FIELD WIDTH AND TAB ZONE
0473   A36F DC 9B      LDD   LPTWID   PRINTER WIDTH AND POSITION
0474   A371 20 09      BRA   LA37C   SET PRINT PARAMETERS
0475         * SCREEN DISPLAY VALUES
0476   A373 D6 89   LA373   LDB   CURPOS+1   GET CURSOR LOC LS BYTE
0477   A375 C4 1F      ANDB   #$1F   KEEP ONLY COLUMN POSITION
0478   A377 8E 10 10      LDX   #$1010   TAB FIELD WIDTH AND LAST TAB ZONE
0479   A37A 86 20      LDA   #32   DISPLAY SCREEN LINE WIDTH
0480   A37C 9F 6A   LA37C   STX   DEVCFW   SAVE TAB FIELD WIDTH AND ZONE
0481   A37E D7 6C      STB   DEVPOS   SAVE PRINT POSITION
0482   A380 97 6D      STA   DEVWID   SAVE PRINT WIDTH
0483   A382 35 96      PULS   A,B,X,PC   RESTORE REGISTERS
0484   A384 03 6E   LA384   COM   PRTDEV   SET TO $FF FOR CASSETTE
0485   A386 8E 01 00 LDX #$0100 * TAB FIELD WIDTH = 1; ALL OTHER
0486   A389 4F         CLRA      * PARAMETERS = 0
0487   A38A 5F         CLRB      *
0488   A38B 20 EF      BRA   LA37C   SET PRINT PARAMETERS

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 31 Ago 2017 19:23

pser1 escribió:Hola Luis,
si te propones ir listando trocitos de la ROM de Basic desensamblada ... va para largo el tema!
Supongo que te estás basando en el CoCo unravelled, que tiene *algunas* diferencias con Dragón
Por ejemplo el tema de teclado, las teclas están conectadas a columnas diferentes, así nos fastidian
si la lectura del teclado se hace a bajo nivel en lugar de usar la ROM (jsr [A000])
saludos
pere

Si jeje, una locura, lo que intento es ver si hay zonas que se puedan mejorar o quitar para hacer espacio(que no creo que haya muchas), aunque he visto que hay varias rutinas de chequeo de BREAK dispersas, Zonas de BASIC que no se usan al entrar EXTENDED, y así, fijate que slo para BREAK CHCK hay 3 dependiendo si hay extended o disco y su versión $A549 $C859 $C8A9 BREAK CHECK
También trato de empaparme del tema, y usar estos trozos (cada mensaje) para mejorar o tocar esa rutina, no se bien aun
Lo de la compatibilidad aun no lo toco, pero te comento que si la idea es montar este basic en ROM y que funcione en todas las máquinas, entonces lo que debo es ver que maquina es y actuar según cual sea.

Ya pensé en que en la inicialización se revise qué máquina es, COCO 1 y 2 o si es COCO3/Dragon/DP400, por lo tanto tendré que hacer funcionar esta rutina es todos los equipos

Por ahora con un simple Byte en algún lado, rellenado en la secuencia de inicialización, podría ya tenernos dispuesto el equipo y sus características, algo como la BIOS.

Yo diria:
TIPO: un byte con la siguiente información:
1=COCO 1
2=COCO 2 aunque hay pocas diferencias o tal vez se requiera mas detalle
3=COCO 3
4=DRAGON Tal vez distinguiendo DRAGON 32 y 64
5=DP400
Tamaño de memoria: 2 bytes que indican cuántos bloques de 256 bytes hay, esto da para 16 mb, o 4 bytes para que nos indique directamente cuánta memoria hay, da para 4 gb, o en bloques de 256 daría para 1 TB, (A discutir)
OTROS PERIFERICOS COMO:
* Joysticks actualmente enchufados
* Discos
* Orchestra 90
* Joysticks de alta resolución
* Puerto paralelo
* MPI
* 6309

Para la controladora de disco: debe poder manejar todos los formatos, así que necesitará apoyo en algún lado, ROM Basic, Trozos en sistema operativo, ya veremos, podrías leer formato COCO en una unidad y grabar formato DRAGON en otra o NITROS. no habría problema.

También se podrán leer varios tipos de tokens de basic. serían más compatibles entre ellas.

Tratare de no hacer versiones para cada equipo, mientras pueda, odio que haya tantas versiones de NITROS, se que es mas eficiente pero tratare de otra forma lo más posible.

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 01 Sep 2017 07:36

OTROS BASIC PARA COCO
CBASIC III: de CER-COMP 5566 RICOCHET AVE . LAS VEGAS, NEVADA 89110
* Solo para COCO 3 con 128 o 512kb
* Copia en el programa compilado solo las funciones usadas sin necesidad de runtime
* Tiene RAMDISK
* Al escribir una línea y acercarse al final(250 letras), 10 letras antes del final, sonara un pitido, y al terminarse la linea subirá el tono
* Solo acepta numeros de linea de 4 letras?
* Es por numeros de linea (ya no me gusta)
* SIZE Enter cantidad de memoria, debería ser ?SIZE
* BRATE <value> PRINTER BAUD RATE COMMAND, se puede escribir abreviado BR
* LF Genera un Line feed
* RDELAY AUTOMATIC KEY REPEAT DELAY COMMAND: un número de 0 detiene las repeticiones, de 1 a 47 se aumenta el DELAY entre teclas, número 15 es lo normal, y la primera repetición es a los 2 segundos, no configurable, Ejemplo RD 5
* SCREEN WIDTH SW <value>, (Poco claro en sus parámetros)
1 = 32 (192)
2 = 40 (192)
3 = 64 (192)
4 = 80 (192)
5 = 32 (225)
6 = 40 (225)
7 = 64 (225)
8 = 80 (225)
* SCREEN COLOR SELECT: Syntax: SCREEN <Foreground> <Background> Ejemplo:
SC 63 0 <enter> BUff chars/Black Background
SC 18 O <enter> Green chars/Black Background
* CHANGE COLOR/MONOCHROME MODE: Syntax: CColor <enter> CC <enter> Change screen color
* SOLO INTEGER
* OVEREM Returns the Overflow results of a multiply or the Remainder of a Divide function . Valid immediatly after a multiply or divide only.
* BUTTON(expr) botones de los joysticks
* DPOKE
* GEN (como DATA)
Examples : GEN $BD,$A282,$CE,1024 (produces 6 bytes)
GEN 0040,$00,32767 (produces 4 bytes)
ON RESET GOTO 5000
PAUSE Statement
LPOKE & DLPOKE Statements
Syntax: LPOKE page#,offset,value *** Different from Basic
DLPOKE page#,offset,value *** Not available in Basic
LPEEK & DLPEEK Statements
Syntax : A=LPEEK(page#,offset) *** Different from Basic
A=DLPEEK(page#,offset)*** Not available in Basic
RAM64K Statement *** Not available in Basic Syntax: RAM64K page#
RAM ON/ OFF Statements Syntax : RAM <ON/OFF>
INKEY Statements syntax: INKEY <numeric var.> INKEY$ <string var.>
Printer & RS-232 Baud rate Statements Syntax : BRATE = baud rate PRATE = baud rate
PUTCHAR Statement
GETCHAR Statement

A DOS 3, un sustituto de DISK BASIC por Arthur Flexser, con las siguientes cualidades
• Repeat and edit of the last direct-mode command
• Control-key abbreviated entry of Basic commands
• Automatic line-number prompts for program entry
• Lowercase command entry, Works especially well with CoCo's equipped with a Lowerkit or PBJ WordPak
• DOS command for booting OS-9
• Error trapping (equivalent of ON ERROR GOTO)
• One or two-column directory, with free granules (screen or printer)
• ”COPY <filename> TO <drive number>” alternative form for the COPY command
• AE error (“file already exists”) override option for COPY and RENAME
• RUNM command loads and executes a machine-language program
• RAM command for ROM-to-RAM transfer (64K access)
• SCAN command lists ASCII files to screen or printer; gives start, end, and exec addresses for binary files
• PRT ON/OFF enables/disables routing of text output to printer as well as screen
• Mini-monitor provides hexadecimal memory examine and change capability
• PEEP command provides movable window for viewing memory contents
• High-resolution text screen driver included as a separate utility
• Customizing utilities (included) enable definition of control key abbreviations, printer baud rate, disk step rate, tracks per disk. Double sided drives are supported.
• ADOS is compatible with essentially 100% of commercial CoCo software. (Eliminates Disk Basic 1.1 compatibility headaches!)
**************************************************************
** AFTER ADOS HAS BEEN CUSTOMIZED, IT CAN BE BURNED INTO AN **
** EPROM CHIP THAT REPLACES THE DISK BASIC ROM IN THE DISK **
** CONTROLLER. THIS CAN BE DONE BY MAIL FOR ABOUT $20. **
**************************************************************


COMPILADORES
----------------------------------------------------------------------------------------------------------------------------------
MLBASIC

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 02 Sep 2017 11:55

DE DONDE TOMAR MEMORIA
Debido a que el proyecto es bastante grande, es posible que necesitemos mas de los 8k de basic, 8k Extended y 8 k de disco, Para la coco 1, 2, Dragon y DP400, se podría usar la zona $E000-FEFF, o por RAM o con modificaciones de Hardware por ROM, esto en un principio sería:

Si se usa este Basic por ROM: se usarían las zonas (no se si se puede usar un solo ROM de 16 o más o 2 ROMs de 8), $8000-$9FFF y $A000-$BFFF. Y para el ROM de disco $C000-$DFFF. luego por software se usará la parte $E000-$FEFF En RAM, esta parte se cargará desde disco, aunque podría ser reposicionante.

Si se usa el Basic en RAM sin quitar ROM: se usarían unos 32k desde $8000-$FEFF, dejando poco para basic grandes, pero ya veremos, ya que quedan muchas posibilidades, como toma de comandos desde el disco, estilo Nitros-9, Swap de memoria a disco, estilo windows, Etc.

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 02 Sep 2017 12:17

MEJORAS EN GRÁFICAS Y DE VÍDEO
En este mensaje colocare las posibles mejoras a la parte gráfica y serán indexadas en un índice en el primer POST.
Hasta ahora pensé lo siguiente.
* SPRITES COMPUTADOS, que ya ha código libre en la web, altamente eficiente, se estudiará en su momento.
* Resoluciones mixtas, muy buen invento de nuestro amigo Pser1.
* Scrolls listos: básicamente se usarían las instrucciones de rotación de bits de la CPU, un tipo inicial podría ser Shift de bytes (desde, hasta) de una línea gráfica, sin perder los bits, tal vez una zona cuadrada, o por medio de un for (que espero que sea muy eficiente).
* Scrolls más complejos como, usar varias pantallas gráficas, digamos 3, y ya en Assembler preparamos comandos para rotar la pantalla del medio usando la primera y 3ra pantalla como fuente de datos para los bits que entran o salen de la pantalla.
* Podríamos tener comandos de manejo de tiles, ya preparados para ser usados por cualquiera en juegos estilo Mario, Zelda y otros
* Textos para la Zona gráfica.
* Las funciones GET y PUT se pueden usar bastante, y tal vez unas mejoras les caerian bien, como una función SetGet que mida el gasto de memoria para GET, se podría usar un String en lugar de Arrays ya que pienso tenerlos de hasta 64kb, esta función o devolverá la cantidad de bytes necesarios o incluso modifica una variable String o Array para que cupiera el GET en cuestión.
* A las funciones GET y PUT, les faltan algún apoyo más, la zona de PUT generalmente hace falta memorizarla para usar esto como Sprites, pero no solo eso, mover Sprites requiere que se memoricen zonas en un orden y se solapan en otro además de tener funciones de colisión, no se si se lo dejaremos a los spriter computados todo esto, y dejemos los comandos GET y PUT como están o usemos los sprites computados dentro de estos comandos GET y PUT
* El comando PCLEAR y PCOPY podrían pasar de 8 paginas, pero me gustaria mas que la memoria gráfica estuviera después del basic como en otros equipos, así no se tendría que mover el basic, en cambio las pantallas al ser creadas por el programa, no deberían tener problemas de estar en otra dirección.
* Todos los modos Semigraficos.

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 02 Sep 2017 15:00

C/LOAD/M, C/SAVE/M
Carga/Graba un programa desde casete o disco
Al usar la "C" carga o graba desde y hacia el cassette, si no usa el disco
Al usar la "M" lo hace con programas en lenguaje de máquina
El colocar M para cargar lenguaje de máquina, parece superfluo, no se si se pueda implementar de forma automática, lo único que me frena, es que al saber si es lenguaje de máquina la extensión predeterminada cambia de "BAS" a "BIN", pero si colocas la extensión "BIN" tanto con "." como con "/" ya se asumirá "M"
La "C" de cassette no se puede obviar.

MEJORA 1
La "M" veamos: Al cargar de cassette no se usa extensión, así que el comando no sabrá cual rutina usar, pero yo pienso que si se lee la cabecera y el nombre es correcto debería poder cargar cualquiera tanto basic como LM, tambien carga Basic y Basic ASC sin ni siquiera preguntar.

Este cambio (leer cualquier archivo con CLOAD), no parece estorbar, permanece compatible, trataremos de implementarlo.
NOTA: Siempre habrá un byte con un comando para activar las mejoras y una función para preguntar su estado, al gusto del usuario.

Para CSAVE/M es más fácil aún ya que los parámetros para lenguaje de máquina son más numerosos y se puede asumir "M", aunque este escrito "CSAVE"
Entonces hay 2 formatos, en el segundo se puede obviar la "M", aun grabaria un assembler, tambien aún existiría CSAVEM.
CSAVE"NOMBRE",[A]
CSAVE"NOMBRE",start,end,load

Es poca mejora pero bueno

MEJORA 2
Otra mejora sería poder colocar tamaño(size) en lugar de end, pero no veo cómo indicarlo, tal vez poniendo un signo delante como #, esto indicaría que es Size y no end.

MEJORA 3
Auto-ejecución: usando CLOAD"NOMBRE",R se auto ejecuta, el RUN no se podría usar para cargar y ejecutar cassette a menos que existiera CRUN, no lo veo necesario.
El comando RUN si cargara y ejecutara pero de disco.

Rutina
CSAVE nombre[,A] ($A44C - $A497)
CLOAD/M nombre ($A498 - $A53D)

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 02 Sep 2017 19:15

CLS/PCLS/HCLS
CLS [valor]: Este comando borra la pantalla de texto, sin parámetros borra con color verde, y con un número de 0 a 8 la borra con ese color, a partir de 9 y hasta 255 Imprime MICROSOFT, y después da Error, llamada a función, ilegal (illegal function call), También da este error para números negativos.
Acepta números decimales usando la parte entera y se puede usar con paréntesis como CLS(2), si usted tiene esa costumbre.

MEJORA 1
Una mejora simpática seria que se pudiera usar cualquier carácter para borrar, asi seria, CLS 0-255, borraría con cualquier carácter, o si usamos el original, los números del 0 al 9 estarían ocupados para los colores, pero, se podrían usar los números negativos para los caracteres del 1 al 8, solo faltaria el 0, tambien se podrían usar los números después del 255 por ejemplo el 256 para el 0 y asi sucesivamente solo con el MÓDULO de 256, me parece ideal y sería compatible, no es muy usable, pero mejor que usar un FOR.
Para PCLS sería igual, 0-3 reservados para colores, y después serían bytes, efectos curiosos, no muy útiles.

MEJORA 2
Otra cosa que no tienen, es, desde, hasta, para el caso de PCLS hay programas que guardan y modifican los valores de BEGGRP y ENDGRP y luego los restauran, para poder borrar parcialmente la pantalla. pero si le mandamos el desde y el hasta, seria mas facil.
Para CLS serían posiciones estilo PRINT@ y para PCLS seria solo, linea desde, hasta, ya que si ponemos la coordenada X empezaria a mitad de linea y no me imagino el uso, además de que se complica, ya que hay que ver desde que pixel empieza y termina.

MEJORA 3
También se le pueden dar un par de coordenadas para borrar una zona, pero esto sería igual que pintar una caja.
Hay que considerar que en texto, no hay formas de pintar cuadrados (solo con un par de FOR).

MEJORA 4
Para CLS, podría haber muchas pantallas de TEXTO que en coco, solo se usa una. se pueden tener pantallas de texto en cualquier parte de la memoria, en bloques de 512. al igual que PCLS que borra la pantalla activa, con un color o con el default, pero no elige qué página borra.

MEJORA 5
PCLS permite elegir el color de borrado, pero no selecciona este color como fondo default, ni el color de pintar ni el de fondo se pueden configurar con este comando, tal vez seria bueno PCLS <foreground>,<background>. aunque esto normalmente se hace con COLOR <foreground>,<background>

Estos comandos en realidad son un memory FILL, mas posicionar el cursor de texto o gráfico.

VOTO Por las mejoras 1,2 y 4, descarto la 3 y la 5
La mejora se veria asi:
CLS [valor][, desde][, hasta], [página] ; todas opcionales y sería compatible
PCLS [valor][, desde][, hasta], [página] ; todas opcionales y sería compatible
Para saltar valores solo coloque las comas necesarias

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 02 Sep 2017 20:57

DATA/READ/RESTORE
Estos comandos pueden organizar de una forma fácil y eficiente datos para nuestros programas, pero se pueden mejorar.
DATA puede contener cualquier tipo de dato, numérico o cadena de caracteres, los datos numéricos, solo si tiene extended Basic se pueden meter en formato hexadecimal &hFF o octal &O77 y pueden ser tambien cadenas de caracteres aunque no lleven comillas, algo curioso, o sea se puede usar DATA "PEPE",CASA,TELEFONO, y de podrán leer con variables de cadena en el READ, si se leen con una variable numérica no leerá 0 ni su valor pasado a número, simplemente dará error en la línea de DATA.

Un problema de DATA es que para usarlo con gran cantidad de datos, desperdicia mucho espacio, ya que DATA 255,255,255,255 debería ocupar 4 bytes pero en cambio ocupa 16 bytes, por lo tanto un pequeño programa de 6k puesto en DATA ocupa un máximo de 24K más su transformación a BYTES otros 6k, daría un total de 30Kb, y ya ni cabría en memoria para correrlo.Claro siempre se puede pasar a números más grandes en formato entero, pero de nuevo 2 bytes se transforman en 5 más la coma.
Otra manera de introducir DATA es usando HEX$(si tienes Extended o te haces la función), colocando data así: DATA FF,AA,03,26, de esta forma se ahorra un byte y se puede leer así: READ a$:a=val("&h"+A$).
Por supuesto tambien está la posibilidad de leer datos de un cassette o archivo en disco.

Una mejora seria lo propuesto en el compilador CBASIC III con el comando GEN, que solo gasta un byte por dato o 2 si es mayor de 255, se usa asi GEN 255,&hFF,&Hffff,64500,-30000,5 usaria 9 bytes en el fuente, y se puede tener un comando que lea todo a la vez como un bloque, en lugar de leer byte a byte.
Aunque yo no le veo el problema en usar el mismo comando DATA y solo organizar lo internamente,la cuestión es que si hay múltiples tipos de datos, internamente en memoria se tendría que distinguir entre Bytes y Strings y perdería eficacia.

La otra buena posibilidad en este basic sería mediante cadenas de caracteres ya que se tratara de hacer para 64k por string, ya se que parece exagerado si solo hay 64k pero es la mejor forma de manejar datos en programa, se podrían cargar desde disco o cassette, incluso puede haber comandos para grabar y recuperar arrays completos, o estructuras de varios tipos de campos y registros, si ya se que hay Fields.

El READ no le veo mejora por ahora
EL RESTORE debe mejorar con un numero de linea o LABEL, ya que esto es muy fácil, actualmente el basic tiene una posición de por cual dato va y simplemente busca la línea siguiente, saltando las que no son de DATA, el RESTORE ubica el apuntador al comienzo del BASIC pero nada le impide colocarlo en cualquier línea.

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 02 Sep 2017 21:09

DIM/REDIM/GLOBAL/SHARED
Es un comando para reservar memoria para arrays, solo necesita una organización interna de variables mejor, tal vez un REDIM y variables locales en funciones y Subs. uso de GLOBAL y LOCAL, SHARED.

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 02 Sep 2017 21:40

INPUT[#]
Un input formateable y parametrizable es el sueño de todos, que funcione en graficos, que tenga un valor predeterminado, tiempo de espera para retornar, con formatos como el PRINT USING, seria ideal.
Algo así:
INPUT [#puerto, ]["Dato a mostrar";] variable[, variable][...][;|,]
Normalmente el dato a mostrar tiene que ser literal, constante y no una variable, pues se confundiría con las variables a rellenar, pero esto se podría solucionar con un separador que no fuera ni "," ni ";", tal vez un "-". Aunque si va separado con ";" ya sería suficiente ya que las variables van sepàradas con "," excepto la última que puede terminar en ";" o "," o nada
Dependiendo de si termina en , o ; el comando limpia hasta el final de línea
Si se introducen más datos de los necesarios para las variable el basic responde ?EXTRA IGNORED.
Los datos se pueden introducir separados por comas o presionando enter por cada uno, o cualquier mezcla de esto

Avatar de Usuario
luiscoco
Mensajes: 2328
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 30 veces
Agradecimiento recibido: 44 veces
Contactar:

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 02 Sep 2017 21:51

OPEN ($A5F6 - $A680) tipo, puerto, nombre$ Tiene HOOK en RAM
Abre un puerto de comunicaciones con un periférico

Tipo: “I” = Input; “O” = Output; ”R”= Random; “B” = Binary
Puerto: 0 = Pantalla; -1 = Cassette; -2 = Printer; -3 = Serial; 1-15 Puertos en disco, para el Open se puede omitir el #, y usar variables o evaluaciones
Nombre= max 8 caracteres para el nombre.
Para la unidad de disco adicional-mente permite: “.” 3 caracteres de extensión “:” unidad de disco

EL OPEN "I" comienza en $A624
EL OPEN "O" comienza en $LA658
Zona de errores en $A616
Búsqueda por el nombre de archivo en CNMBUF comienza en LA648 y utiliza la siguiente rutina mas abajo

Código: Seleccionar todo

0824         * OPEN
0825   A5F6 BD 01 5E   OPEN   JSR   RVEC0   HOOK INTO RAM
0826   A5F9 BD B1 56      JSR   LB156   GET FILE STATUS (INPUT,OUTPUT)
0827   A5FC BD B6 A4      JSR   LB6A4   GET FIRST BYTE OF STATUS STRING TO ACCB
0828   A5FF 34 04      PSHS   B   SAVE IT ON STACK
0829   A601 8D 9F      BSR   LA5A2   CHECK FOR SYNTAX AND GET DEVICE NUMBER
0830   A603 BD B2 6D      JSR   LB26D   SYNTAX CHECK FOR COMMA, SYNTAX ERROR IF NOT
0831   A606 8D BD      BSR   LA5C5   GET FILE NAME
0832   A608 96 6F      LDA   DEVNUM   GET DEVICE NUMBER
0833   A60A 0F 6F      CLR   DEVNUM   SET DEVICE NUMBER TO SCREEN
0834   A60C 35 04      PULS   B   GET STATUS AGAIN
0835   A60E C1 49      CMPB   #'I   IS IT INPUT MODE?
0836   A610 27 12      BEQ   LA624   YES
0837   A612 C1 4F      CMPB   #'O   IS IT OUTPUT MODE?
0838   A614 27 42      BEQ LA658 YES
0839
0840         * IF IT ISN’T INPUT OR OUTPUT, BAD FILE MODE
0841   A616 C6 2A   LA616   LDB   #21*2   ERROR # 21 ‘BAD FILE MODE’
0842   A618 8C         FCB   SKP2   SKIP TWO BYTES
0843   A619 C6 28   LA619   LDB   #20*2   ERROR # 20 ‘I/O ERROR
0844   A61B 8C         FCB   SKP2   SKIP TWO BYTES
0845   A61C C6 24   LA61C   LDB   #18*2   ERROR # 18 ‘FILE ALREADY OPEN’
0846   A61E 8C         FCB   SKP2   SKIP TWO BYTES
0847   A61F C6 26   LA61F   LDB   #19*2   ERROR # 19 ‘DEVICE NUMBER ERROR’
0848   A621 7E AC 46      JMP   LAC46   JUMP TO ERROR HANDLER
0849         * INPUT
0850   A624 4C      LA624   INCA      DEVICE NUMBER SET TO TAPE?
0851   A625 2B EF      BMI   LA616   ‘BAD FILE MODE’ IF DEVNUM = NEG BUT NOT CASSETTE
0852   A627 26 2E      BNE   LA657   RETURN IF DEVNUM WAS SET TO SCREEN OR DISK
0853         * SET TO TAPE
0854   A629 8D 1D      BSR   LA648   GET HEADER BLOCK
0855   A62B B6 01 E3      LDA   CASBUF+9   GET ASCII FLAG
0856   A62E B4 01 E4      ANDA   CASBUF+10   ‘AND’ IT WITH FILE MODE
0857   A631 27 E3      BEQ   LA616   ‘BAD FILE MODE’ - CRUNCHED FlLE OR MACH LANG
0858   A633 0C 78      INC   FILSTA   OPEN FILE FOR INPUT
0859   A635 BD A7 01   LA635   JSR   LA701   START TAPE, READ A BLOCK
0860   A638 26 DF      BNE   LA619   ‘I/O ERROR’
0861   A63A 0D 7C      TST   BLKTYP   CHECK BLOCK NUMBER
0862   A63C 27 DB      BEQ   LA619   ‘I/O ERROR’ IF HEADER BLOCK
0863   A63E 2B 17      BMI   LA657   BRANCH IF THIS IS THE LAST BLOCK
0864   A640 96 7D      LDA   BLKLEN   CHAR COUNT
0865   A642 27 F1      BEQ   LA635   READ ANOTHER BLOCK IF NULL BLOCK
0866   A644 97 79   LA644   STA   CINCTR   STORE IN TEMP CHARACTER COUNTER
0867   A646 20 0A      BRA   LA652   RESET BUFFER POINTER
0868
0869         * SEARCH FOR FILE NAME IN CNMBUF
0870   A648 0D 78   LA648   TST   FILSTA   IS THE FILE OPEN?
0871   A64A 26 D0      BNE   LA61C   YES- ‘FILE ALREADY OPEN’
0872   A64C 8D 33      BSR   LA681   SEARCH FOR CORRECT FILE NAME
0873   A64E 26 C9      BNE   LA619   ‘I/O ERROR’
0874   A650 0F 79   LA650   CLR   CINCTR   CLEAR CHARACTER COUNTER
0875   A652 8E 01 DA   LA652   LDX   #CASBUF   CASSETTE INPUT BUFFER ADDRESS
0876   A655 9F 7A      STX   CINPTR   RESET IT
0877   A657 39      LA657   RTS
0878
0879         * WRITE OUT THE HEADER BLOCK
0880
0881         ** CASBUF FILE NAME
0882         ** CASBUF+8 FILE TYPE
0883         ** CASBUF+9 ASCII FLAG
0884         ** CASBUF+10 FILE MODE
0885         ** CASBUF+11,12 TRANSFER ADDRESS
0886         ** CASBUF+13,14 START ADDRESS
0887
0888         * ENTER HERE FOR DATA FILES W/DEVICE NUMBER IN ACCA (FOR OUTPUT)
0889   A658 4C      LA658   INCA      CHECK FOR CASSETTE DEVICE NUMBER
0890 A659 26 FC      BNE   LA657   RETURN IF DEVICE NUMBER WASN’T TAPE
--------------B10--------------

0891   A65B 4C         INCA      MAKE FILE TYPE = 1
0892         * ENTER HERE FOR ASCII FILES
0893   A65C 8E FF FF   LA65C   LDX   #$FFFF   SET ASCII FLAG AND MODE = $FF
0894   A65F 0D 78   LA65F   TST   FILSTA   IS FILE OPEN?
0895   A661 26 B9      BNE   LA61C   YES- ‘FILE ALREADY OPEN’
0896   A663 CE 01 DA      LDU   #CASBUF   CASSETTE INPUT BUFFER
0897   A666 DF 7E      STU   CBUFAD   STORE IN STARTING ADDRESS
0898   A668 A7 48      STA   8,U   FILE TYPE IN CASBUF+8
0899   A66A AF 49      STX   9,U   ASCII FLAG & MODE IN CASBUF+9, CASBUF+10
0900         * CASBUF +8 +9 +10
0901         * TYPE ASCII MODE
0902         * BASIC CRUNCHED 00 00 00
0903         * BASIC ASCII 00 FF FF
0904         * DATA 01 FF FF
0905         * MACHINE LANGUAGE 02 00 00
0906         * MACHINE BLK LOAD 02 00 FF
0907
0908   A66C 8E 01 D2      LDX   #CFNBUF+1   POINT X TO FILE NAME BUFFER
0909   A66F BD A5 98      JSR   LA598   MOVE 8 BYTES FROM (X) TO (U)
0910   A672 0F 7C      CLR   BLKTYP   ZERO BLOCK NUMBER
0911   A674 86 0F      LDA   #15   15 BYTES IN THE HEADER BLOCK
0912   A676 97 7D      STA   BLKLEN   CHAR COUNT
0913   A678 BD A7 E5      JSR   LA7E5   GO WRITE ONE BLOCK
0914   A67B 86 02      LDA   #2   OUTPUT FILE
0915   A67D 97 78      STA   FILSTA   STORE IN FILE MODE
0916   A67F 20 CF      BRA   LA650   RESET POINTERS



Volver a “Tandy CoCo”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado