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 » 02 Sep 2017 21:51

Último mensaje de la página anterior:

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


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 » 03 Sep 2017 17:04

SALIDA DE PANTALLA
Normalmente trataría de que fuera grafica, pero configurable, en el programa ADOS se usa un pequeño programa para pasar al modo gráfico, con las siguientes características: todas en gráficos de 24 líneas y creo que se puede usar blanco(buff) y negro (si estas en NTSC se verán colores falsos), o .verde-negro, con anchos de 32,42,51 y 64, esto es porque la resolución de 256x192

Ancho de 8 bits por carácter (la normal)(256/8=32),
7 bits (256/7=36,57)
6 bits (256/6=42,66)
5 bits (256/5=51,2)
4 bits (256/4=64)
3 bits (256/3=85,3) ya ni se ve.

Alto de 12 líneas por carácter (la normal)(192/8=24)
11 líneas (192/11=17,45)
10 líneas (192/10=19,2)
9 líneas (192/9=21,3)
8 líneas (192/8=24)
7 líneas (192/7=27,4)
6 líneas (192/6=32)
5 líneas (192/5=38,4)
4 líneas (192/4=48)

Considerando:
* Las resoluciones más rápidas serian las de 8 y 4 bits de ancho
* Las fuentes pueden ser solo 128, no se usarán bloques, en su lugar los otros 128 serían invertidos de la misma fuente.
* En el programa citado, todos los tamaños los hacen con la misma fuente, simplemente separando los caracteres. (bastante feo).
* Podríamos tener un editor de fuentes.
* El gasto sería de 128x8=1 kb. por archivo de fuentes

Formato del archivo de Fuentes:
Byte Cant Descripción
1 4 FONT
5 1 Cantidad de fuentes (0=256)
6 1 Ancho x Alto 4 bits C/U, max 15x15
7 1 Gasto en bytes Ancho x Alto, Max (15x15) normalmente seria $18 o sea 1 byte x 8 bytes


Algunas muestras:
4x7 de ADOS, con solo una línea de separación entre líneas, en realidad serían 4x8
Muestra 4x8 ADOS.png
4x8 ADOS
Muestra 4x8 ADOS.png (19 KiB) Visto 214 veces

5x8 ADOS, en esta, ya con separaciones entre letras, es más legible, pero usa el mismo font, ahorrando memoria.
5x8 ADOS.png
5X8 ADOS
5x8 ADOS.png (18.44 KiB) Visto 213 veces

Pixel-4x4.png
4x4
Pixel-4x4.png (6.15 KiB) Visto 215 veces

visualización-de-led-alfanumérica-de-la-fuente-del-alfabeto-en-negro-22713274.jpg
6x7 o 7x8 si dejamos separación
visualización-de-led-alfanumérica-de-la-fuente-del-alfabeto-en-negro-22713274.jpg (199.84 KiB) Visto 218 veces

letras-y-números-del-alfabeto-del-bloque-del-pixel-33457080-1.jpg
5x5 o 6x6 si dejamos separación
letras-y-números-del-alfabeto-del-bloque-del-pixel-33457080-1.jpg (178.22 KiB) Visto 217 veces

al-mundo-de-los-microcontroladores-basic-chapter-04-fig4-23.gif
5x7 0 6x8 si dejamos separación
al-mundo-de-los-microcontroladores-basic-chapter-04-fig4-23.gif (117.5 KiB) Visto 218 veces

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 » 04 Sep 2017 07:03

RUTINA QUE TOMA UNA LÍNEA DE ENTRADA PARA EL BASIC Y LA COLOCA EN EL BUFFER DE LINEA DE ENTRADA LINBUF ($A38D - $A3EC)
Esta rutina toma una linea desde la entrada de teclado, la analiza, y retorna si termina con Break o Enter
Si comienza en $A38D Borra la pantalla.
LLama a CONSOLE IN (no entiendo el buffer de un carácter y Status de buffer lleno que se usa aca, ya que es de un solo carácter).
Luego va colocando los caracteres en un buffer de línea de entrada LINBUF, de 250 bytes, aunque comienza en la posición 2, por si se usa Backspace de primero (tampoco entiendo eso, con que no lo pinte va bien).
Rellena un máximo de 251 caracteres, previene el backspace, Clear, Break, Enter, Shift-Flecha izq=borra toda la linea, limpia los caracteres de control, e ignora las minúsculas.
Hay un pequeño error en la documentación, a mi parecer el SHIFT RIGHT ARROW es SHIFT LEFT ARROW

Luego previene, el device que sea pantalla=0, si la tecla es clear, recomienza pero borrando la pantalla,
si es Backspace decrementa el contador de caracteres, imprime BS con PUTCHAR y si llego a cero recomienza la rutina,
si es Shift flecha izq $15, aunque en el listado dice derecha, esto borra toda la linea caracter por caracter, imprimiendo Backspaces.
Si es break enciende el CARRY FLAG
Si es enter termina y regresa, no analiza el buffer.
Ignora los menores de 32($20)(espacio) y los mayores de z minúscula, va metiendo todo en el buffer

RETORNA: CARRY=1 si sale con break o CARRY =0 con ENTER

Código: Seleccionar todo

0490         * THIS IS THE ROUTINE THAT GETS AN INPUT LINE FOR BASIC
0491         * EXIT WITH BREAK KEY: CARRY = 1
0492         * EXIT WITH ENTER KEY: CARRY = 0
0493   A38D BD A9 28   LA38D   JSR   LA928   CLEAR SCREEN
0494   A390 BD 01 82   LA390   JSR   RVEC12   HOOK INTO RAM
0495   A393 0F 87      CLR   IKEYIM   RESET BREAK CHECK KEY TEMP KEY STORAGE
0496   A395 8E 02 DD      LDX   #LINBUF+1   INPUT LINE BUFFER
0497   A398 C6 01      LDB   #1   ACCB CHAR COUNTER: SET TO 1 TO ALLOW A
0498         * BACKSPACE AS FIRST CHARACTER
0499   A39A BD A1 71   LA39A   JSR   LA171   GO GET A CHARACTER FROM CONSOLE IN
0500   A39D 0D 70      TST   CINBFL   GET CONSOLE IN BUFFER FLAG
0501   A39F 26 2B      BNE   LA3CC   BRANCH IF NO MORE CHARACTERS IN INPUT FILE
0502   A3A1 0D 6F      TST   DEVNUM   CHECK DEVICE NUMBER
0503   A3A3 26 23      BNE   LA3C8   BRANCH IF NOT SCREEN
0504   A3A5 81 0C      CMPA   #FORMF   FORM FEED
0505   A3A7 27 E4      BEQ   LA38D   YES - CLEAR SCREEN
0506   A3A9 81 08      CMPA   #BS   BACKSPACE
0507   A3AB 26 07      BNE   LA3B4   NO
0508   A3AD 5A         DECB      YES - DECREMENT CHAR COUNTER
0509   A3AE 27 E0      BEQ   LA390   BRANCH IF BACK AT START OF LINE AGAIN
0510   A3B0 30 1F      LEAX   -1,X   DECREMENT BUFFER POINTER
0511   A3B2 20 34      BRA   LA3E8   ECHO CHAR TO SCREEN
0512   A3B4 81 15   LA3B4   CMPA   #$15   SHIFT RIGHT ARROW?
0513   A3B6 26 0A      BNE   LA3C2   NO
0514         * YES, RESET BUFFER TO BEGINNING AND ERASE CURRENT LINE
0515   A3B8 5A      LA3B8   DECB      DEC CHAR CTR
0516   A3B9 27 D5      BEQ   LA390   GO BACK TO START IF CHAR CTR = 0
0517   A3BB 86 08      LDA   #BS   BACKSPACE?
0518   A3BD BD A2 82      JSR   PUTCHR   SEND TO CONSOLE OUT (SCREEN)
0519   A3C0 20 F6      BRA   LA3B8   KEEP GOING
0520   A3C2 81 03   LA3C2   CMPA   #3   BREAK KEY?
0521   A3C4 1A 01      ORCC   #1   SET CARRY FLAG
0522   A3C6 27 05      BEQ   LA3CD   BRANCH IF BREAK KEY DOWN
0523   A3C8 81 0D   LA3C8   CMPA   #CR   ENTER KEY?
0524   A3CA 26 0D      BNE   LA3D9   NO
0525   A3CC 4F      LA3CC   CLRA   CLEAR   CARRY FLAG IF ENTER KEY - END LINE ENTRY
0526   A3CD 34 01   LA3CD   PSHS   CC   SAVE CARRY FLAG
0527   A3CF BD B9 58      JSR   LB958   SEND CR TO SCREEN
0528   A3D2 6F 84      CLR   ,X   MAKE LAST BYTE IN INPUT BUFFER = 0
0529   A3D4 8E 02 DC      LDX   #LINBUF   RESET INPUT BUFFER POINTER
0530   A3D7 35 81      PULS   CC,PC   RESTORE CARRY FLAG
0531
0532         * INSERT A CHARACTER INTO THE BASIC LINE INPUT BUFFER
0533   A3D9 81 20   LA3D9   CMPA   #$20   IS IT CONTROL CHAR?
0534   A3DB 25 BD      BLO   LA39A   BRANCH IF CONTROL CHARACTER
0535   A3DD 81 7B      CMPA   #'z-1   *
0536   A3DF 24 B9      BCC   LA39A   * IGNORE IF > LOWER CASE Z
0537   A3E1 C1 FA      CMPB   #LBUFMX   HAVE 250 OR MORE CHARACTERS BEEN ENTERED?
0538   A3E3 24 B5      BCC   LA39A   YES, IGNORE ANY MORE
0539   A3E5 A7 80      STA   ,X+   PUT IT IN INPUT BUFFER
0540   A3E7 5C         INCB      INCREMENT CHARACTER COUNTER
0541   A3E8 BD A2 82   LA3E8   JSR   PUTCHR   ECHO IT TO SCREEN
0542   A3EB 20 AD      BRA   LA39A   GO SET SOME MORE

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 » 05 Sep 2017 16:47

CONT
Este comando continua la ejecución después de una tecla break o comando STOP.

MEJORA:
Si le agregamos un parámetro de Número de linea o Etiqueta, podría mejorar la utilidad, y no le veo problema, podrían saltarse trozos o repetir una zona.
En el Basic original era realmente fácil haberlo hecho, ya en el actual, es mas difícil. pero posible

EL RUN también se podría usar para correr una linea, pero este inicializa las variables

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 » 07 Sep 2017 20:21

VARIABLES DEL SISTEMA BASIC

La zona de variables entre COCO y DRAGON tiene su parecido (después aumentare el análisis)
La comparativa, bastante larga, me la tire a mano, jeje

Código: Seleccionar todo

COCO.................................................................DRAGON
0048 0000 ENDFLG RMB 1 STOP/END FLAG: POSITIVE=STOP, NEG=END.........BREAK message flag. If negative print BREAK
0049 0001 CHARAC RMB 1 TERMINATOR FLAG 1.............................String delimiting character
0050 0002 ENDCUR RMB 1 TERMINATOR FLAG 2.............................Another delimiting character
0051 0003 TMPLOC RMB 1 SCRATCH VARIABLE..............................General count byte
0052 0004 IFCTR  RMB 1 IF COUNTER - HOW MANY IF STATEMENTS IN A LINE.Count of IFs seen while looking for ELSE
0053 0005 DIMFLG RMB 1 *DV* ARRAY FLAG 0=EVALUATE, 1=DIMENSIONING....DIM flag
0054 0006 VALTYP RMB 1 *DV* *PV TYPE FLAG: 0=NUMERIC, $FF=STRING.....VALTYP - 0=numeric, l=string
0055 0007 GARBFL RMB 1 *TV STRING SPACE HOUSEKEEPING FLAG............Garbage collection flag
0056 0008 ARYDIS RMB 1 DISABLE ARRAY SEARCH: 00=ALLOW SEARCH.........Subscript allowed flag
0057 0009 INPFLG RMB 1 *TV INPUT FLAG: READ=0, INPUT<>0..............INPUT/READ flag
0058 000A RELFLG RMB 1 *TV RELATIONAL OPERATOR FLAG..................Arithmetic use
0059 000B TEMPPT RMB 2 *PV TEMPORARY STRING STACK POINTER............String pointer - first free temporary
0060 000D LASTPT RMB 2 *PV ADDR OF LAST USED STRING STACK ADDRESS....String pointer - last used temporary
0061 000F TEMPTR RMB 2 TEMPORARY POINTER.............................Temporary results
0062 0011 TMPTR1 RMB 2 TEMPORARY DESCRIPTOR STORAGE (STACK SEARCH)
0063 ** FLOATING POINT ACCUMULATOR #2 (MANTISSA ONLY)
0064 0013 FPA2 RMB 4 FLOATING POINT ACCUMULATOR #2 MANTISSA
0065 0017 BOTSTK RMB 2 BOTTOM OF STACK AT LAST CHECK
0066 0019 TXTTAB RMB 2 *PV BEGINNING OF BASIC PROGRAM................Pointer to start of BASIC text
0067 001B VARTAB RMB 2 *PV START OF VARIABLES........................Pointer to start of simple variables
0068 001D ARYTAB RMB 2 *PV START OF ARRAYS...........................Pointer to start of array variables
0069 001F ARYEND RMB 2 *PV END OF ARRAYS (+1)........................End of storage in use
0070 0021 FRETOP RMB 2 *PV START OF STRING STORAGE (TOP OF FREE RAM).Stack base address
0071 0023 STRTAB RMB 2 *PV START OF STRING VARIABLES.................String space base address
0072 0025 FRESPC RMB 2 UTILITY STRING POINTER........................Temporary pointer to new string
0073 0027 MEMSIZ RMB 2 *PV TOP OF STRING SPACE.......................Address of top of RAM used by BASIC
0074 0029 OLDTXT RMB 2 SAVED LINE NUMBER DURING A "STOP".............Last BASIC line number
0075 002B BINVAL RMB 2 BINARY VALUE OF A CONVERTED LINE NUMBER.......Input line number
0076 002D OLDPTR RMB 2 SAVED INPUT PTR DURING A "STOP"...............Old text pointer
0077 002F TINPTR RMB 2 TEMPORARY INPUT POINTER STORAGE...............Another text pointer
0078 0031 DATTXT RMB 2 *PV 'DATA' STATEMENT LINE NUMBER POINTER......DATA line number
0079 0033 DATPTR RMB 2 *PV 'DATA' STATEMENT ADDRESS POINTER..........Pointer for DATA
0080 0035 DATTMP RMB 2 DATA POINTER FOR 'INPUT' & 'READ'.............Pointer for INPUT
0081 0037 VARNAM RMB 2 *TV TEMP STORAGE FOR A VARIABLE NAME..........Evaluation variables ($37-$4E)
0082 0039 VARPTR RMB 2 *TV POINTER TO A VARIABLE DESCRIPTOR
0083 003B VARDES RMB 2 TEMP POINTER TO A VARIABLE DESCRIPTOR
0084 003D RELPTR RMB 2 POINTER TO RELATIONAL OPERATOR PROCESSING ROUTINE
0085 003F TRELFL RMB 1 TEMPORARY RELATIONAL OPERATOR FLAG BYTE
0086
0087 * FLOATING POINT ACCUMULATORS #3,4 & 5 ARE MOSTLY  USED AS SCRATCH PAD VARIABLES.
0088 *
0089 ** FLOATING POINT ACCUMULATOR #3 :PACKED: ($40-$44)
0090 0040 V40 RMB 1
0091 0041 V41 RMB 1
0092 0042 V42 RMB 1
0093 0043 V43 RMB 1
0094 0044 V44 RMB 1
0095 ** FLOATING POINT ACCUMULATOR #4 :PACKED: ($45-$49)
0096 0045 V45 RMB 1
0097 0046 V46 RMB 1
0098 0047 V47 RMB 1
0099 0048 V48 RMB 2
0100 ** FLOATING POINT ACCUMULATOR #5 :PACKED: ($4A—$4E)
0101 004A V4A RMB 1
0102 004B V4B RMB 2
0103 004D V4D RMB 2
0104 ** FLOATING POINT ACCUMULATOR
0105 004F FP0EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #0 EXPONENT....Floating point accumulator, FAC exponent
0106 0050 FPA0 RMB 4 *PV FLOATING POINT ACCUMULATOR #0 MANTISSA......FAC mantissa
0107 0054 FP0SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #0 SIGN........Sign of FAC
0108 0055 COEFCT RMB 1 POLYNOMIAL COEFFICIENT COUNTER................Temporary sign of FAC
0109 0056 STRDES RMB 5 TEMPORARY STRING DESCRIPTOR...................String descriptor temporaries
0110 005B FPCARY RMB 1 FLOATING POINT CARRY BYTE
0111 ** FLOATING POINT ACCUMULATOR #1
0112 005C FP1EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #1 EXPONENT....Floating point argument, ARG exponent
0113 005D FPA1 RMB 4 *PV FLOATING POINT ACCUMULATOR #1 MANTISSA......ARG mantissa
0114 0061 FP1SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #1 SIGN........Sign of ARG
0116 0062 RESSGN RMB 1 SIGN OF RESULT OF FLOATING POINT OPERATION....Miscellaneous use ($62-$67)
0117 0063 FPSBYT RMB 1 FLOATING POINT SUB BYTE (FIFTH BYTE)
0118 0064 COEFPT RMB 2 POLYNOMIAL COEFFICIENT POINTER
0119 0066 LSTTXT RMB 2 CURRENT LINE POINTER DURING LIST
0120 0068 CURLIN RMB 2 *PV CURRENT LINE # OF BASIC PROGRAM, $FFFF = DIRECT...Current line number
0121 006A DEVCFW RMB 1 *TV TAB FIELD WIDTH...........................Device parameters used in PRINT ($6A-$6E)
0122 006B DEVLCF RMB 1 *TV TAB ZONE
0123 006C DEVPOS RMB 1 *TV PRINT POSITION
0124 006D DEVWID RMB 1 *TV PRINT WIDTH
0125 006E PRTDEV RMB 1 *TV PRINT DEVICE: 0=NOT CASSETTE, -1=CASSETTE
0126 006F DEVNUM RMB 1 *PV DEVICE NUMBER: -3=DLOAD, -2=PRINTER.......Device number, 0-console, -l-cassette, -2-printer
0127 * -1=CASSETTE, 0=SCREEN, 1-15=DISK
0128 0070 CINBFL RMB 1 *PV CONSOLE IN BUFFER FLAG: 00=NOT EMPTY, $FF=EMPTY..End of file flag
0129 0071 RSTFLG RMB 1 *PV WARM START FLAG: $55=WARM, OTHER=COLD.....Restart flag ($55 warm, other cold)
0130 0072 RSTVEC RMB 2 *PV WARM START VECTOR - JUMP ADDRESS FOR WARM START..Warm start vector (points to NOP)
0131 0074 TOPRAM RMB 2 *PV TOP OF RAM................................Top of RAM minus 1
0132 0076 RMB 2 SPARE: UNUSED VARIABLES..............................Unused
0133 0078 FILSTA RMB 1 *PV FILE STATUS FLAG: 0=CLOSED, 1=INPUT, 2=OUTPUT..Cassette file status (0-closed, 1-input,
2-output)
0134 0079 CINCTR RMB 1 *PV CONSOLE IN BUFFER CHAR COUNTER............Number of characters in CASBUF
0135 007A CINPTR RMB 2 *PV CONSOLE IN BUFFER POINTER.................Cassette buffer pointer
0136 007C BLKTYP RMB 1 *TV CASS BLOCK TYPE: 0=HEADER,1=DATA,$FF=EOF.Block type (0=header, 1=data
FF=end of file)
0137 007D BLKLEN RMB 1 *TV CASSETTE BYTE COUNT.......................Block length
0138 007E CBUFAD RMB 2 *TV CASSETTE LOAD BUFFER POINTER..............Address of cassette buffer
0139 0080 CCKSUM RMB 1 *TV CASSETTE CHECKSUM BYTE....................Block checksum
0140 0081 CSRERR RMB 1 *TV ERROR FLAG/CHARACTER COUNT................Checksum error flag
0141 0082 CPULWD RMB 1 *TV PULSE WIDTH COUNT.........................Pulse width counter
0142 0083 CPERTM RMB 1 *TV BIT COUNTER...............................Sync bits counter
0143 0084 CBTPHA RMB 1 *TV BIT PHASE FLAG............................Bit phase flag
0144 0085 CLSTSN RMB 1 *TV LAST SINE TABLE ENTRY.....................Last sine wave value
0145 0086 GRBLOK RMB 1 *TV GRAPHIC BLOCK VALUE FOR SET, RESET AND POINT..Used in SET, RESET, and POINT
0146 0087 IKEYIM RMB 1 *TV INKEY$ RAM IMAGE..........................Single character keyboard buffer
0147 0088 CURPOS RMB 2 *PV CURSOR LOCATION...........................Current cursor address
0148 008A ZERO RMB 2 *PV DUMMY - THESE TWO BYTES ARE ALWAYS ZERO.....16-bit zero
0149 008C SNDTON RMB 1 *TV TONE VALUE FOR SOUND COMMAND..............Sound frequency
0150 008D SNDDUR RMB 2 *TV DURATION VALUE FOR SOUND COMMAND..........Sound timer
0151
0152 ** THESE BYTES ARE MOVED DOWN FROM ROM
0153 *** INIT DESCRIPTION
0154 * VALUE
0155 008F CMPMID RMB 1 18 *PV 1200/2400 HERTZ PARTITION..............Cursor blink rate counter. Initial value = 32
0156 0090 CMP0 RMB 1 24 *PV UPPER LIMIT OF 1200 HERTZ PERIOD.........Count of number of leader bytes, Initial value 0080 ($90-$91)
0157 0091 CMP1 RMB 1 10 *PV UPPER LIMIT OF 2400 HERTZ PERIOD
0158 0092 SYNCLN RMB 2 128 *PV NUMBER OF $55'S TO CASSETTE LEADER....Minimum cycle width of 1200Hz Initial value = 12
......0092...........................................................Minimum pulse width at 1200Hz Initial value = 0A
0159 0094 BLKCNT RMB 1 11 *PV CURSOR BLINK DELAY.....................Maximum pulse width at 1200Hz Initial value = 12
0160 0095 LPTBTD RMB 2 88 *PV BAUD RATE CONSTANT (600)...............Cassette motor delay value
0161 0097 LPTLND RMB 2 1 *PV PRINTER CARRIAGE RETURN DELAY...........Keyboard debounce delay value Initial value = 045E
0162 0099 LPTCFW RMB 1 16 *PV TAB FIELD WIDTH........................Line printer comma field width, Initial value = 10
0163 009A LPTLCF RMB 1 112 *PV LAST TAB ZONE.........................Line printer last comma field, Initial value = 74
0164 009B LPTWID RMB 1 132 *PV PRINTER WIDTH.........................Line printer width, Initial value = 84
0165 009C LPTPOS RMB 1 0 *PV LINE PRINTER POSITION...................Line printer head position
0166 009D EXECJP RMB 2 LB4AA *PV JUMP ADDRESS FOR EXEC COMMAND.......EXEC vector
0167
0168 ** THIS ROUTINE PICKS UP THE NEXT INPUT CHARACTER FROM
0169 ** BASIC. THE ADDRESS OF THE NEXT BASIC BYTE TO BE
0170 ** INTERPRETED IS STORED AT CHARAD.
0171
0172 009F 0C A7 GETNCH INC <CHARAD+1 *PV INCREMENT LS BYTE OF INPUT POINTER..INC $A7 ; CHRGET input routine
0173 00A1 26 02 BNE GETCCH *PV BRANCH IF NOT ZERO (NO CARRY).........BNE $A5 ($A1-$A2)
0174 00A3 0C A6 INC <CHARAD *PV INCREMENT MS BYTE OF INPUT POINTER...INC $A6 ($A3-$A4)
0175 00A5 B6 GETCCH FCB $B6 *PV OP CODE OF LDA EXTENDED..............LDA >0 ($A5-$A7)
0176 00A6 CHARAD 2 *PV THESE 2 BYTES CONTAIN ADDRESS OF THE CURRENT
0177 * CHARACTER WHICH THE BASIC INTERPRETER IS
0178 * PROCESSING
0179 00A8 7E AA 1A JMP BROMHK JUMP BACK INTO THE BASIC RUM...........JMP $BB26
0180
0181 00AB VAB RMB 1 = LOW ORDER FOUR BYTES OF THE PRODUCT............Used by RND ($AB-$AE)
0182 00AC VAC RMB 1 = OF A FLOATING POINT MULTIPLICATION
0183 00AD VAD RMB 1 = THESE BYTES ARE USE AS RANDOM DATA
0184 00AE VAE RMB 1 = BY THE RND STATEMENT
0185
0186 * EXTENDED BASIC VARIABLES
0187 00AF TRCFLG RMB 1 *PV TRACE FLAG 0=OFF ELSE=ON..................Program trace flag, 0-trace off, non 0, trace on
0188 00B0 USRADR RMB 2 *PV ADDRESS OF THE START OF USR VECTORS.......Pointer to USR vector base
0189 00B2 FORCOL RMB 1 *PV FOREGROUND COLOR..........................Foreground colour
0190 00B3 BAKCOL RMB 1 *PV BACKGROUND COLOR..........................Background colour
0191 00B4 WCOLOR RMB 1 *TV WORKING COLOR BEING USED BY EX BASIC......Active colour
0192 00B5 ALLCOL RMB 1 *TV ALL PIXELS IN THIS BYTE SET TO COLOR OF VB3..Active colour
0193 00B6 PMODE RMB 1 *PV PMODE'S MODE ARGUMENT......................Graphics mode
0194 00B7 ENDGRP RMB 2 *PV END OF CURRENT GRAPHIC PAGE...............Top of current graphics screen
0195 00B9 HORBYT RMB 1 *PV NUMBER OF BYTES/HORIZONTAL GRAPHIC LINE...Number of bytes in graphics row
0196 00BA BEGGRP RMB 2 *PV START OF CURRENT GRAPHIC PAGE.............Base address of current graphics screen
0197 00BC GRPRAM RMB 1 *PV START OF GRAPHIC RAM (MS BYTE)............Page number of graphics screen
0198 00BD HORBEG RMB 2 *DV* *PV HORIZ COORD - START POINT............Current X position
0199 00BF VERBEG RMB 2 *DV* *PV VERT COORD - START POINT.............Current Y position
0200 00C1 CSSYAL RMB 1 *PV SCREEN'S COLOR SET ARGUMENT...............Used by graphics  ($C1-$DD)
0201 00C2 SETFLG RMB 1 *PV PRESET/PSET FLAG: 0=PRESET, 1=PSET
0202 00C3 HOREND RMB 2 *DV* *PV HORIZ COORD - ENDING POINT
0203 00C5 VEREND RMB 2 *DV* *PV VERT COORD - ENDING POINT
0204 00C7 HORDEF RMB 2 *PV HORIZ COORD - DEFAULT COORD
0205 00C9 VERDEF RMB 2 *PV VERT COORD - DEFAULT COORD
0206
0207 * EXTENDED BASIC SCRATCH PAD VARIABLES
0208 00CB VCB RMB 2
0209 00CD VCD RMB 2
0210 00CF VCF RMB 2
0211 00D1 VD1 RMB 2
0212 00D3 VD3 RMB 1
0213 00D4 VD4 RMB 1
0214 00D5 VD5 RMB 1
0215 00D6 VD6 RMB 1
0216 00D7 VD7 RMB 1
0217 00D8 VD8 RMB 1
0218 00D9 VD9 RMB 1
0219 00DA VDA RMB 1
0220
0221 00DB CHGFLG RMB 1 *TV FLAG TO INDICATE IF GRAPHIC DATA HAS BEEN CHANGED
0222 00DC TMPSTK RMB 2 *TV STACK POINTER STORAGE DURING PAINT
0223 00DE OCTAVE RMB 1 *PV OCTAVE VALUE (PLAY).......................MUSIC octave
0224 00DF VOLHI RMB 1 *DV* *PV VOLUME HIGH VALUE (PLAY)..............MUSIC high volume
0225 00E0 VOLLOW RMB 1 *DV* *PV VOLUME LOW VALUE (PLAY)..............MUSIC low volume
0226 00E1 NOTELN RMB 1 *PV NOTE LENGTH (PLAY)........................MUSIC note value
0227 00E2 TEMPO RMB 1 *PV TEMPO VALUE (PLAY).........................MUSIC tempo
0228 00E3 PLYTMR RMB 2 *TV TIMER FOR THE PLAY COMMAND................MUSIC duration count
0229 00E5 DOTYAL RMB 1 *TV DOTTED NOTE TIMER SCALE FACTOR............MUSIC dotted note flag
0230 00E6 DLBAUD RMB 1 *DV* *PV DLOAD BAUD RATE CONSTANT $B0=300, $2C=1200..Unused in Dragon 32 ($E6-$FF)
0231 00E7 TIMOUT RMB 1 *DV* *PV DLOAD TIMEOUT CONSTANT
0232 00E8 ANGLE RMB 1 *DV* *PV ANGLE VALUE (DRAW)
0233 00E9 SCALE RMB 1 *DV* *PV SCALE VALUE (DRAW)
0234
0235 * DSKCON VARIABLES
0236 00EA DCOPC RMB 1 *PV DSKCON OPERATION CODE 0-3
0237 00EB DCDRV RMB 1 *PV DSKCON DRIVE NUMBER 0—3
0238 00EC DCTRK RMB 1 *PV DSKCON TRACK NUMBER 0—34
0239 00ED DSEC RMB 1 *PV DSKCON SECTOR NUMBER 1-18
0240 00EE DCBPT RMB 2 *PV DSKCON DATA POINTER
0241 00F0 DCSTA RMB 1 *PV DSKCON STATUS BYTE
0242
0243 00F1 FCBTMP RMB 2 TEMPORARY FCB POINTER
0244
0245 00F3 RMB 13 SPARE: UNUSED VARIABLES
0246
0247
0248 * BASIC EXBASICDOSBASIC
0249
0250 0100 SW3VEC RMB 3 $XXXX $XXXX $3B3B SWI3 VECTOR.................SWI3 secondary vector
0251 0103 SW2VEC RMB 3 $XXXX $XXXX $3B3B SWI2 VECTOR.................SWI2 secondary vector
0252 0106 SWIVEC RMB 3 $XXXX $XXXX $XXXX SWI VECTOR..................SWI secondary vector
0253 0109 NMIVEC RMB 3 $XXXX $XXXX $D7AE NMI VECTOR..................NMI secondary vector
0254 010C IRQVEC RMB 3 $A9B3 $894C $D7BC IRQ VECTOR..................IRQ secondary vector
0255 010F FRQVEC RMB 3 $A0F6 $A0F6 $A0F6 FIRQ VECTOR.................FIRQ secondary vector
0256
0257 0112 TIMVAL
0258 0112 USRJMP RMB 3 JUMP ADDRESS FOR BASIC'S USR FUNCTION
0259 .....  ********* RMB 2 TIMER VALUE FOR EXBAS....................TIMER value
0260 ......********* RMB 1 UNUSED BY EXBAS OR DISK BASIC.............Unused
0261 0115 RVSEED RMB 1 * FLOATING POINT RANDOM NUMBER SEED EXPONENT..Random number seeds ($115-$119)
0262 0116 ......... RMB 4 * MANTISSA: INITIALLY SET TO $804FC75259
0263 011A CASFLG RMB 1 UPPER CASE/LOWER CASE FLAG: $FF=UPPER, 0=LOWER..Unused ($11A-$11F)
0264 011B DEBVAL RMB 2 KEYBOARD DEBOUNCE DELAY (SET TO $45E)
0265 011D EXPJMP RMB 3 JUMP ADDRESS FOR EXPONENTIATION
0266 ** INITIALLY SET TO ERROR FOR BASIC, $8489 FOR EX BASIC
0267
0268 *** COMMAND INTERPRETATION VECTOR TABLE
0269
0270 ** FOUR SETS OF 10 BYTE TABLES:
0271
0272
0273 ** THE LAST USED TABLE MUST BE FOLLOWED BY A ZERO BYTE
0274 * THE JUMP TABLE VECTORS (3,4 AND 8,9) POINT TO THE JUMP TABLE FOR
0275 * THE FIRST TABLE. FOR ALL OTHER TABLES, THESE VECTORS POINT TO A
0276 * ROUTINE WHICH WILL VECTOR YOU TO THE CORRECT JUMP TABLE.
0277 * SUPER ENHANCED BASIC HAS MODIFIED THIS SCHEME SO THAT THE USER
0278 * TABLE MAY NOT BE ACCESSED. ANY ADDITIONAL TABLES WILL HAVE TO BE
0279 * ACCESSED FROM A NEW COMMAND HANDLER.
0280
0281 * BYTE DESCRIPTION
0282 * 0 NUMBER OF RESERVED WORDS
0283 * 1,2 LOOKUP TABLE OF RESERVED WORDS
0284 * 3,4 JUMP TABLE FOR COMMANDS (FIRST TABLE)
0285 * VECTOR TO EXPANSION COMMAND HANDLERS (ALL BUT FIRST TABLE)
0286 * 5 NUMBER OF SECONDARY FUNCTIONS
0287 * 6,7 LOOKUP TABLE OF SECONDARY FUNCTIONS (FIRST TABLE)
0288 * VECTOR TO EXPANSION SECONDARY COMMAND HANDLERS (ALL BUT
0289 * FIRST TABLE)
0290 * 8,9 JUMP TABLE FOR SECONDARY FUNCTIONS
0291 * 10 0 BYTE - END OF TABLE FLAG (LAST TABLE ONLY)
0292
0293 0120 COMVEC RMB 10 BASIC'S TABLE............................Stub 0 - number of reserved words
..... 0121 ...............................................................address of reserved word table
..... 0123 ...............................................................address of dispatch table
..... 0125 ...............................................................number of functions
..... 0126 ...............................................................address of function table
..... 0128 ...............................................................address of function dispatch table

0294 012A RMB 10 EX BASIC'S TABLE................................Stub 1 ($12A-$133)
0295 0134 RMB 10 DISC BASIC'S TABLE (UNUSED BY EX BASIC)..................USR address table ($134-$147)
0297 **** USR FUNCTION VECTOR ADDRESSES (EX BASIC ONLY)
0298 013E RMB 2 USR 0 VECTOR
0299 0140 RMB 2 USR 1
0300 0142 RMB 2 USR 2
0301 0144 RMB 2 USR 3
0302 0146 RMB 2 USR 4
0303 0148 RMB 2 USR 5................................................Auto line feed flag
.... 0149 ...........................................................Alpha lock flag 0=lower case, FF=upper case
0304 014A RMB 2 USR 6................................................Line printer EOL termination sequence ($14A-$150)
0305 014C RMB 2 USR 7
0306 014E RMB 2 USR 8
0307 0150 RMB 2 USR 9
0308
0309 *** THE ABOVE 20 BYTE USR ADDR VECTOR TABLE IS MOVED TO
0310 *** $95F-$972 BY DISC BASIC. THE 20 BYTES FROM $13E-$151
0311 *** ARE REDEFINED AS FOLLOWS:
0312
0313 * RMB 10 USER (SPARE) COMMAND INTERPRETATION TABLE SPACE
0314 * FCB 0 END OF COMM INTERP TABLE FLAG
0315 * RMB 9 UNUSED BY DISK BASIC
0316
0317 * COMMAND INTERPRETATION TABLE VALUES
0318 * BYTE BASIC EX BASICDISK BASIC
0319 * BASIC TABLE 0 53 BASIC TABLE
0320 * 1,2 $AA66
0321 * 3,4 $AB67
0322 * 5 20
0323 * 6,7 $AB1A
0324 * 8,9 $AA29
0325
0326 * 0 25 EX BASIC TABLE
0327 * 1,2 $8183
0328 * 3,4 $813C $CE2E ($CF0A 2.1)
0329 * 5 14
0330 * 6,7 $821E
0331 * 8,9 $8168 $CE56 ($CF32 2.1)
0332
0333 * 0 19 (20 2.1) DISK BASIC TABLE
0334 * 1,2 $C17F
0335 * 3,4 $C2C0
0336 * 5 6
0337 * 6,7 $C201
0338 * 8,9 $C236
0339
0340
.... 0151 ...........................................................Keyboard matrix state table ($151-$159)
0341 0152 KEYBUF RMB 8 KEYBOARD MEMORY BUFFER
0342 015A POTVAL RMB 1 LEFT VERTICAL JOYSTICK DATA...................Right joystick X-value
0343 015B RMB 1 LEFT HORIZONTAL JOYSTICK DATA........................Right joystick, Y-value
0344 015C RMB 1 RIGHT VERTICAL JOYSTICK DATA.........................Left joystick, X-value
0345 015D RMB 1 RIGHT HORIZONTAL JOYSTICK DATA.......................Left joystick, Y-value
0346
0347 * BASIC'S RAM VECTORS - INITIALIZED TO RTS BY COLOR BASIC
0348 * 25 SETS OF 3 BYTE INSTRUCTIONS WHICH ARE CALLED BY COLOR BASIC
0349 * EXTENDED AND DISK BASIC. THEIR PURPOSE IS TO ALLOW ENHANCEMENTS (SUCH
0350 * AS EX BASIC AND DOS BASIC) AS MORE ROMS ARE ADDED TO THE
0351 * SYSTEM BY EFFECTIVELY ALLOWING MORE CODE TO BE ADDED TO THE
0352 * ROUTINES IN EARLIER ROMS. THIS NEW CODE IS LOCATED IN THE NEW ROMS
0353 * AND THE ADDRESS TO GET TO THE NEW CODE IS IN BYTES 1 & 2 OF THE
0354 * RAM VECTOR. BYTE 0 WILL CONTAIN A $7E WHICH IS THE FIRST BYTE OF
0355 * THE JMP INSTRUCTION.
0356 * THE FIRST ADDRESS IN THIS TABLE IS THE ADDRESS IN BASIC WHICH
0357 * CALLS THE RAM VECTOR, THE SECOND ADDRESS IS THE VALUE WHICH
0358 * EX BASIC PUTS IN THE RAM VECTOR (IF ANY) AND THE THIRD ADDRESS
0359 * IS THE VALUE WHICH DISK BASIC PUTS THERE (IF ANY)
0360
0361
0362 * 2.0 2.1 1.0 1.1
0363 015E RVEC0 RMB 3 $A5F6 $C426 $C44B OPEN COMMAND.................RAM hooks ($15E-$1A8)
0364 0161 RVEC1 RMB 3 $A5B9 $C838 $C888 DEVICE NUMBER VALIDITY CHECK
0365 0164 RVEC2 RMB 3 $A35F $C843 $C893 SET PRINT PARAMETERS
0366 0167 RVEC3 RMB 3 $A282 $8273 $CB4A $CC1C CONSOLE OUT
0367 016A RVEC4 RMB 3 $A176 $8CF1 $C58F $C5BC CONSOLE IN
0368 016D RVEC5 RMB 3 $A3ED $C818 $C848 INPUT DEVICE NUMBER CHECK
0369 0170 RVEC6 RMB 3 $A406 $C81B $C84B PRINT DEVICE NUMBER CHECK
0370 0173 RVEC7 RMB 3 $A426 $CA3B $CAE9 CLOSE ALL FILES
0371 0176 RVEC8 RMB 3 $A42D $8286 $CA4B $CAF9 CLOSE ONE FILE
0372 0179 RVEC9 RMB 3 $B918 $8E90 $8E90 $8E90 PRINT
0373 017C RVEC10 RMB 3 $B061 $CC5B $CD35 INPUT
0374 017F RVEC11 RMB 3 $A549 $C859 $C8A9 BREAK CHECK
0375 0182 RVEC12 RMB 3 $A390 $C6B7 $C6E4 INPUTTING A BASIC LINE
0376 0185 RVEC13 RMB 3 $A4BF $CA36 $CAE4 TERMINATING BASIC LINE INPUT
0377 0188 RVEC14 RMB 3 $A5CE $CA60 $C90C EOF COMMAND
0378 018B RVEC15 RMB 3 $B223 $8846 $CDF6 $CED2 EVALUATE AN EXPRESSION
0379 018E RVEC16 RMB 3 $AC46 $C6B7 $C6E4 RESERVED FOR ON ERROR GOTO CMD
0380 0191 RVEC17 RMB 3 $AC49 $88F0 $C24D $C265 ERROR DRIVER
0381 0194 RVEC18 RMB 3 $AE75 $829C $C990 $CA3E RUN
0382 0197 RVEC19 RMB 3 $BD22 $87EF ASCII TO FLOATING POINT CONV.
0383 019A RVEC20 RMB 3 $AD9E $82B9 $C8B0 BASIC'S COMMAND INTERP. LOOP
0384 019D RVEC21 RMB 3 $A8C4 RESET/SET/POINT COMMANDS
0385 01A0 RVEC22 RMB 3 $A910 CLS
0386 * $8162 EXBAS' SECONDARY TOKEN HANDLER
0387 * $8AFA EXBAS' RENUM TOKEN CHECK
0388 * $975C $C29A $C2B2 EXBAS' GET/PUT
0389 01A3 RVEC23 RMB 3 $B821 $8304 CRUNCH BASIC LINE
0390 01A6 RVEC24 RMB 3 $B7C2 UNCRUNCH BASIC LINE
0391.................................................................End RAM Hooks
0392 01A9 STRSTK RMB 8*5 STRING DESCRIPTOR STACK.....................String buffer area ($1A9-$1D0)
0393 01D1 CFNBUF RMB 9 CASSETTE FILE NAME BUFFER.....................Cassette filename length -Cassette filename buffer
0394 01DA CASBUF RMB 256 CASSETTE FILE DATA BUFFER...................Cassette file data buffer ($1DA-$2D8)
..... 01DA ..........................................................Cassette filename (in buffer) ($1DA-$1E1)
..... 01E2 ..........................................................Cassette file type, 0=program, 1=data, 2=machine code
..... 01E3...........................................................Cassette ASCII flag, 0=binary, FF=ASCII file
.....01E4 ...........................................................Cassette gap flag, 0=continuous, FF=gaps
.... 01E5 ...........................................................Execution address of machine code file
.... 01E7 ...........................................................Load address for ungapped machine code file
.... 02D9 ...........................................................BASIC line input buffer preamble ($2D9-$2DC)
.... 02DD ...........................................................BASIC line input buffer ($2DD-3D8)

0395 02DA LINHDR RMB 2 LINE INPUT BUFFER HEADER
0396 02DC LINBUF RMB LBUFMX+1 BASIC LINE INPUT BUFFER
0397 03D7 STRBUF RMB 41 STRING BUFFER
0398 03D9 .........................................................Buffer space ($3D9-$3EA)
.... 03EB .........................................................Unused in Dragon 32 ($3EB-$3FF)
0399 0400 VIDRAM RMB 200 VIDEO DISPLAY AREA
0400
0401 *START OF ADDITIONAL RAM VARIABLE STORAGE (DISK BASIC ONLY)
0402 0600 DBUF0 RMB SECLEN I/O BUFFER #0
0403 0700 DBUF1 RMB SECLEN I/O BUFFER #1
0404 0800 FATBL0 RMB FATLEN FILE ALLOCATION TABLE - DRIVE 0
0405 084A FATBL1 RMB FATLEN FILE ALLOCATION TABLE - DRIVE 1
0406 0894 FATBL2 RMB FATLEN FILE ALLOCATION TABLE - DRIVE 2
0407 08DE FATBL3 RMB FATLEN FILE ALLOCATION TABLE - DRIVE 3
0408 0928 FCBV1 RMB 16*2 FILE BUFFER VECTORS (15 USER, 1 SYSTEM)
0409 0948 RNBFAD RMB 2 START OF FREE RANDOM FILE BUFFER AREA
0410 094A FCBADR RMB 2 START OF FILE CONTROL BLOCKS
0411 094C DNAMBF RMB 8 DISK FILE NAME BUFFER
0412 0954 DEXTBF RMB 3 DISK FILE EXTENSION NAME BUFFER
0413 0957 DFLTYP RMB 1 *DV* DISK FILE TYPE: 0=BASIC, 1=DATA, 2=MACHINE
0414 * LANGUAGE, 3=TEXT EDITOR SOURCE FILE
0415 0958 DASCFL RMB 1 *DV* ASCII FLAG: 0=CRUNCHED OR BINARY, $FF=ASCII
0416 0959 DRUNFL RMB 1 RUN FLAG: (IF BIT 1=1 THEN RUN, IF BIT 0=1, THEN CLOSE
0417 * ALL FILES BEFORE RUNNING)
0418 095A DEFDRV RMB 1 DEFAULT DRIVE NUMBER
0419 095B FCBACT RMB 1 NUMBER OF FCBS ACTIVE
0420 095C DRESFL RMB 1 RESET FLAG: <>0 WILL CAUSE A 'NEW' & SHUT DOWN ALL FCBS
0421 095D DLOADFL RMB 1 LOAD FLAG: CAUSE A 'NEW' FOLLOWING A LOAD ERROR
0422 095E DMRGFL RMB 1 MERGE FLAG: 0=N0 MERGE, $FF=MERGE
0423 095F DUSRVC RMB 20 DISK BASIC USR COMMAND VECTORS
0424 *** DISK FILE WORK AREA FOR DIRECTORY SEARCH
0425 * EXISTING FILE
0426 0973 V973 RMB 1 SECTOR NUMBER
0427 0974 V974 RMB 2 RAM DIRECTORY IMAGE ADDRESS
0428 0976 V976 RMB 1 FIRST GRANULE NUMBER
0429 * UNUSED FILE
0430 0977 V977 RMB 1 SECTOR NUMBER
0431 0978 V978 RMB 2 RAM DIRECTORY IMAGE ADDRESS
0432
0433 097A WFATVL RMB 2 WRITE FAT VALUE: NUM OF FREE GRANS WHICH MUST BE TAKEN
0434 FROM THE FAT TO TRIGGER A WRITE FAT TO DISK SEQUENCE
0435 097C DFFLEN RMB 2 DIRECT ACCESS FILE RECORD LENGTH
0436 097E DR0TRK RMB 4 CURRENT TRACK NUMBER, DRIVES 0,1,2,3
0437 0982 NMIFLG RMB 1 NMI FLAG: 0=DON'T VECTOR <>0=YECTOR OUT
0438 0983 DNMIVC RMB 2 NMI VECTOR: WHERE TO JUMP FOLLOWING AN NMI
0439 * INTERRUPT IF THE NMI FLAG IS SET
0440 0985 RDYTMR RMB 1 MOTOR TURN OFF TIMER
0441 0986 DRGRAM RMB 1 RAM IMAGE OF DSKREG ($FF40)
0442 0987 DVERFL RMB 1 VERIFY FLAG: 0=OFF, $FF=ON
0443 0988 ATTCTR RMB 1 READ/WRITE ATTEMPT COUNTER: NUMBER OF TIMES THE
0444 * DISK WILL ATTEMPT TO RETRIEVE OR WRITE DATA
A6
COLOR BASIC UNRAVELLED II APPENDIX A
MEMORY MAP
ORIGIN:SPECTRAL ASSOC
REVISED:12/26/1999 WALTER K ZYDHEK
0445 * BEFORE IT GIVES UP AND ISSUES AN ERROR.
0446
0447 0989 DFLBUF RMB SECLEN INITIALIZED TO SECLEN BY DISKBAS




 

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 » 09 Sep 2017 04:43

INPUT DEVICE NUMBER CHECK ($A3ED - $A405) (Tiene HOOK en RAM)
PRINT DEVICE NUMBER CHECK ($A406 - $A415) (Tiene HOOK en RAM)

La primera rutina retorna si es pantalla, da error (BAD FILE MODE) si no es casete=-1, Da error (FILE NOT OPEN) si no esta abierto y Error (BAD FILE MODE) si no esta abierto para INPUT.

La segunda rutina retorna si no es casete, da error (FILE NOT OPEN) si no esta abierto y da error (BAD FILE MODE) si esta en INPUT ( osea no esta en OUTPUT)

Código: Seleccionar todo

0544         * INPUT DEVICE NUMBER CHECK
0545   A3ED BD 01 6D   LA3ED   JSR   RVEC5   HOOK INTO RAM
0546   A3F0 96 6F      LDA   DEVNUM   DEVICE NUMBER
0547   A3F2 27 21      BEQ   LA415   RETURN IF SCREEN
0548   A3F4 4C         INCA *
0549   A3F5 26 0C      BNE   LA403   * BRANCH IF NOT CASSETTE (BAD FILE MODE)
0550   A3F7 96 78      LDA   FILSTA   GET FILE STATUS
0551   A3F9 26 05      BNE   LA400   FILE IS OPEN
0552   A3FB C6 2C   LA3FB   LDB   #22*2   ‘FILE NOT OPEN’ ERROR
0553   A3FD 7E AC 46      JMP   LAC46   JUMP TO ERROR SERVICING ROUTINE
0554   A400 4A      LA400   DECA      *
0555   A401 27 12      BEQ   LA415   * FILE IS IN INPUT MODE, RETURN
0556   A403 7E A6 16   LA403   JMP   LA616   ‘BAD FILE MODE’ ERROR
0557
0558         * PRINT DEVICE NUMBER CHECK
0559   A406 BD 01 70   LA406   JSR   RVEC6   HOOK INTO RAM
0560   A409 96 6F      LDA   DEVNUM   GET DEVICE NUMBER
0561   A40B 4C         INCA      *
0562   A40C 26 07      BNE   LA415   * RETURN IF NOT TAPE
0563   A40E 96 78      LDA   FILSTA   GET FILE STATUS
0564   A410 27 E9      BEQ   LA3FB   ‘FILE NOT OPEN’ ERROR
0565   A412 4ª         DECA      *
0566   A413 27 EE      BEQ   LA403   * ‘BAD FILE MODE’ - FILE IN INPUT MODE
0567   A415 39      LA415   RTS


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 » 09 Sep 2017 13:30

CLOSE ($A416 - $A44B)
Función para cerrar archivos, cierra todos los archivos si no se especifica numero de archivo
Se puede especificar un número de archivo constante con el símbolo #, pero también puede evaluar una expresión sin el símbolo.

Código: Seleccionar todo

0569         * CLOSE
0570   A416 27 0E   CLOSE   BEQ   LA426   BRANCH IF NO NAME SPECIFIED
0571   A418 BD A5 A5      JSR   LA5A5   CHECK DEVICE NUMBER
0572   A41B 8D 10   LA41B   BSR   LA42D   GO CLOSE A FILE
0573   A41D 9D A5      JSR   GETCCH   GET CURRENT BASIC CHARACTER
0574   A41F 27 2A      BEQ   LA44B   RETURN IF NO MORE FILES
0575   A421 BD A5 A2      JSR   LA5A2   CHECK SYNTAX AND DEVICE NUMBER
0576   A424 20 F5      BRA   LA41B   KEEP CLOSING FILES
0577
0578         * CLOSE ALL FILES HANDLER
0579   A426 BD 01 73   LA426   JSR   RVEC7   HOOK INTO RAM
0580   A429 86 FF      LDA   #-1   CASSETTE DEVICE NUMBER
0581   A42B 97 6F      STA   DEVNUM   SET DEVICE NUMBER
0582         * CLOSE FILE HANDLER
0583   A42D BD 01 76   LA42D   JSR   RVEC8   HOOK INTO RAM
0584   A430 96 6F      LDA   DEVNUM   GET DEVICE NUMBER
0585   A432 0F 6F      CLR   DEVNUM   SET TO SCREEN
0586   A434 4C         INCA      *
0587   A435 26 14      BNE   LA44B   * BRANCH IF WAS NOT CASSETTE
0588   A437 96 78      LDA   FILSTA   GET FILE STATUS
0589   A439 81 02      CMPA   #2   IS IT OUTPUT MODE
0590   A43B 26 0C      BNE   LA449   NO
0591   A43D 96 79      LDA   CINCTR   GET CHARACTER BUFFER CTR
0592   A43F 27 03      BEQ   LA444   WRITE END OF PROG BLOCK IF BUFFER EMPTY
0593   A441 BD A2 A8      JSR   LA2A8   WRITE A BLOCK TO TAPE
0594   A444 C6 FF   LA444   LDB   #$FF   END OF FILE TYPE BLOCK NUMBER
0595   A446 BD A2 AA      JSR   LA2AA   WRITE END OF FILE TYPE BLOCK
0596   A449 0F 78      LA449   CLR   FILSTA CASSETTE FILE STATUS CLOSED
0597   A44B 39      LA44B   RTS
0598

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 » 09 Sep 2017 14:07

CSAVE name[,A] ($A44C - $A497) No tiene HOOK
Esta función graba un programa en casete en formato comprimido (igual que en memoria) o en ASCII con el parámetro "A"
Busca un nombre (obligatorio), chequea por "A" y saca un simple listado en casete, si no, graba $55' y bloques binarios.

Código: Seleccionar todo

0599         * CSAVE
0600   A44C BD A5 78   CSAVE   JSR   LA578   GO SCAN OFF NAME
0601   A44F 9D A5      JSR   GETCCH   GET CURRENT CHARACTER IN THE BASIC LINE
0602   A451 27 16      BEQ   LA469   BRANCH IF NONE
0603   A453 BD B2 6D      JSR   LB26D   SYNTAX ERROR IF NOT COMMA
0604   A456 C6 41      LDB   #'A   IS THIS AN ASCII SAVE?
0605   A458 BD B2 6F      JSR   LB26F   SYNTAX ERROR IF NOT ‘A’
0606   A45B 26 EE      BNE   LA44B   RETURN IF NOT END OF LINE
0607   A45D 4F         CLRA      FILE TYPE = 0
0608   A45E BD A6 5C      JSR   LA65C   WRITE OUT HEADER BLOCK
0609   A461 86 FF      LDA   #-1   CASSETTE CODE
0610   A463 97 6F      STA   DEVNUM   SET DEVICE NUMBER TO CASSETTE
0611   A465 4F         CLRA      CLEAR CARRY - FORCE LIST TO BEGIN AT PROGRAM START
0612   A466 7E B7 64      JMP   LIST   GO DO A ‘LIST’ TO CASSETTE
0613
0614         * NON-ASCII CSAVE
0615   A469 4F      LA469   CLRA      FILE TYPE = 0
0616   A46A 9E 8A      LDX   ZERO   ZERO OUT ASCII FLAG AND FILE MODE
0617   A46C BD A6 5F      JSR   LA65F   WRITE HEADER BLOCK
0618   A46F 0F 78      CLR   FILSTA   CLOSE FILES
0619   A471 0C 7C      INC   BLKTYP   INCREMENT BLOCK NUMBER
0620   A473 BD A7 D8      JSR   WRLDR   WRITE 55’S TO CASSETTE
0621   A476 9E 19      LDX   TXTTAB   ADDRESS OF PROGRAM START
0622   A478 9F 7E   LA478   STX   CBUFAD   STORE CURRENT BLOCK START ADDR
0623   A47A 86 FF      LDA   #255   255 BYTE BLOCKS
0624   A47C 97 7D      STA   BLKLEN   BLOCK SIZE
0625   A47E DC 1B      LDD   VARTAB   END OF PROGRAM
0626   A480 93 7E      SUBD   CBUFAD   CURRENT BLOCK STARTING ADDR
0627   A482 27 0D      BEQ   LA491   BRANCH IF IT CAME OUT EXACT
0628   A484 10 83 00 FF      CMPD   #255   MORE THAN 255 BYTES LEFT?
0629   A488 24 02      BHS   LA48C   YES
0630   A48A D7 7D      STB   BLKLEN   USE ACTUAL BLOCK SIZE IF LESS THAN 255
0631   A48C BD A7 F4   LA48C   JSR   SNDBLK   WRITE BLOCK TO CASSETTE
0632   A48F 20 E7      BRA   LA478   DO ANOTHER BLOCK
0633   A491 00 7C   LA491   NEG   BLKTYP   MAKE BLOCK NUMBER NEGATIVE (EOF BLOCK)
0634   A493 0F 7D      CLR   BLKLEN   ZERO BLOCK SIZE
0635   A495 7E A7 E7      JMP   LA7E7   WRITE A BLOCK, TURN OFF MOTOR
0636

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 » 09 Sep 2017 14:46

CLOAD/M ($A498 - $A53D)
Procesa la carga de un programa desde casete

Código: Seleccionar todo

0637         * CLOAD
0638   A498 0F 78   CLOAD   CLR   FILSTA   CLOSE FILES
0639   A49A 81 4D      CMPA   #'M   IS IT CLOADM?
0640   A49C 27 60      BEQ   LA4FE   BRANCH IF SO
0641   A49E 32 62      LEAS   2,S   GET RID OF THE RETURN
0642   A4A0 BD A5 C5      JSR   LA5C5   GO GET FILE NAME
0643   A4A3 BD A6 48      JSR   LA648   SEARCH FOR FILE
0644   A4A6 7D 01 E4      TST   CASBUF+10   GET FILE MODE (NON-ZERO=DATA OR ASCII)
0645   A4A9 27 1D      BEQ   LA4C8   ZERO = CRUNCHED BASIC OR MACHINE LANG
0646   A4AB B6 01 E3      LDA   CASBUF+9   GET ASCII FLAG
0647   A4AE 27 1D      BEQ   LA4CD   ‘BAD FILE NODE’ 0 = CRUNCHED OR MACH LANG
0648   A4B0 BD AD 19      JSR   LAD19   DO A ‘NEW’
0649   A4B3 86 FF      LDA   #-1   TAPE DEVICE NUMBER
0650   A4B5 97 6F      STA   DEVNUM   SET DEVICE NUMBER TO TAPE
0651   A4B7 0C 78      INC   FILSTA   FILE TYPE = INPUT
0652   A4B9 BD A6 35      JSR   LA635   GO LOAD ASCII RECORD
0653   A4BC 7E AC 7C      JMP   LAC7C   GO LOAD AND CRUNCH INPUT
0654
0655         * COME HERE FROM BASIC’S DIRECT LOOP IF CONSOLE
0656         * IN BUFFER EMPTY
0657   A4BF BD 01 85   LA4BF   JSR   RVEC13   HOOK INTO RAM
0658   A4C2 BD A4 2D      JSR   LA42D   CLOSE ACTIVE FILE
0659   A4C5 7E AC 73      JMP   LAC73   GO TO BASIC’S DIRECT LOOP
0660
0661         * CLOAD A CRUNCHED BASIC
0662   A4C8 B6 01 E2   LA4C8   LDA   CASBUF+8   FILE TYPE
0663   A4CB 27 03      BEQ   LA4D0   ZERO IS CSAVE TYPE
0664   A4CD 7E A6 16   LA4CD   JMP   LA616   ‘BAD FILE MODE’ IF NOT BASIC FILE
0665   A4D0 BD AD 19   LA4D0   JSR   LAD19   DO A ‘NEW’
0666   A4D3 BD A7 7C      JSR   CASON   TURN ON TAPE, START READING
0667   A4D6 9E 19      LDX   TXTTAB   GET START OF PROGRAM ADDRESS
0668   A4D8 9F 7E   LA4D8   STX   CBUFAD   STORE IT IN LOAD BUFFER
0669   A4DA DC 7E      LDD   CBUFAD   GET START ADDRESS TO D REG
0670   A4DC 4C         INCA      ADD 256 TO LOAD ADDRESS
0671   A4DD BD AC 37      JSR   LAC37   SEE IF ROOM BELOW STACK FOR ONE BLOCK
0672   A4E0 BD A7 0B      JSR   GETBLK   READ A BLOCK
0673   A4E3 26 13      BNE   LA4F8   GOT AN ERROR DURING READ
0674   A4E5 96 7C      LDA   BLKTYP   BLOCK NUMBER
0675   A4E7 27 0F      BEQ   LA4F8   I/O ERROR IF HEADER BLOCK TYPE
0676   A4E9 2A ED      BPL   LA4D8   REAR MORE IF BLOCK NUMBER POSITIVE
0677   A4EB 9F 1B      STX   VARTAB   SET END OF PROGRAM ADDRESS
0678   A4ED 8D 4C      BSR   LA53B   TURN OFF TAPE DECK
0679   A4EF 8E AB EC      LDX   #LABED-1   POINT TO ‘OK’ MESSAGE
0680   A4F2 BD B9 9C      JSR   LB99C   PRINT ‘OK’ TO CONSOLE OUT
0681   A4F5 7E AC E9      JMP   LACE9   RESET INPUT POINTER, CLEAR VARIABLES AND
0682         * RETURN TO MAIN LOOP OF BASIC
0683
0684   A4F8 BD AD 19   LA4F8   JSR   LAD19   DO A ‘NEW’
0685   A4FB 7E A6 19   LA4FB   JMP   LA619   ‘I/O ERROR’
0686
0687         * CLOADM
0688   A4FE 9D 9F   LA4FE   JSR   GETNCH   GET NEXT CHARACTER IN BASIC LINE
0689   A500 8D 76      BSR   LA578   GO SCAN OFF NAME
0690   A502 BD A6 48      JSR   LA648   SEARCH FOR FILE
0691   A505 9E 8A      LDX   ZERO   STORE ZERO TO X REG, DEFAULT OFFSET VALUE
0692   A507 9D A5      JSR   GETCCH   CHECK FOR AN OFFSET
0693   A509 27 06      BEQ   LA511   BRANCH IF NO OFFSET
0694   A50B BD B2 6D      JSR   LB26D   SYNTAX CHECK FOR COMMA
0695   A50E BD B7 3D      JSR   LB73D   EVALUATE OFFSET; RETURN VALUE IN X
0696   A511 B6 01 E2   LA511   LDA   CASBUF+8   CHECK FILE MODE
0697   A514 81 02      CMPA   #2   IS IT MACHINE LANGUAGE?
0698   A516 26 B5      BNE   LA4CD   ‘BAD FILE MODE’ ERROR IF NOT
0699   A518 FC 01 E5      LDD   CASBUF+11   GET TRANSFER ADDR FROM TAPE
0700   A51B 33 8B      LEAU   D,X   ADD OFFSET
0701   A51D DF 9D      STU   EXECJP   STORE TRANSFER ADDR IN EXEC ARGUMENT
0702   A51F 7D 01 E4      TST   CASBUF+10   CHECK FILE MODE
0703   A522 26 A9      BNE   LA4CD   ‘BAD FILE MODE’ ERROR
0704   A524 FC 01 E7      LDD   CASBUF+13   GET LOAD ADDR FROM TAPE
0705   A527 30 8B      LEAX   D,X   ADD OFFSET
0706   A529 9F 7E      STX   CBUFAD   STORE IN BUFFER START ADDRESS POINTER
0707   A52B BD A7 7C      JSR   CASON   START UP TAPE
0708   A52E BD A7 0B   LA52E   JSR   GETBLK   READ A BLOCK
0709   A531 26 C8      BNE   LA4FB   BRANCH IF I/O ERROR
0710   A533 9F 7E      STX   CBUFAD   STORE NEW START ADDR (ONE BLOCK HIGHER)
0711   A535 0D 7C      TST   BLKTYP   CHECK BLOCK NUMBER
0712   A537 27 C2      BEQ   LA4FB   BRANCH IF I/O ERROR (HEADER BLOCK)
0713   A539 2A F3      BPL   LA52E   GO READ SOME MORE
0714   A53B 7E A7 E9   LA53B   JMP   LA7E9   GO TURN OFF TAPE DECK
0715

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 » 09 Sep 2017 14:57

EXEC ($A53E - $A548)
Comienza la ejecución de un programa en lenguaje de maquina a partir de una dirección preestablecida o recién dada

Código: Seleccionar todo

0716         * EXEC
0717   A53E 27 05   EXEC   BEQ   LA545   BRANCH IF NO ARGUMENT
0718   A540 BD B7 3D      JSR   LB73D   EVALUATE ARGUMENT - ARGUMENT RETURNED IN X
0719   A543 9F 9D      STX   EXECJP   STORE X TO EXEC JUMP ADDRESS
0720   A545 6E 9F 00 9D   LA545   JMP   [EXECJP]   GO DO IT

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 » 09 Sep 2017 15:04

BREAK CHECK ($A549 - $A551)
Chequea por break solo si es pantalla

Código: Seleccionar todo

0722   * BREAK CHECK
0723   A549 BD 01 7F   LA549   JSR   RVEC11   HOOK INTO RAM
0724   A54C 96 6F      LDA   DEVNUM   GET DEVICE NUMBER
0725   A54E 4C         INCA      CHECK FOR TAPE
0726   A54F 27 50      BEQ   LA5A1   RETURN IF TAPE
0727   A551 7E AD EB      JMP   LADEB   GO DO BREAK KEY CHECK

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 » 09 Sep 2017 15:11

EVALUA UN ARGUMENTO Y CHEQUEA QUE ESTE DENTRO DE LA PANTALLA ($A554 - $A563)
Evalúa una expresión y verifica que no sea mayor de 511 (0-511), da error si es mayor pero si es menor toma 0
Luego coloca CURPOS en esa posición

Código: Seleccionar todo

0729         * THIS ROUTINE EVALUATES AN ARGUMENT
0730         * AND MAKES SURE IT IS WITHIN LIMITS OF VIDEO DISPLAY RAM
0731   A554 BD B3 E4 LA554      JSR   LB3E4   EVALUATE EXPRESSION AND RETURN VALUE IN ACCD
0732   A557 83 01 FF      SUBD   #511   ONLY 512 VIDEO DISPLAY LOCATIONS
0733   A55A 10 22 0E EC      LBHI   LB44A   BRANCH IF > 511 TO ‘ILLEGAL FUNCTION CALL’
0734   A55E C3 05 FF      ADDD   #VIDRAM+511   ADD BACK IN OFFSET + START OF VIDEO RAM
0735   A561 DD 88      STD   CURPOS   PUT THE CURSOR THERE
0736   A563 39         RTS

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 » 09 Sep 2017 20:53

INKEY$ ($A564 - $A575)
Retorna un tecla
Entre cada comando se chequea por break, y si se presiono alguna tecla queda una imagen en IKEYIM, entonces se retorna esta, si no, se busca por una nueva tecla.

Curiosamente no usa $A1C1 que tiene la eficiencia de ver si no hay teclas.
Lee una tecla, Borra IKEYIM (Tecla procesada) y la coloca en la ultima posición del FPA0, (sin borrarlo a cero?), luego lo convierte a STRING? en STRDES y si no hay tecla borra el string, ¿para que lo convierte si no hay tecla, en primer lugar?

Usa parcialmente la función CHR$
La tecla generada la guarda en espacio para STRING, y al parecer no es suficiente con un espacio temporal o con ponerla en STACK o con la imagen IKEYIM (bueno acá si es lógico que no se use ya que tiene que estar en cero si ya se leyó)

Usa el STRING STACK que es una zona de 8*5=40 bytes para almacenar max 8 descriptores de string para cálculos temporales

Código: Seleccionar todo

0738         * INKEY$
0739   A564 96 87   INKEY   LDA   IKEYIM   WAS A KEY DOWN IN THE BREAK CHECK?
0740   A566 26 03      BNE   LA56B   YES
0741   A568 BD A1 CB      JSR   KEYIN   GO GET A KEY
0742   A56B 0F 87   LA56B   CLR   IKEYIM   CLEAR INKEY RAM IMAGE
0743   A56D 97 53      STA   FPA0+3   STORE THE KEY IN FPA0
0744   A56F 10 26 11 1C      LBNE   LB68F   CONVERT FPA0+3 TO A STRING
0745   A573 97 56      STA   STRDES   SET LENGTH OF STRING = 0 IF NO KEY DOWN
0746   A575 7E B6 9B      JMP   LB69B   PUT A NULL STRING ONTO THE STRING STACK
0747

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 » 09 Sep 2017 21:07

STRIP A FILENAME OFF OF THE BASIC INPUT LINE ($A578 - $A599)
Toma un nombre de archivo desde la linea de entrada

MOVE ACCB BYTES FROM (X) TO (U) ($A599 - $A5A1)
Subrutina general para copiar B bytes desde X a U

Código: Seleccionar todo

0748         * STRIP A FILENAME OFF OF THE BASIC INPUT LINE
0749   A578 8E 01 D1   LA578   LDX   #CFNBUF   POINT TO FILE NAME BUFFER
0750   A57B 6F 80      CLR   ,X+   CLEAR THE FIRST BYTE - IT WILL CONTAIN THE COUNT
0751                  * OF THE NUMBER OF CHARACTERS IN THE NAME
0752   A57D 86 20      LDA   #SPACE   SPACE
0753   A57F A7 80   LA57F   STA   ,X+   BLANK FILL 8 CHARS
0754   A581 8C 01 DA      CMPX   #CASBUF   DONE?
0755   A584 26 F9      BNE   LA57F   NO
0756   A586 9D A5      JSR   GETCCH   GET CURRENT INPUT CHAR
0757   A588 27 17      BEQ   LA5A1   RETURN IF NO NAME
0758   A58A BD B1 56      JSR   LB156   GET THE FILE NAME - EVALUATE EXPRESSION
0759   A58D BD B6 54      JSR   LB654   POINT X TO START OF NAME (TOP STRING ON STRING STACK)
0760   A590 CE 01 D1      LDU   #CFNBUF   CASSETTE FILE NAME BUFFER
0761   A593 E7 C0      STB   ,U+   STORE THE NUMBER OF BYTES IN THE NAME
0762   A595 27 0A      BEQ   LA5A1   NULL NAME (BLANK NAME)
0763   A597 8C         FCB   SKP2   SKIP THE NEXT TWO BYTES
0764   A598 C6 08   LA598   LDB   #8   MOVE 8 BYTES
0765
0766         * MOVE ACCB BYTES FROM (X) TO (U)
0767   A59A A6 80   LA59A   LDA   ,X+   GET BYTE FROM X
0768   A59C A7 C0      STA   ,U+   STORE IT AT U
0769   A59E 5A         DECB      MOVED ALL BYTES?
0770   A59F 26 F9      BNE   LA59A   NO
0771   A5A1 39      LA5A1   RTS

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 » 09 Sep 2017 21:52

GET DEVICE NUMBER FROM BASIC LINE - CHECK VALIDITY ($A5A2 - $A5C4)
Esta rutina toma el numero de periférico en una linea de basic y lo chequea.

Chequea por coma, (no se donde se usa esa coma) close #1 no lleva coma input #1, (lleva la coma después?)
Luego ve si el próximo carácter es el símbolo "#", no como dice en la descripción en ingles (el próximo carácter es un numero?)
Después evalúa la expresión, la convierte en entero en "D", adiciona el bit mas significativo de ACCB en ACCA y asi save si esta fuera de -128 y +127, y no se para que, si es mucho rango?
Valida el #

Código: Seleccionar todo

0773         * GET DEVICE NUMBER FROM BASIC LINE - CHECK VALIDITY
0774   A5A2 BD B2 6D   LA5A2   JSR   LB26D   CHECK FOR COMMA, SYNTAX ERROR IF NONE
0775   A5A5 81 23   LA5A5   CMPA   #'#   IS NEXT CHARACTER A NUMBER?
0776   A5A7 26 02      BNE   LA5AB   NO
0777   A5A9 9D 9F      JSR   GETNCH   GET NEXT BASIC INPUT CHARACTER
0778   A5AB BD B1 41   LA5AB   JSR   LB141   EVALUATE EXPRESSION
0779   A5AE BD B3 ED   LA5AE   JSR   INTCNV   CONVERT FPA0 TO INTEGER, RETURN VALUE IN ACCD
0780   A5B1 59         ROLB       MSB OF ACCB TO CARRY
0781   A5B2 89 00      ADCA   #0   ADD MSB OF ACCB TO ACCA
0782   A5B4 26 69      BNE   LA61F   ‘DEVICE # ERROR’ IF ACCA<FF80 OR >007F
0783   A5B6 56         RORB      RESTORE ACCB
0784   A5B7 D7 6F      STB   DEVNUM   STORE B IN DEVICE NUMBER
0785   A5B9 BD 01 61      JSR   RVEC1   HOOK INTO RAM
0786   A5BC 27 06      BEQ   LA5C4   BRANCH IF DEVICE NUMBER SET TO SCREEN
0787   A5BE 2A 5F      BPL   LA61F   ‘DEVICE NUMBER’ ERROR IF POSITIVE DEVICE NUMBER
0788   A5C0 C1 FE      CMPB   #-2   LOWEST LEGAL DEVICE NUMBER
0789   A5C2 2D 5B      BLT   LA61F   ‘DEVICE NUMBER ERROR’
0790   A5C4 39      LA5C4   RTS

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 » 09 Sep 2017 21:59

BUSCA UN NOMBRE EN UNA LINEA BASIC ($A5C5 - $A5CD)
LLama a buscar nombre(descrita hace 2 post), pero da error si hay mas caracteres

Código: Seleccionar todo

0792         ** THIS ROUTINE WILL SCAN OFF THE FILE NAME FROM A BASIC LINE
0793         ** AND RETURN A SYNTAX ERROR IF THERE ARE ANY CHARACTERS
0794         ** FOLLOWING THE END OF THE NAME
0795   A5C5 8D B1   LA5C5   BSR   LA578   SCAN OFF NAME
0796   A5C7 9D A5      JSR   GETCCH   GET CURRENT INPUT CHAR FROM BASIC LINE
0797   A5C9 27 F9   LA5C9   BEQ   LA5C4   RETURN IF END OF LINE
0798   A5CB 7E B2 77      JMP   LB277   SYNTAX ERROR IF ANY MORE CHARACTERS
0799

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 » 09 Sep 2017 22:19

EOF (End Off File) ($A5CE - $A5EB) Tiene HOOK en RAM
Esta rutina retorna -1 si se alcanzo el final del archivo que se lee, si no 0

Carga el DEVNUM y lo guarda en el STACK porque la rutina LA5AE (CHECK DEVICE NUMBER) modifica DEVNUM
Chequea el numero, y chequea cuantos bytes quedan, retorna -1 su ya no quedan en el PUNTO FLOTANTE y en "D"

Código: Seleccionar todo

0799
0800         * EOF
0801   A5CE BD 01 88   EOF   JSR   RVEC14   HOOK INTO RAM
0802   5D1 96 6F      LDA   DEVNUM   GET DEVICE NUMBER
0803   A5D3 34 02      PSHS   A   SAVE IT
0804   A5D5 8D D7      BSR   LA5AE   CHECK DEVICE NUMBER
0805   A5D7 BD A3 ED      JSR   LA3ED   CHECK FOR PROPER FILE AND MODE
0806   A5DA 5F         CLRB      NOT EOF FLAG = 0
0807   A5DB 96 6F      LDA   DEVNUM   TEST DEVICE NUMBER
0808   A5DD 27 05      BEQ   LA5E4   BRANCH IF NOT SET TO DISPLAY
0809   A5DF 0D 79      TST   CINCTR   ANY CHARACTERS LEFT TO SEND?
0810   A5E1 26 01      BNE   LA5E4   YES
0811   A5E3 53         COMB      NO - EOF: SET FLAG = -1 ($FF)
0812   A5E4 35 02   LA5E4   PULS   A   GET DEVICE NUMBER BACK AGAIN
0813   A5E6 97 6F      STA   DEVNUM   RESTORE IT
0814   A5E8 1D      LA5E8   SEX      CONVERT ACCB TO 2 DIGIT SIGNED INTEGER
0815   A5E9 7E B4 F4      JMP   GIVABF   CONVERT ACCD TO FLOATING POINT


Volver a “Tandy CoCo”

¿Quién está conectado?

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