Nuevo proyecto Basic CoCo/Dragon/DP400

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 09 Sep 2017 22:19

Último mensaje de la página anterior:

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

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 09 Sep 2017 22:32

SKIPF ($A5EC - $A5F5)

Busca un nombre de programa en casete, lo lee y al terminar se detiene

Código: Seleccionar todo

0817         * SKIPF
0818   A5EC 8D D7   SKIPF   BSR   LA5C5   SCAN OFF THE BASIC FILE NAME
0819   A5EE 8D 58      BSR   LA648   LOOK FOR THAT FILE ON TAPE
0820   A5F0 BD A6 D1      JSR   LA6D1   READ THE FILE
0821   A5F3 26 24      BNE   LA619   ‘I/O ERROR’
0822   A5F5 39         RTS

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 10 Sep 2017 18:49

BUSCA EL CORRECTO NOMBRE DE ARCHIVO EN CASETE ($A681 - $A700)
Esta rutina hace una búsqueda por el correcto nombre de archivos en casete.
En modo directo borra la pantalla, coloca una "S" y avanza el cursor, lee las cabeceras, y si el nombre es el correcto o no hay nombre o es "" pasa la letra a "F" y carga realmente el programa

Extrañamente el modo directo se reconoce por el MSB de CURLIN como $FF, aunque el máximo numero de linea es 63999 que es $F4FF. -shock
No se porque no usaron un máximo de ($FEFF) 65279, debe ser porque es un numero algo raro.
Ni ($FDFF) 65023 por no ser redondo en decimal?, ni siquiera 65000 ($FDE7) o 64999 ($FDE6), me imagino porque no es numero con el LSB lleno ($FF)
Y usaron 63999 ($F9FF) ya que 65000 ($FA00) es múltiplo de 10 y de 256, y es redondo en decimal y en hexadecimal. -grin
Yo hubiera usado $FEFF sin importar como se viera en decimal, y seria fácil de reconocer igualmente el modo directo con $FF

Código: Seleccionar todo

0918         * SEARCH FOR CORRECT CASSETTE FILE NAME
0919   A681 8E 01 DA   LA681   LDX   #CASBUF   CASSETTE BUFFER
0920   A684 9F 7E      STX   CBUFAD   LOAD ADDRESS POINTER
0921   A686 96 68   LA686   LDA   CURLIN   GET CURRENT LINE NUMBER MSB (CURLIN)
0922   A688 4C         INCA      IN DIRECT MODE IF ACCA = $FF
0923   A689 26 0B      BNE   LA696   BRANCH IF NOT DIRECT MODE
0924   A68B BD A9 28      JSR   LA928   CLEAR SCREEN
0925   A68E 9E 88      LDX   CURPOS   CURRENT SCREEN CHAR POSITION
0926   A690 C6 53      LDB   #'S   ‘S’ MEANS SEARCHING
0927   A692 E7 81      STB   ,X++   PUT AN ‘S’ ON THE SCREEN
0928   A694 9F 88      STX   CURPOS   STORE NEW CURSOR LOCATION
0929   A696 8D 69   LA696   BSR   LA701   READ ONE BLOCK FROM TAPE
0930   A698 DA 7C      ORB   BLKTYP   ‘OR’ ERROR FLAG WITH BLOCK NUMBER
0931   A69A 26 34      BNE   LA6D0   BRANCH IF NOT BLOCK ZERO OR ERROR
0932   A69C 8E 01 DA      LDX   #CASBUF   POINT TO CASSETTE BUFFER
0933   A69F CE 01 D2      LDU   #CFNBUF+1   POINT TO DESIRED NAME
0934   A6A2 C6 08      LDB   #8   EIGHT CHARACTERS MAX IN NAME
0935   A6A4 6F E2      CLR   ,-S   ZERO A BYTE ON THE STACK
0936   A6A6 A6 80   LA6A6   LDA   ,X+   GET CHAR FROM CASSETTE BLOCK
0937   A6A8 10 9E 68      LDY   CURLIN   GET CURLIN
0938   A6AB 31 21      LEAY   1,Y   DIRECT MODE?
0939   A6AD 26 05      BNE   LA6B4   FALL THROUGH IF DIRECT MODE
0940   A6AF 0F 6F      CLR   DEVNUM   SET DEVICE NUMBER TO SCREEN
0941   A6B1 BD A2 82      JSR   PUTCHR   OUTPUT A CHAR
0942   A6B4 A0 C0   LA6B4   SUBA   ,U+   SUBTRACT A CHAR FROM DESIRED NAME
0943                  NON-ZERO RESULT IF NO MATCH
0944   A6B6 AA E4      ORA   ,S   ‘OR’ WITH TOP OF STACK, RESULT WILL BE NON-ZERO IF MISMATCH
0945   A6B8 A7 E4      STA   ,S   SAVE IT
0946   A6BA 5A         DECB      DONE ALL 8 CHARACTERS?
0947   A6BB 26 E9      BNE   LA6A6   NO
0948   A6BD A6 E0      LDA   ,S+   SEE IF ALL CHARS WERE OK
0949   A6BF 27 0A      BEQ   LA6CB   BRANCH IF GOOD COMPARE
0950   A6C1 6D 57      TST   -9,U   CHECK THE NUMBER OF CHARACTERS IN THE CLOAD STATEMENT
0951   A6C3 27 06      BEQ   LA6CB   IF NO NAME SPECIFIED, ANY FILE IS OK
0952         * DIDN'T FIND THE RIGHT FILE IF HERE
0953 A6C5 8D 0A      BSR   LA6D1   LOOK FOR FILE
0954 A6C7 26 07      BNE   LA6D0   RETURN IF ERROR
0955 A6C9 20 BB      BRA   LA686   GO LOOK SOME MORE
0956 A6CB 86 46   LA6CB   LDA   #'F   *
0957 A6CD 8D 29      BSR   LA6F8   * PUT ‘F’ ON THE SCREEN IF DIRECT MODE
0958 A6CF 4F         CLRA      SET ZERO FLAG TO INDICATE NO ERRORS
0959 A6D0 39      LA6D0   RTS

0960 A6D1 7D 01 E4   LA6D1   TST   CASBUF+10   CHECK FILE MODE
0961 A6D4 26 09      BNE   LA6DF   BRANCH IF ASCII OR DATA
0962 A6D6 BD A7 7C      JSR   CASON   TURN ON TAPE DECK
0963 A6D9 8D 30   LA6D9   BSR   GETBLK   LOAD A BLOCK FROM TAPE
0964 A6DB 8D 08      BSR   LA6E5   CHECK FOR ERROR OR LAST BLOCK
0965 A6DD 20 FA      BRA   LA6D9   KEEP GOING
0966 A6DF 8D 20   LA6DF   BSR   LA701   READ ONE BLOCK FROM TAPE
0967 A6E1 8D 02      BSR   LA6E5   CHECK FOR ERROR OR LAST BLOCK
0968 A6E3 20 FA      BRA   LA6DF   KEEP READING BLOCKS
0969 A6E5 26 06   LA6E5   BNE   LA6ED   GOT AN ERROR ON READING IN BLOCK
0970 A6E7 96 7C      LDA   BLKTYP   GET BLOCK NUMBER
0971 A6E9 40         NEGA      CHECK FOR LAST BLOCK
0972 A6EA 2B 14      BMI   LA700   RETURN IF NOT AN END OF PROGRAM BLOCK
0973 A6EC 4A         DECA      IF BLOCK NUMBER WAS $FF, ACCA IS NOW ZERO - THIS WILL
0974         * CAUSE CLOAD TO IGNORE ERRORS IN THE
0975         * BLOCKS WHICH IT IS SKIPPING WHILE
0976         * LOOKING FOR THE CORRECT FILE NAME.
0977   A6ED 97 81   LA6ED   STA   CSRERR   STORE ACCA TO ERROR FLAG
0978   A6EF 32 62      LEAS   2,S   REMOVE RETURN ADDRESS FROM STACK
0979   A6F1 20 12      BRA   LA705   TURN OFF MOTOR

0980   A6F3 B6 04 00   LA6F3   LDA   VIDRAM   GET FIRST CHAR ON SCREEN
0981   A6F6 88 40      EORA   #$40   REVERSE THE VIDEO
0982   A6F8 D6 68   LA6F8   LDB   CURLIN   GET CURLIN MSB
0983   A6FA 5C         INCB      CHECK FOR DIRECT MODE
0984   A6FB 26 03      BNE   LA700   BRANCH IF NOT DIRECT MODE
0985   A6FD B7 04 00      STA   VIDRAM   PUT IT ON SCREEN
0986   A700 39      LA700   RTS


Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 10 Sep 2017 20:17

LEER UN BLOQUE DESDE EL CASETE ($A701 - $A748)
Esta rutina lee un bloque de casete.
Consta de una rutina que enciende el motor y busca $55 o su inversa $AA, luego lee un bloque, apaga el motor, toma el estado en ACCB y retorna
Y la verdadera rutina de leer bloque, que comienza en: $A70B GETBLK.
* Des-habilita las interrupciones, ya que es importante el tiempo en esta rutina,
* Invierte el primer carácter si esta en modo directo
* Toma un bit del bloque de casete en CARRY y lo pasa a ACCA por el MSB, y continua hasta encontrar $3C, (00111100).
* Entonces lee un byte y lo coloca en BLKTYP, Lee un byte para BLKLEN y lleva un CCKSUM.
* Chequea si el byte tiene el mismo valor que puso, si no, entonces da error, escribiendo fuera de RAM, (o ROM o PUERTOS) y se detiene
* Si todo va bien, lee la cantidad de bytes del bloque y retorna.
* Si hay error retorna 1 en CCKSUM y en ACCA o 2 si leyó fuera de RAM.

Código: Seleccionar todo

0987
0988         * READ A BLOCK FROM CASSETTE
0989   A701 8D 79   LA701   BSR   CASON   START TAPE, AND LOOK FOR A BUNCH OF $55 OR $AA BYTES
0990   A703 8D 06      BSR   GETBLK   READ A BLOCK
0991   A705 BD A7 E9   LA705   JSR   LA7E9   TURN OFF MOTOR
0992   A708 D6 81      LDB   CSRERR   GET ERROR STATUS
0993   A70A 39         RTS
0994   A70B 1A 50   GETBLK   ORCC      #$50 DISABLE IRQ,FIRQ
0995   A70D 8D E4      BSR   LA6F3   REVERSE VIDEO UPPER LEFT CHAR IF DIRECT MODE
0996   A70F 9E 7E      LDX   CBUFAD   GET LOAD ADDRESS
0997   A711 4F         CLRA      RESET ACCA
0998   A712 8D 41   LA712   BSR   LA755   READ A BIT FROM TAPE, RETURN IT IN CARRY FLAG
0999   A714 46         RORA      PUT BIT IN MSB OF ACCA
1000   A715 81 3C      CMPA   #$3C   GET SYNC’ED ON $3C
1001   A717 26 F9      BNE   LA712   NOT SYNC’ED YET
1002   A719 8D 2E      BSR   LA749   GET BLOCK NUMBER
1003   A71B 97 7C      STA   BLKTYP   SAVE IT
1004   A71D 8D 2A      BSR   LA749   GET CHAR COUNT
1005   A71F 97 7D      STA   BLKLEN   SAVE IT
1006   A721 9B 7C      ADDA   BLKTYP   ACCUMULATE CHECKSUM
1007   A723 97 80      STA   CCKSUM   SAVE IT
1008   A725 96 7D      LDA   BLKLEN   GET BACK CHAR COUNT
1009   A727 97 81      STA   CSRERR   TEMP SAVE
1010   A729 27 10      BEQ   LA73B   NULL SET OF CHARACTERS
1011   A72B 8D 1C   LA72B   BSR   LA749   GET BYTE FROM TAPE
1012   A72D A7 84      STA   ,X   FILL MEMORY WITH TAPE DATA
1013   A72F A1 80      CMPA   ,X+   SEE IF WE READ BACK SAME THING
1014   A731 26 11      BNE   LA744   BRANCH IF NOT PUTTING IT IN RAM
1015   A733 9B 80      ADDA   CCKSUM   ACCUMULATE CHECKSUM
1016   A735 97 80      STA   CCKSUM   TEMP STORE CHECKSUM
1017   A737 0A 81      DEC   CSRERR   DECR TEMP CHAR COUNT
1018   A739 26 F0      BNE   LA72B   GET ANOTHER CHARACTER
1019   A73B 8D 0C   LA73B   BSR   LA749   GET CHECKSUM FROM TAPE
1020   A73D 90 80      SUBA   CCKSUM   COMPARE TO CALCULATED CHECKSUM
1021   A73F 27 05      BEQ   LA746   BRANCH IF OK
1022   A741 86 01      LDA   #1   CHECKSUM ERROR FLAG
1023   A743 8C         FCB   SKP2   SKIP TWO BYTES
1024   A744 86 02   LA744   LDA   #2   NON-RAM ERROR FLAG
1025   A746 97 81   LA746   STA   CSRERR   1 IF CHECKSUM ERROR, 2 IF LOADING INTO NON-RAM
1026   A748 39         RTS

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 10 Sep 2017 20:52

LEE UN BYTE DESDE CASETE ($A749 - $A754)
Subrutina que lee un byte desde casete. que a su vez lee un bit que a su vez espera por un contador a 18 y si el cambio de 0 a 1 o viceversa es menor a 18 es un 1 (sonido agudo de 2200 Hz), si no es 0 (sonido de 1200 hz) dando un promedio de 1500 hz.

Tiene un problema, que cuando esta en modo de alta velocidad (POKE65495,0), e sonido aumenta de frecuencia al doble y la grabación queda con pitidos agudos y tarda la mitad del tiempo, pero no se puede leer, (no se aun porque) ya que el periodo en &H8F no se debe de cambiar de 18.
El periodo se puede cambiar para leer, con el equipo en alta velocidad una cinta en baja velocidad, colocando POKE&H8F,36.
o con el equipo en baja velocidad una cinta grabada en alta velocidad, colocando POKE&H8F,9, pero no es tan fácil ya que aunque se coloque el equipo en modo de alta velocidad y pueda escribir el casete luego no lo leerá.

Código: Seleccionar todo

1028         * GET A BYTE FROM TAPE
1029   A749 86 08   LA749   LDA   #8   8 BITS/BYTE
1030   A74B 97 82      STA   CPULWD   TEMP COUNTER
1031   A74D 8D 06   LA74D   BSR   LA755   READ A BIT FROM TAPE
1032   A74F 46         RORA      PUT IT INTO ACCA
1033   A750 0A 82      DEC   CPULWD   GOT ALL 8 BITS
1034   A752 26 F9      BNE   LA74D   NO
1035   A754 39         RTS


LEE UN BIT DESDE CASETE ($A755 - $A75C)

Código: Seleccionar todo

1037         * READ A BIT FROM THE TAPE
1038   A755 8D 06   LA755   BSR   LA75D   GET THE TIME BETWEEN TRANSITIONS
1039   A757 D6 83      LDB   CPERTM   * GET PERIOD TIMER
1040   A759 5A         DECB      *
1041   A75A D1 8F      CMPB   CMPMID   CMPMID CONTAINS 18 INITIALLY, AND IS USED TO DETERMINE
1042         *         WHETHER THE BIT READ IS A ONE OR ZERO
1043         *         IF THE PERIOD TIMER IS < 18, THE BIT
1044         *         IS CONSIDERED TO BE A ONE, IF > 18, IT IS ZERO
1045   A75C 39         RTS


CICLO PRINCIPAL DE TIEMPO ($A75D - $A762)

Código: Seleccionar todo

1047         * MAIN TIMING LOOP
1048   A75D 0F 83   LA75D   CLR   CPERTM   RESET PERIOD TIMER
1049   A75F 0D 84      TST   CBTPHA   CHECK TO SEE IF SYNC’ED ON THE HI-LO TRANSITION OR LO-HI
1050   A761 26 10      BNE   LA773   BRANCH ON HI-LO TRANSITION


ESPERA POR TRANSICIÓN DE BAJO A ALTO ($A763 - $A76B)

Código: Seleccionar todo

1051         * LO - HI TRANSITION
1052   A763 8D 07   LA763   BSR   LA76C   READ CASSETTE INPUT BIT
1053   A765 25 FC      BCS   LA763   LOOP UNTIL IT IS LO
1054   A767 8D 03   LA767   BSR   LA76C   READ CASSETTE INPUT DATA
1055   A769 24 FC      BCC   LA767   WAIT UNTIL IT GOES HI
1056   A76B 39         RTS


LEE EL BIT DE CASETE DEL PIA ($A76C - $A772)

Código: Seleccionar todo

1058         * READ CASSETTE INPUT BIT OF THE PIA
1059   A76C 0C 83   LA76C   INC   CPERTM   INCREMENT PERIOD TIMER
1060   A76E F6 FF 20      LDB   PIA1   GET CASSETTE INPUT BIT
1061   A771 56         RORB      PUT CASSETTE BIT INTO THE CARRY FLAG
1062   A772 39         RTS


ESPERA POR TRANSICIÓN DE ALTO A BAJO ($A773 - $A77B)

Código: Seleccionar todo

1064         * WAIT FOR HI - LO TRANSITION
1065   A773 8D F7   LA773   BSR   LA76C   READ CASSETTE INPUT DATA
1066   A775 24 FC      BCC   LA773   LOOP UNTIL IT IS HI
1067   A777 8D F3   LA777   BSR   LA76C   READ CASSETTE INPUT
1068   A779 25 FC      BCS   LA777   LOOP UNTIL IT IS LO
1069   A77B 39         RTS

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 10 Sep 2017 23:56

DETECTA LOS BYTES DE SINCRONISMO ($A77C - $A7BC)
Retorna ACCA=0 si sincroniza HI-LO y si es LO-HI retorna ACCA=$A0

Código: Seleccionar todo

1070
1071         *** LOOK FOR THE SYNC BYTES - RETURN WITH ACCA = 0 IF SYNC’ED
1072         *** ON HI - LO TRANSITION, ACCA = $A0 IF SYNC’ED ON THE
1073         *** LO - HI TRANSITION OF THE INPUT SIGNAL FROM THE CASSETTE.
1074   A77C 1A 50   CASON   ORCC   #$50   DISABLE IRQ,FIRQ
1075   A77E 8D 4A      BSR   LA7CA   TURN ON TAPE DECK MOTOR
1076   A780 0F 82      CLR   CPULWD   RESET UP TO SPEED COUNTER
1077   A782 8D DF   LA782   BSR   LA763   WAIT FOR LO-HI TRANSITION
1078   A784 8D 27   LA784   BSR   LA7AD   WAIT FOR HI-LO TRANSITION
1079   A786 22 0F      BHI   LA797   CASSETTE SPEED IN RANGE FOR 1200 HZ
1080   A788 8D 1D   LA788   BSR   LA7A7   WAIT FOR LO-HI TRANSITION
1081   A78A 25 0F      BCS   LA79B   CASSETTE SPEED IN RANGE FOR 2400 HZ
1082   A78C 0A 82      DEC   CPULWD   DECREMENT UP TO SPEED COUNTER IF SYNC’ED ON LO-HI
1083   A78E 96 82      LDA   CPULWD   GET IT
1084   A790 81 A0      CMPA   #-96   HAVE THERE BEEN 96 CONSECUTIVE 1-0-1-0 PATTERNS
1085   A792 26 EE   LA792   BNE   LA782   NO
1086   A794 97 84      STA   CBTPHA   SAVE WHICH TRANSITION (HI-LO OR LO-HI)
1087   A796 39         RTS
1088   A797 8D 0E   LA797   BSR   LA7A7   WAIT FOR LO-HI TRANSITION
1089   A799 22 E9      BHI   LA784   BRANCH IF TWO CONSECUTIVE 1200 HZ PULSES
1090   A79B 8D 10   LA79B   BSR   LA7AD   WAIT FOR HI-LO TRANSITION
1091   A79D 25 E9      BCS   LA788   BRANCH IF TWO CONSECUTIVE 2400 HZ PULSES
1092   A79F 0C 82      INC   CPULWD   INCREMENT UP TO SPEED COUNTER IF SYNC’ED ON HI-LO
1093   A7A1 96 82      LDA   CPULWD   GET IT
1094   A7A3 80 60      SUBA   #96   GOT ENOUGH SYNC PULSES? - ACCA WILL BE ZERO IF
1095         * THERE HAVE BEEN 96 CONSECUTIVE 0-1-0-1 PATTERNS
1096   A7A5 20 EB      BRA   LA792
1097   A7A7 0F 83   LA7A7   CLR   CPERTM   RESET PERIOD TIMER
1098   A7A9 8D BC      BSR   LA767   WAIT UNTIL CASSETTE INPUT GOES HI
1099   A7AB 20 04      BRA   LA7B1
1100   A7AD 0F 83   LA7AD   CLR   CPERTM   RESET PERIOD TIMER
1101   A7AF 8D C6      BSR   LA777   WAIT UNTIL CASSETTE GOES LO
1102   A7B1 D6 83   LA7B1   LDB   CPERTM   GET PERIOD TIMER
1103   A7B3 D1 90      CMPB   CMP0   UPPER LIMIT OF 1200 HZ PERIOD
1104   A7B5 22 03      BHI   LA7BA   BRANCH IF CASSETTE SPEED IS TOO SLOW OR DROPOUT
1105   A7B7 D1 91      CMPB   CMP1   UPPER LIMIT OF 2400 HZ PERIOD
1106   A7B9 39         RTS
1107   A7BA 0F 82   LA7BA   CLR   CPULWD   RESET UP TO SPEED COUNTER
1108   A7BC 39         RTS

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 11 Sep 2017 01:21

MOTORON/OFF ($A7BD - $A7D1)
Esta rutina analiza la linea con MOTOR y enciende o apaga el motor del casete según tenga adicional ON o OFF, este segundo comando puede escribirse separado, incluso por varios espacios o unido a MOTOR.
El MOTOR ON tiene un tiempo de espera antes de continuar que cuenta desde $FFFF hasta 0.

Para hacer un MOTOR ON directamente salte a $A7CA, EXEC &hA7CA=MOTOR ON

Las funciones primera segunda y quinta son para leer del casete
y algo desordenadas la tercera y cuarta son para escribir en casete

Código: Seleccionar todo

1110         * MOTOR
1111   A7BD 1F 89   MOTOR   TFR   A,B   SAVE CURRENT TOKEN IN ACCB
1112   A7BF 9D 9F      JSR   GETNCH   GET NEXT INPUT CHARACTER FROM BASIC
1113   A7C1 C1 AA      CMPB   #$AA   ‘OFF’ TOKEN
1114   A7C3 27 24      BEQ   LA7E9   YES
1115   A7C5 C1 88      CMPB   #$88   ‘ON’ TOKEN
1116   A7C7 BD A5 C9      JSR   LA5C9   SYNTAX ERROR IF IT WASN’T ‘ON’ OR ‘OFF’
1117   A7CA B6 FF 21      LA7CA   LDA   PIA1+1 READ CRA OF U4
1118   A7CD 8A 08      ORA   #$08   TURN ON BIT 3 WHICH ENABLES MOTOR DELAY
1119   A7CF 8D 1F      BSR   LA7F0   PUT IT BACK
1120   A7D1 9E 8A   LA7D1   LDX   ZERO   GET READY TO WAIT A WHILE


ESPERA MIENTRAS DECREMENTA X A CERO ($A7D3 - $A7D7)
Este delay esta en A7D3 y se puede usar aparte enviando X con el valor a decrementar

Código: Seleccionar todo

1122         * DELAY WHILE DECREMENTING X TO ZERO
1123   A7D3 30 1F   LA7D3   LEAX   -1,X   DECREMENT X
1124   A7D5 26 FC      BNE   LA7D3   BRANCH IF NOT ZERO
1125   A7D7 39         RTS


ENVIA LA CANTIDAD EN SYNCLN DE $55 AL CASETE ($A7D8 - $A7E4)

Código: Seleccionar todo

1127         * SEND SYNCLN $55’S TO TAPE
1128   A7D8 1A 50   WRLDR   ORCC   #$50   DISABLE INTERRUPTS
1129   A7DA 8D EE      BSR   LA7CA   TURN ON TAPE DECK MOTOR
1130   A7DC 9E 92      LDX   SYNCLN   GET COUNT OF $55’S TO SEND
1131   A7DE 8D 48   LA7DE   BSR   LA828   SEND $55 TO TAPE
1132   A7E0 30 1F      LEAX   -1,X   ARE ALL $55’S SENT?
1133   A7E2 26 FA      BNE   LA7DE   NO
1134   A7E4 39         RTS


ESCRIBE LOS BYTES DE SINCRONISMO Y UN BLOQUE ($A7E5 - $A7E7)

Código: Seleccionar todo

1136         * WRITE SYNC BYTES AND A BLOCK TO TAPE
1137   A7E5 8D F1   LA7E5   BSR   WRLDR   WRITE SYNC BYTES TO TAPE
1138   A7E7 8D 0B   LA7E7   BSR   SNDBLK   GO WRITE A BLOCK


APAGA EL MOTOR ($A7E9 - $A7F3)
Apaga el motor y activa las interrupciones
Para hacer MOTOR OFF salte a A7E9, EXEC &hA7E9

Código: Seleccionar todo

1140         * TURN OFF TAPE DECK MOTOR
1141   A7E9 1C AF   LA7E9   ANDCC   #$AF   ENABLE IRQ,FIRQ
1142   A7EB B6 FF 21      LDA   PIA1+1   READ CRA OF U4
1143   A7EE 84 F7      ANDA   #$F7   TURN OFF BIT 3
1144   A7F0 B7 FF 21   LA7F0   STA   PIA1+1   PUT IT BACK
1145   A7F3 39         RTS

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 11 Sep 2017 03:35

ESCRIBIR UN BLOQUE EN CASETE ($A7F4 - $A829)
Esta rutina creo que se puede mejorar ya que crea el checksum primero y luego envia los caracteres haciendo 2 loop de 256 bytes, creo que se puede hacer en uno.

Código: Seleccionar todo

1147         * WRITE A BLOCK TO CASSETTE
1148         * BUFFER SIZE IN BLKLEN
1149         * STARTING ADDR IN CBUFAD
1150         * BLOCK NUMBER IN BLKTYP
1151   A7F4 1A 50   SNDBLK   ORCC   #$50   DISABLE IRQ,FIRQ
1152   A7F6 D6 7D      LDB   BLKLEN   GET CHAR COUNT
1153   A7F8 D7 81      STB   CSRERR   TEMP CHAR COUNT
1154   A7FA 96 7D      LDA   BLKLEN   GET CHAR COUNT (INCLUDED IN CHECKSUM)
1155   A7FC 27 07      BEQ   LA805   BRANCH IF NO CHARACTERS - NULL
1156   A7FE 9E 7E      LDX   CBUFAD   GET STARTING ADDRESS
1157   A800 AB 80   LA800   ADDA   ,X+   CHECKSUM THE BUFFER
1158   A802 5A         DECB      DONE ALL CHARACTERS?
1159   A803 26 FB      BNE   LA800   NO
1160   A805 9B 7C   LA805   ADDA   BLKTYP   ADD IN THE BLOCK NUMBER
1161   A807 97 80      STA   CCKSUM   SAVE THE CHECKSUM
1162   A809 9E 7E      LDX   CBUFAD   GET STARTING ADDRESS
1163   A80B 8D 1B      BSR   LA828   SEND $55 TO TAPE
1164   A80D 86 3C      LDA   #$3C   SYNC CHAR
1165   A80F 8D 19      BSR   LA82A   SEND TO TAPE
1166   A811 96 7C      LDA   BLKTYP   GET BLOCK NUMBER
1167   A813 8D 15      BSR   LA82A   SEND BLOCK NUMBER TO TAPE
1168   A815 96 7D      LDA   BLKLEN   GET CHARACTER COUNT
1169   A817 8D 11      BSR   LA82A   SEND CHAR COUNT TO TAPE
1170   A819 4D         TSTA      SET FLAGS
1171   A81A 27 08      BEQ   LA824   BRANCH IF CHAR COUNT IS ZERO
1172   A81C A6 80   LA81C   LDA   ,X+   GET BUFFER CHARACTER
1173   A81E 8D 0A      BSR   LA82A   SEND BUFFER TO TAPE
1174   A820 0A 81      DEC   CSRERR   DECR TEMP CHAR COUNT
1175   A822 26 F8      BNE   LA81C   NOT DONE YET
1176   A824 96 80   LA824   LDA   CCKSUM   GET CHECKSUM
1177   A826 8D 02      BSR   LA82A   SEND CHECKSUM TO TAPE
1178   A828 86 55   LA828   LDA   #$55   SEND A $55 TO TAPE


ENVÍA ACCA AL CASETE ($A82A - $A83A)
Esta rutina envía un byte en ACCA al casete.
* Primero lo coloca "A" en el STACK
* En ACCB coloca un 1 que luego rotara hacia la izq para testear cada bit de "A" que esta en "S" y saltar a las dos rutinas de abajo

Código: Seleccionar todo

1180         * THIS ROUTINE SENDS THE A REG TO TAPE
1181   A82A 34 02   LA82A   PSHS   A    SAVE OUTPUT CHARACTER
1182   A82C C6 01      LDB   #1   ACCB CONTAINS A MASK USED TO DETERMINE WHETHER A
1183         * BIT IN THE OUTPUT CHARACTER IS HI OR LO
1184   A82E 96 85   LA82E   LDA   CLSTSN   GET THE ENDING VALUE OF THE LAST SINE CYCLE
1185   A830 B7 FF 20      STA   DA   STORE IN THE D/A CONVERTER
1186   A833 10 8E A8 5C      LDY   #LA85C   SINE LOOK-UP TABLE FOR GENERATING FSK
1187   A837 E5 E4      BITB   ,S   IS THE CURRENT BIT A ONE OR A ZERO ?
1188   A839 26 0D      BNE   LA848   IF A 1, DO HIGH FREQ


EMISIÓN DE UN BIT 0 EN BAJA FRECUENCIA 1200 Hz ($A83B - $A847)
Esta rutina se puede unir con la siguiente ya que son muy parecidas, habrá que ver.

Código: Seleccionar todo

1189         * LOW FREQUENCY LOOK UP
1190   A83B A6 A0   LA83B   LDA   ,Y+   USE EVERY BYTE IN TABLE IF LOW FREQUENCY
1191   A83D 10 8C A8 80      CMPY   #LA85C+36   END OF SINE TABLE?
1192   A841 27 12      BEQ   LA855   YES
1193   A843 B7 FF 20      STA   DA   SEND NEXT VALUE TO D/A CONVERTER
1194   A846 20 F3      BRA   LA83B   GET NEXT VALUE


EMISIÓN DE UN BIT 1 EN ALTA FRECUENCIA 2400 Hz ($A848 - $A85B)
Para esta emisión toma de 2 en 2 los datos.

Código: Seleccionar todo

1195         * HIGH FREQUENCY LOOK UP
1196   A848 A6 A1   LA848   LDA   ,Y++   USE EVERY OTHER BYTE IF HIGH FREQUENCY
1197   A84A 10 8C A8 80      CMPY   #LA85C+36   END OF SINE TABLE?
1198   A84E 27 05      BEQ   LA855   YES
1199   A850 B7 FF 20      STA   DA   SEND NEXT VALUE TO D/A CONVERTER
1200   A853 20 F3      BRA   LA848   GET NEXT VALUE
1201   A855 97 85   LA855   STA   CLSTSN   SAVE THE LAST VALUE SENT TO THE D/A CONVERTER
1202   A857 58         ASLB   SHIFT   MASK BIT LEFT
1203   A858 24 D4      BCC   LA82E   DONE WHEN MASK BIT IS SHIFTED INTO CARRY FLAG
1204   A85A 35 82      PULS   A,PC   RESTORE OUTPUT CHARACTER AND RETURN


TABLA DE VALORES PARA LA FORMA DE ONDA SENOSOIDAL ($A85C - $A880)
Los datos poseen cada valor con el bit 1 siempre encendido, para mantener el serial funcionando ya que esta en el mismo registro

Código: Seleccionar todo

1206         * THIS IS A LOOK-UP TABLE OF SINE VALUES FOR THE TAPE DECK FSK
1207         * (BIT 1 IS USED TO KEEP THE SERIAL OUTPUT MARKING)
1208   A85C 82 92 AA BA CA DA LA85C   FCB $82,$92,$AA,$BA,$CA,$DA
1209   A862 EA F2 FA FA FA F2   FCB $EA,$F2,$FA,$FA,$FA,$F2
1210   A868 EA DA CA BA AA 92   FCB $EA,$DA,$CA,$BA,$AA,$92
1211   A86E 7A 6A 52 42 32 22   FCB $7A,$6A,$52,$42,$32,$22
1212   A874 12 0A 02 02 02 0A   FCB $12,$0A,$02,$02,$02,$0A
1213   A87A 12 22 32 42 52 6A   FCB $12,$22,$32,$42,$52,$6A

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 11 Sep 2017 08:30

SET ($A880 - $A8B0)
Esta rutina procesa el comando SET
Se apoya en la rutina mas abajo y que la comparten los 3 comandos SET, RESET y POINT

Código: Seleccionar todo

1215         * SET
1216   A880 8D 3F   SET   BSR   LA8C1   GET ABSOLUTE SCREEN POSITION OF GRAPHICS BLOCK
1217   A882 34 10      PSHS   X   SAVE CHARACTER LOCATION
1218   A884 BD B7 38      JSR   LB738   SYNTAX CHECK FOR COMMA - RETURN EXPR VALUE IN ACCB
1219   A887 35 10      PULS   X   REGET CHARACTER LOCATION
1220   A889 C1 08      CMPB   #8   NINE ALLOWABLE COLORS
1221   A88B 22 48      BHI   LA8D5   ILLEGAL COLOR - ‘ILLEGAL FUNCTION CALL’
1222   A88D 5A         DECB   CHANGE   COLOR NUMBERS FROM 0-8 TO (-1 TO 7)
1223   A88E 2B 05      BMI   LA895   BRANCH IF SET (X,Y,0)
1224   A890 86 10      LDA   #$10   $10 OFFSET BETWEEN DIFFERENT COLORS
1225   A892 3D         MUL      MULT BY COLOR FOR TOTAL OFFSET
1226   A893 20 08      BRA   LA89D   GO SAVE THE COLOR
1227   A895 E6 84   LA895   LDB   ,X   GET CURRENT CHAR FROM SCREEN
1228   A897 2A 03      BPL   LA89C   BRANCH IF NOT GRAPHIC
1229   A899 C4 70      ANDB   #$70   SAVE ONLY THE COLOR INFO
1230   A89B 21         FCB   SKP1   SKIP THE NEXT BYTE
1231   A89C 5F      LA89C   CLRB   RESET   ASCII BLOCK TO ZERO COLOR
1232   A89D 34 04      PSHS   B   SAVE COLOR INFO
1233   A89F 8D 6C      BSR   LA90D   SYNTAX CHECK FOR ‘)‘
1234   A8A1 A6 84      LDA   ,X   GET CURRENT CHARACTER FROM SCREEN
1235   A8A3 2B 01      BMI   LA8A6   BRANCH IF GRAPHIC
1236   A8A5 4F         CLRA   RESET   ASCII CHARACTER TO ALL PIXELS OFF
1237   A8A6 84 0F   LA8A6   ANDA   #$0F   SAVE ONLY PIXEL ON/OFF INFO
1238   A8A8 9A 86      ORA   GRBLOK   ‘OR’ WITH WHICH PIXEL TO TURN ON
1239   A8AA AA E0      ORA   ,S+   ‘OR’ IN THE COLOR
1240   A8AC 8A 80   LA8AC   ORA   #$80   FORCE GRAPHIC
1241   A8AE A7 84      STA   ,X   DISPLAY IT ON THE SCREEN
1242   A8B0 39         RTS
1243

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 15 Sep 2017 05:18

RESET ($A8B1 - $A8C0)
Esta rutina procesa el RESET (X,Y)
Se apoya en la rutina mas abajo y que la comparten los 3 comandos SET, RESET y POINT

Código: Seleccionar todo

1244         * RESET
1245   A8B1 8D 0E   RESET   BSR   LA8C1   GET ABSOLUTE SCREEN ADDRESS OF THIS CHARACTER
1246   A8B3 8D 58      BSR   LA90D   SYNTAX CHECK FOR ")"
1247   A8B5 4F         CLRA      * ACCA=ZERO GRAPHIC BLOCK - FOR USE IN CASE YOU’RE
1248                  * TRYING TO RESET A NON GRAPHIC BLOCK
1249   A8B6 E6 84      LDB   ,X   GET CURRENT CHAR FROM SCREEN
1250   A8B8 2A F2      BPL   LA8AC   BRANCH IF NON-GRAPHIC
1251   A8BA 03 86      COM   GRBLOK   INVERT PIXEL ON/OFF MASK
1252   A8BC D4 86      ANDB   GRBLOK   AND IT WITH CURRENT ON/OFF DATA
1253   A8BE E7 84      STB   ,X   DISPLAY IT
1254   A8C0 39         RTS
1255

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 15 Sep 2017 05:21

Esta rutina lee y chequea los parámetros X,Y para los comandos SET, RESET y POINT ($A8C1 - $A8F4)

Código: Seleccionar todo

1256         *** THIS ROUTINE WILL CHECK SYNTAX AND CHECK FOR LEGAL VALUES
1257         *** OF SET,RESET & POINT HORIZONTAL AND VERTICAL PARAMETERS
1258         *** AND RETURN THEIR ABSOLUTE SCREEN ADDRESS IN THE X REGISTER
1259         *** WHICH OF THE FOUR PIXELS OF THE GRAPHIC BLOCK SELECTED
1260         *** IS RETURNED IN GRBLOK.
1261   A8C1 BD B2 6A   LA8C1   JSR   LB26A   SYNTAX CHECK FOR "("
1262   A8C4 BD 01 9D   LA8C4   JSR   RVEC21   HOOK INTO RAM
1263   A8C7 BD B7 0B      JSR   LB70B   EVALUATE EXPRESSION - RETURN VALUE IN ACCB
1264   A8CA C1 3F      CMPB   #63   ONLY 64 HORIZONTAL GRAPHIC BLOCKS
1265   A8CC 22 07      BHI   LA8D5   ‘ILLEGAL FUNCTION CALL’
1266   A8CE 34 04      PSHS   B   SAVE HOR COORD
1267   A8D0 BD B7 38      JSR   LB738   SYNTAX CHECK FOR COMMA AND EVALUATE EXPR
1268   A8D3 C1 1F      CMPB   #31   ONLY 32 VERTICAL BLOCKS
1269   A8D5 22 71   LA8D5   BHI   LA948   ‘ILLEGAL FUNCTION CALL’
1270   A8D7 34 04      PSHS   B   SAVE VERT COORD
1271   A8D9 54         LSRB      DIVIDE BY TWO BECAUSE THERE ARE 2 GRAPHIC PIXELS/HOR
1272         * CHARACTER POSITION (BYTE)
1273   A8DA 86 20      LDA   #32   32 BYTES/ROW
1274   A8DC 3D         MUL      GET ROW OFFSET OF CHAR POSITION
1275   A8DD 8E 04 00      LDX   #VIDRAM   SCREEN BUFFER ADDRESS
1276   A8E0 30 8B      LEAX   D,X   ADD ROW OFFSET TO SCREEN BUFFER ADDRESS
1277   A8E2 E6 61      LDB   1,S   GET HOR COORD
1278   A8E4 54         LSRB   2   VERTICAL PIXELS/CHARACTER POSITION
1279   A8E5 3A         ABX      ADD VERTICAL OFFSET TO CHARACTER ADDRESS
1280   A8E6 35 06      PULS   A,B   GET VER COORD TO ACCA, HOR COORD TO ACCB
1281   A8E8 84 01      ANDA   #1   KEEP ONLY LSB OF VER COORD
1282   A8EA 56         RORB   LSB   OF HOR COORD TO CARRY FLAG
1283   A8EB 49         ROLA   LSB   OF HOR TO BIT 0 OF ACCA
1284   A8EC C6 10      LDB   #$10   MAKE A BIT MASK - TURN ON BIT 4
1285   A8EE 54      LA8EE   LSRB      SHIFT IT RIGHT ONCE
1286   A8EF 4A         DECA      SHIFTED IT ENOUGH?
1287   A8F0 2A FC      BPL   LA8EE   NO
1288   A8F2 D7 86      STB   GRBLOK   ACCB=8 FOR UPPER LEFT PIXEL, =4 FOR UPPER RIGHT
1289         * PIXEL =2 FOR LOWER LEFT, =1 FOR LOWER RIGHT
1290   A8F4 39         RTS

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 15 Sep 2017 05:23

POINT ($A8F5 - $A90F)
Rutina de POINT

Código: Seleccionar todo

1292         * POINT
1293   A8F5 8D CD   POINT   BSR   LA8C4   EVALUATE EXPRESSION
1294   A8F7 C6 FF      LDB   #$FF   INITIAL VALUE OF ON/OFF FLAG = OFF (FALSE)
1295   A8F9 A6 84      LDA   ,X   GET CURRENT GRAPHIC CHARACTER
1296   A8FB 2A 0D      BPL   LA90A   BRANCH IF NON-GRAPHIC (ALWAYS FALSE)
1297   A8FD 94 86      ANDA   GRBLOK   ‘AND’ CURR CHAR WITH THE PIXEL IN QUESTION
1298   A8FF 27 08      BEQ   LA909   BRANCH IF THE ELEMENT IS OFF
1299   A901 E6 84      LDB   ,X   GET CURRENT CHARACTER
1300   A903 54         LSRB      * SHIFT RIGHT
1301   A904 54         LSRB      * SHIFT RIGHT
1302   A905 54         LSRB      * SHIFT RIGHT
1303   A906 54         LSRB      * SHIFT RIGHT - NOW THE HIGH NIBBLE IS IN THE LOW NIBBLE
1304   A907 C4 07      ANDB   #7   KEEP ONLY THE COLOR INFO
1305   A909 5C      LA909   INCB   ACCB=0   FOR NO COLOR, =1 T0 8 OTHERWISE
1306   A90A BD A5 E8   LA90A   JSR   LA5E8   CONVERT ACCB TO FLOATING POINT
1307   A90D 7E B2 67   LA90D   JMP   LB267   SYNTAX CHECK FOR ‘)‘

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 15 Sep 2017 05:31

CLS ($A910 - $A927)
Rutina que procesa el comando CLS
Aquí se ve claramente el huevo de pascua, que imprime Microsoft si el CLS es mayos de 8 y hasta 255

Código: Seleccionar todo

1309         * CLS
1310   A910 BD 01 A0   CLS   JSR   RVEC22   HOOK INTO RAM
1311   A913 27 13      BEQ   LA928   BRANCH IF NO ARGUMENT
1312   A915 BD B7 0B      JSR   LB70B   CALCULATE ARGUMENT, RETURN VALUE IN ACCB
1313   A918 C1 08      CMPB   #8   VALID ARGUMENT?
1314   A91A 22 1B      BHI   LA937   IF ARGUMENT >8, GO PRINT ‘MICROSOFT’
1315   A91C 5D         TSTB      SET FLAGS
1316   A91D 27 06      BEQ   LA925   COLOR 0
1317   A91F 5A         DECB      ACCB NOW CONTAINS 0-7
1318   A920 86 10      LDA   #$10   EACH GRAPHIC BLOCK SEPARATED BY $10 FROM ONE ANOTHER
1319   A922 3D         MUL      ACCB CONTAINS ONE OF 8 OFFSETS
1320   A923 CA 0F      ORB   #$0F   BITS 0-3 SET FOR SOLID COLOR GRAPHIC BLOCK
1321   A925 CA 80   LA925   ORB   #$80   BIT 7 SET FOR GRAPHICS
1322   A927 8C         FCB   SKP2   SKIP TWO BYTES


Borra la pantalla ($A928 - $A93E)

Código: Seleccionar todo

1324         * CLEAR SCREEN
1325   A928 C6 60   LA928   LDB   #$60   BLANK
1326   A92A 8E 04 00      LDX   #VIDRAM   GET ADDR OF START OF SCREEN BUFFER
1327   A92D 9F 88   LA92D   STX   CURPOS   SAVE IT IN CURPOS
1328   A92F E7 80   LA92F   STB   ,X+   FILL SCREEN WITH CONTENTS OF ACCB
1329   A931 8C 05 FF      CMPX   #VIDRAM+511   END OF SCREEN?
1330   A934 23 F9      BLS   LA92F   NO
1331   A936 39         RTS
1332   A937 8D EF   LA937   BSR   LA928   CLEAR SCREEN
1333   A939 8E A1 65      LDX   #LA166-1   *
1334   A93C 7E B9 9C      JMP   LB99C   * PRINT ‘MICROSOFT’

Avatar de Usuario
pser1
Mensajes: 4097
Registrado: 08 Dic 2012 18:34
Agradecido : 1354 veces
Agradecimiento recibido: 1121 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor pser1 » 15 Sep 2017 12:08

Hola Luis,
cuando puedas léete este hilo:
http://archive.worldofdragon.org/phpBB3 ... f=5&t=5629
que es que culpable de que se vaya a dar por cerrado este nuestro:
viewtopic.php?f=51&t=200033313

Por cierto, Luis, estás transcribiendo línea a línea el desensamblado de los Basic unravelled de CoCo.
¿Es necesario crear tantísimos posts? Igual subiendo el(los) pdf que contiene(n) todo, sería suficiente.
Incluso diría yo que ya se subieron en algún momento.
Es un trabajo excesivo para mi gusto, pero tu eres quien está 'pringando', yo preferiría leer un post
indicando lo que hace un comando, lo que nos gustaría que hiciera y empezar a trabajar en ello.
Posiblemente requerirá el uso de la memoria alta a partir de $E000 hasta $FEFF, pero 8k extras
es mucho espacio para ir metiendo los posibles parches.
Para ir probando bastaría con pasar el ordenador a MAPA1 (todo RAM) y copiar previamente el BASIC y el DOS
allí, luego se puede 'parchear' lo que haga falta poniendo JMP $Exxx donde haga falta y al acabar en el código
añadido regresar al punto siguiente al parcheado. Así hice mi extender para el DOSPlus5.0, pasito a pasito!
Es una opinión, no iría mal que algún otro compañero que esté siguiendo este hilo nos diera la suya también.
ánimo y saludos
pere

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 15 Sep 2017 15:04

Evalúa la duración ($A93F - $A948)
Pequeña rutina para chequear la coma, si comienzas en $A93F
y desde $A942 evalua la una expresión de 1-255 y retornarla en ACC-B
La duración no puede ser cero(0), solamente de 1 a 255. fuera de este rango da FC= Illegal function call o llamada ilegal a función

Código: Seleccionar todo

1336   A93F BD B2 6D   LA93F   JSR   LB26D   SYNTAX CHECK FOR A COMMA
1337   A942 BD B7 0B   LA942   JSR   LB70B   EVALUATE EXPRESSION, RETURN VALUE IN ACCB, FC ERROR IF >255
1338   A945 5D            TSTB         SET FLAGS
1339   A946 26 3C         BNE   LA984   RETURN IF NON ZERO
1340   A948 7E B4 4A   LA948   JMP   LB44A   ‘ILLEGAL FUNCTION CALL’ IF ZERO


SOUND ($A94B - $A973)
Procesa el comando SOUND
La evaluación de la frecuencia es de 1-255 y la de la duración tambien y ambas lo retornan en Acc-B, por eso usan la misma rutina anterior
Utiliza una onda casi cuadrada de 2.5V, 5V, 2.5V, 0V, almacenando en el D/A los valores 7E,FE,7E,2, algo como ____------TTTTT-----_____
Y espera a que las interrupciones terminen la duración del sonido.
Lo que no entiendo, es que, si termina el sonido por interrupciones, porque no cambia de voltaje tambien por interrupciones y así podría dejar libre el equipo para hacer otra cosa a la vez.
Otra cosa que me molesta es porque no usan el tiempo para hacer varias formas de onda, ya que no cuesta nada, obviamente, no hay espacio.

Mejora: Se pueden poner 2 versiones, una como esta y otra por interrupciones, que deje libre el equipo.
* Usar un parámetro mas para, por ejemplo: 64 valores en un string con la forma de onda, con algunas formas de onda en constantes de string, como por ejemplo:
SIN$=64 valores según Seno. ~~~~~~~~~~~~, Para obtener la máxima frecuencia (255) solo toma 4 valores, bajando la frecuencia a 254 puede tomar 8 valores, 253 para 16 valores, 252 para 32 valores y 251 para 64 valores, o sea que 251 seria la máxima frecuencia para apreciar los 64 valores y niveles.Para el casete ya hay una data senosoidal que se podría usar
SQUARE$=0v,5v,0v,5v (se necesitan mínimo 4 valores ya que la duración es *4 y para que coloque todos los valores, claro, se puede repetir automáticamente. |_|T|_|
TRIAN$=Onda triangular. /\/\/\/\/\/\/\/\
SIERRA$=Onda diente de sierra, derecha o izquierda algo como /|/|/|/| o |\|\|\|\|\|\
Estos valores deben tener el BIT 0 apagado y habría que forzarlo
* Otro parámetro que se puede implementar es el Volumen, esto es fácil, simplemente bajar los máximos a menos de 5V o, lo que es lo mismo, que las formas de onda no lleguen al máximo. incluso podrían auto modificar los valores pasados.
* Podría contemplarse el uso del Orchestra 90 ya que es solo un D/A doble (esterero) de 8 bit en lugar de 6, o sea que puede usarse inclusive las mismas formas de onda
* Otros sistemas de audio.
* Envelope, o forma de envoltorio, esto se refiere a como se modifica el volumen con respecto al tiempo,y tiene un tiempo de Ataque(Atack), Drenaje (Drain), Sustancia(Sustain), Drenaje 2(Drain2) y Relajación(Release).

Código: Seleccionar todo

1342         * SOUND
1343   A94B 8D F5   SOUND   BSR   LA942   EVALUATE EXPRESSION FREQUENCY, (de 1-255 y retorna en B)
1344   A94D D7 8C      STB   SNDTON   SAVE IT
1345   A94F 8D EE      BSR   LA93F   EVALUATE EXPRESSION SOUND LENGTH
1346   A951 86 04      LDA   #4   CONSTANT FACTOR
1347   A953 3D         MUL      EXPAND LENGTH EXPRESSION
1348   A954 DD 8D      STD   SNDDUR   SAVE LENGTH OF SOUND, (Duración desde 4-1024 de 4 en 4)
1349   A956 B6 FF 03      LDA   PIA0+3   GET CONTROL REGISTER OF PIA0, PORT B
1350   A959 8A 01      ORA   #1   *
1351   A95B B7 FF 03      STA   PIA0+3   * ENABLE 60 HZ INTERRUPT (PIA0 IRQ)
1352   A95E 0F 08      CLR   ARYDIS   CLEAR THE ARRAY DISABLE FLAG - FOR NO APPARENT REASON
1353   A960 8D 40      BSR   LA9A2   CONNECT D/A SOUND INPUT TO OUTPUT OF SOUND MUX
1354   A962 8D 12      BSR   LA976   TURN ON AUDIO - ENABLE SOUND MUX
1355   A964 8D 1F   LA964   BSR   LA985   STORE 2.5 VOLTS TO D/A AND WAIT
1356   A966 86 FE      LDA   #$FE   DATA TO MAKE D/A OUT = 5 VOLTS
1357   A968 8D 1D      BSR   LA987   STORE IT TO D/A AND WAIT
1358   A96A 8D 19      BSR   LA985   STORE 2.5 VOLTS TO D/A AND WAIT
1359   A96C 86 02      LDA   #2   DATA TO MAKE D/A OUT = 0 VOLTS
1360   A96E 8D 17      BSR   LA987   STORE IT TO D/A AND WAIT
1361   A970 9E 8D      LDX   SNDDUR   * IS SNDDUR = 0? - THE IRQ INTERRUPT SERVICING
1362         * * ROUTINE WILL DECREMENT SNDDUR
1363   A972 26 F0      BNE   LA964   NOT DONE YET


ACTIVA O DESACTIVA EL MULTIPLEXOR ANALOGICO ($A974 - $A984)

Código: Seleccionar todo

1365         * THESE ROUTINES WILL ENABLE/DISABLE THE ANALOG MUX
1366   A974 4F      LA974   CLRA      BIT 3 OF ACCA = 0, DISABLE ANALOG MUX
1367   A975 8C         FCB   SKP2   SKIP TWO BYTES
1368   A976 86 08   LA976   LDA   #8   BIT 3 OF ACCA = 1, ENABLE ANALOG MUX
1369   A978 A7 E2      STA   ,-S   SAVE ACCA ON STACK
1370   A97A B6 FF 23      LDA   PIA1+3   GET CONTROL REGISTER OF PIA1, PORT B
1371   A97D 84 F7      ANDA   #$F7   RESET BIT 3
1372   A97F AA E0      ORA   ,S+   OR IN BIT 3 OF ACCA (SAVED ON STACK)
1373   A981 B7 FF 23      STA   PIA1+3   SET/RESET CB2 OF U4
1374   A984 39      LA984   RTS


COLOCA EL VALOR DE ACCA EN EL D/A Y ESPERA($A985 - $A98F)
Desde $A985 coloca $7F, en ACCA, para la mitad del voltaje 2.5V en el conversor D/A
Desde $A987 coloca ACCA en el conversor D/A
Y desde A98A Loop de tiempo perdido hasta que termina el tiempo según la frecuencia, si esta frecuencia es alta, el contador empieza en ese número y aumenta hasta pasar 255 y en cero para, por eso en las altas frecuencias termina mas rápido.

Código: Seleccionar todo

1375   A985 86 7E   LA985   LDA   #$7E   DATA VALUE TO MAKE D/A OUTPUT = 2.5 VOLTS
1376   A987 B7 FF 20   LA987   STA   DA   STORE IT IN D/A
1377   A98A 96 8C      LDA   SNDTON   GET FREQUENCY
1378   A98C 4C      LA98C   INCA      INCREMENT IT
1379   A98D 26 FD      BNE   LA98C   LOOP UNTIL DONE
1380   A98F 39         RTS


AUDIO ($A990 - $A9A2)
Simplemente enciende o apaga la salida de audio
Puede mejorarse para que funcione tambien con orchestra 90 y otras salidas de audio.

Código: Seleccionar todo

1382         * AUDIO
1383   A990 1F 89   AUDIO   TFR   A,B   SAVE ON/OFF TOKEN IN ACCB
1384   A992 9D 9F      JSR   GETNCH   MOVE BASIC POINTER TO NEXT CHARACTER
1385   A994 C1 AA      CMPB   #$AA   ‘OFF’ TOKEN?
1386   A996 27 DC      BEQ   LA974   YES - TURN OFF ANALOG MUX
1387   A998 C0 88      SUBB   #$88   ‘ON’ TOKEN
1388   A99A BD A5 C9      JSR   LA5C9   SYNTAX ERROR IF NOT ‘OFF’ OR ‘ON’
1389   A99D 5C         INCB      NOW ACCB = 1
1390   A99E 8D 02      BSR   LA9A2   ROUTE CASSETTE TO SOUND MULTIPLEXER
1391   A9A0 20 D4      BRA   LA976   ENABLE SOUND MULTIPLEXER


SELECTOR DEL MULTIPLEXOR ANALOGICO (A9A2 - A9B2)
RUTINA PARA TRANSFERIR EL BIT 0 DE ACCB A SEL 1 DEL MULTIPLEXOR ANALOGICO Y EL BIT 1 DE ACCB AL SEL 2.

Código: Seleccionar todo

1393         * THIS ROUTINE WILL TRANSFER BIT 0 OF ACCB TO SEL 1 OF
1394         * THE ANALOG MULTIPLEXER AND BIT 1 OF ACCB TO SEL 2.
1395   A9A2 CE FF 01   LA9A2   LDU   #PIA0+1   POINT U TO PIA0 CONTROL REG
1396   A9A5 8D 00      BSR   LA9A7   PROGRAM 1ST CONTROL REGISTER
1397   A9A7 A6 C4   LA9A7   LDA   ,U   GET PIA CONTROL REGISTER
1398   A9A9 84 F7      ANDA   #$F7   RESET CA2 (CB2) OUTPUT BIT
1399   A9AB 57         ASRB      SHIFT ACCB BIT 0 TO CARRY FLAG
1400   A9AC 24 02      BCC      LA9B0 BRANCH IF CARRY = ZERO
1401   A9AE 8A 08      ORA   #$08   FORCE BIT 3=1; SET CA2(CB2)
1402   A9B0 A7 C1   LA9B0   STA   ,U++   PUT IT BACK IN THE PIA CONTROL REGISTER
1403   A9B2 39         RTS


IRQ SERVICE ($A9B3 - $A9C5)
Esta es la rutina de interrupción usada para terminar la duración del sonido

Código: Seleccionar todo

1405         * IRQ SERVICE
1406   A9B3 B6 FF 03   BIRQSV   LDA   PIA0+3   CHECK FOR 60HZ INTERRUPT
1407   A9B6 2A 0D      BPL   LA9C5   RETURN IF 63.5 MICROSECOND INTERRUPT
1408   A9B8 B6 FF 02      LDA   PIA0+2   RESET PIA0, PORT B INTERRUPT FLAG
1409   A9BB BE 00 8D      LDX   >SNDDUR   GET INTERRUPT TIMER (SOUND COMMAND)
1410   A9BE 27 05      BEQ   LA9C5   RETURN IF TIMER = 0
1411   A9C0 30 1F      LEAX   -1,X   DECREMENT TIMER IF NOT = 0
1412   A9C2 BF 00 8D      STX   >SNDDUR   SAVE NEW TIMER VALUE
1413   A9C5 3B      LA9C5   RTI      RETURN FROM INTERRUPT

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor luiscoco » 15 Sep 2017 15:22

pser1 escribió:Hola Luis,
cuando puedas léete este hilo:
http://archive.worldofdragon.org/phpBB3 ... f=5&t=5629
que es que culpable de que se vaya a dar por cerrado este nuestro:
http://www.retrowiki.es/viewtopic.php?f=51&t=200033313

Bueno claro, pero hay que ver en cuanto sale, luego lo leo mejor

pser1 escribió:Por cierto, Luis, estás transcribiendo línea a línea el desensamblado de los Basic unravelled de CoCo.
¿Es necesario crear tantísimos posts? Igual subiendo el(los) pdf que contiene(n) todo, sería suficiente.
Incluso diría yo que ya se subieron en algún momento.
Es un trabajo excesivo para mi gusto, pero tu eres quien está 'pringando', yo preferiría leer un post
indicando lo que hace un comando, lo que nos gustaría que hiciera y empezar a trabajar en ello.
Posiblemente requerirá el uso de la memoria alta a partir de $E000 hasta $FEFF, pero 8k extras
es mucho espacio para ir metiendo los posibles parches.
Para ir probando bastaría con pasar el ordenador a MAPA1 (todo RAM) y copiar previamente el BASIC y el DOS
allí, luego se puede 'parchear' lo que haga falta poniendo JMP $Exxx donde haga falta y al acabar en el código
añadido regresar al punto siguiente al parcheado. Así hice mi extender para el DOSPlus5.0, pasito a pasito!
Es una opinión, no iría mal que algún otro compañero que esté siguiendo este hilo nos diera la suya también.
ánimo y saludos
pere

Si claro, tienes toda la razón, Lo que quiero es dejar tozos donde colocar las mejoras que hagamos, con un indice en el principal, por eso lo hago, posiblemente quite el código basic actual pero quedaría la discusión de comando.
Porque si se hace en un solo post, no se entiende, ya veras que después con el indice queda mas o menos bien.

Lo de empezar, estoy muy de acuerdo, cuando quieras empezamos, cual ensamblador te gusta, aunque también tengo uno, pero no me quiero liar.
Alguna preferencia?

Avatar de Usuario
pser1
Mensajes: 4097
Registrado: 08 Dic 2012 18:34
Agradecido : 1354 veces
Agradecimiento recibido: 1121 veces

Re: Nuevo proyecto Basic CoCo/Dragon/DP400

Mensajepor pser1 » 15 Sep 2017 15:58

luiscoco escribió:Si claro, tienes toda la razón, Lo que quiero es dejar tozos donde colocar las mejoras que hagamos, con un indice en el principal, por eso lo hago, posiblemente quite el código basic actual pero quedaría la discusión de comando.
Porque si se hace en un solo post, no se entiende, ya veras que después con el indice queda mas o menos bien.
Lo de empezar, estoy muy de acuerdo, cuando quieras empezamos, cual ensamblador te gusta, aunque también tengo uno, pero no me quiero liar.
Alguna preferencia?

Para editar textos en ensamblador, yo utilizo el TextPad en mi PC.
Una vez finalizada la edición lo compilo con ASM6809 de Ciaran Anscomb (Sixxie) o bien con LWASM de las LWTOOLS (William Astle)
cuando quiero controlar ciclos de reloj (optimizar velocidad de ejecución)
El binario que sale de cualquiera de los dos lo puedo cargar en XRoar mediante Control+L, así puedo grabarlo en disco,
si quiero guardarlo para mas adelante.
El tema es: ¿A que nos dedicamos? Al Basic de CoCo o al de Dragón? Porqué hacer uno único que funcione en los dos, dudo que
seamos capaces sin dedicar SEMANAS al análisis detallado de las implicaciones que comporta: De entrada por poca cosa que toques,
los D.O.S. respectivos dejarán de funcionar ya que hacen multitud de llamadas a SU Basic y las 'entradas' que llevan a cabo cada
comando o palabra reservada son diferentes y están en distinta posición de memoria -banghead
saludos
pere


Volver a “Tandy CoCo”

¿Quién está conectado?

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