Omega-TI Posted July 25, 2018 Share Posted July 25, 2018 LOL it may come as a surprise to you but RXB can work with no 32K in just console with Cassette. Matter of fact in RXB doc shows how to make a Assembly program in scratch pad and run it with just Console. With 32K is even better. You have to remember I started with only a Cassette and Mini Memory cart myself. THAT would make a good video Rich! 1 Quote Link to comment Share on other sites More sharing options...
RXB Posted July 25, 2018 Share Posted July 25, 2018 (edited) THAT would make a good video Rich! I did make a video, problem is I never showed the 32K was not needed, which it was not. The demo moves screen to lower 8K with assembly in Scratch Pad, but I could have just moved from VDP screen to unused VDP instead. This also demos RXB 2018 change for CALL LINK(ADDRESS) to replace the previous RXB 2015 CALL EXECUTE(ADDRESS) Edited July 25, 2018 by RXB 1 Quote Link to comment Share on other sites More sharing options...
senior_falcon Posted July 25, 2018 Share Posted July 25, 2018 I did make a video, problem is I never showed the 32K was not needed, which it was not. The demo moves screen to lower 8K with assembly in Scratch Pad, but I could have just moved from VDP screen to unused VDP instead. How are you using assembly in scratch pad? You have CALL LOADs to two addresses: 9838 and 12032 which are both in low memory. CALL LOADing an assembly program to scratch pad ram would be tough - there is a lot going on there and not many of the addresses are safe. Quote Link to comment Share on other sites More sharing options...
RXB Posted July 25, 2018 Share Posted July 25, 2018 (edited) How are you using assembly in scratch pad? You have CALL LOADs to two addresses: 9838 and 12032 which are both in low memory. CALL LOADing an assembly program to scratch pad ram would be tough - there is a lot going on there and not many of the addresses are safe. Hmmm use the XB ROM routines instead just 2 bytes to execute it and they do all the work. 4074 7F7E AORG >7F7E 4076 4077 * (VDP to VDP) or (RAM to RAM) 4078 * WITHOUT ERAM : Move the contents in VDP RAM from a lower 4079 * address to a higher address avoiding a 4080 * possible over-write of data 4081 * >835C ARG : byte count 4082 * >8300 VAR0 : source address 4083 * >8306 VARY2 : destination address 4084 * WITH ERAM Same as above except moves ERAM to ERAM 4085 4086 7F7E C060 MVDN MOV @ARG,R1 Get byte count 7F80 835C 4087 7F82 C160 MOV @VARY2,R5 Get destination 7F84 8306 4088 7F86 C0E0 MOV @VAR0,R3 Get source 7F88 8300 4089 7F8A C1E0 MVDN2 MOV @RAMTOP,R7 ERAM or VDP? 7F8C 8384 4090 7F8E 1612 JNE MV01 ERAM, so handle it 4091 7F90 1002 JMP MV05 VDP, so jump into loop 99/4 ASSEMBLER MVDNS PAGE 0094 4092 7F92 0605 MVDN1 DEC R5 4093 7F94 0603 DEC R3 4094 7F96 MV05 EQU $ 4095 7F96 D7E0 MOVB @R3LB,*R15 Write out read address 7F98 83E7 4096 7F9A D7C3 MOVB R3,*R15 4097 7F9C D1E0 MOVB @XVDPRD,R7 Read a byte 7F9E 8800 4098 7FA0 D7E0 MOVB @R5LB,*R15 Write out write address 7FA2 83EB 4099 7FA4 0265 ORI R5,WRVDP Enable VDP write 7FA6 4000 4100 7FA8 D7C5 MOVB R5,*R15 4101 7FAA D807 MOVB R7,@XVDPWD Write the byte 7FAC 8C00 4102 7FAE 0601 DEC R1 One less byte to move 4103 7FB0 16F0 JNE MVDN1 Loop if more to move 4104 7FB2 045B RT 4105 7FB4 MV01 EQU $ 4106 7FB4 D553 MVDNZ1 MOVB *R3,*R5 Move a byte 4107 7FB6 0603 DEC R3 Decrement destination 4108 7FB8 0605 DEC R5 Decrement source 4109 7FBA 0601 DEC R1 One less byte to move 4110 7FBC 16FB JNE MVDNZ1 Loop if more to move 4111 7FBE 045B RT 4112 ************************************************************ And 4114 7FC0 AORG >7FC0 4116 4117 * (VDP to RAM) >834C=ADDR1,>8350=ADDR2,>834E=BCNT1 4118 * Move data from VDP to ERAM 4119 * @ADDR1 : Source address where the data stored on VDP 4120 * @ADDR2 : Destination address on ERAM 4121 * @BCNT1 : byte count 4122 4123 7FC0 VGWITE EQU $ 4124 7FC0 D7E0 MOVB @ADDR11,*R15 LSB of VDP address 7FC2 834D 4125 7FC4 C0A0 MOV @ADDR2,R2 Address in ERAM 7FC6 8350 4126 7FC8 D7E0 MOVB @ADDR1,*R15 MSB of VDP address 7FCA 834C 4127 7FCC 1000 NOP 4128 7FCE DCA0 VGZ1 MOVB @XVDPRD,*R2+ Move a byte 7FD0 8800 4129 7FD2 0620 DEC @BCNT1 One less to move 7FD4 834E 4130 7FD6 16FB JNE VGZ1 If not done, loop for more 4131 7FD8 045B RT Return 4132 ************************************************************ 4133 4134 7FDA AORG >7FDA 4136 4137 * Move data from ERAM to VDP (RAM to VDP) 4138 * @GSRC : Source address where the data stored on ERAM 4139 * @DEST : Destination address on VDP 4140 * @BCNT3 : byte count 4141 4142 7FDA C0A0 GVWITE MOV @DEST,R2 VDP address 99/4 ASSEMBLER GVWITES PAGE 0095 7FDC 8358 4143 7FDE D7E0 MOVB @R2LB,*R15 LSB of VDP address 7FE0 83E5 4144 7FE2 0262 ORI R2,WRVDP Enable VDP write 7FE4 4000 4145 7FE6 D7C2 MOVB R2,*R15 MSB of VDP address 4146 7FE8 C0E0 MOV @GSRC,R3 ERAM address 7FEA 8354 4147 7FEC D833 GVZ1 MOVB *R3+,@XVDPWD Move a byte 7FEE 8C00 4148 7FF0 0620 DEC @BCNT3 One less to move 7FF2 8356 4149 7FF4 16FB JNE GVZ1 If not done, loop for more 4150 7FF6 045B RT Return 4151 4152 7FFE AORG >7FFE 4153 7FFE 9226 DATA >9226 4154 4155 ************************************************************ 4156 4157 END Have not done it before but they do return to XB interpreter. Only one I have tested was SCROLL and it worked: 3447 7ADA AORG >7ADA 3449 3450 0005 FLG EQU 5 3451 3452 * R12 total number of bytes to move 3453 * R10 move from 3454 * R9 move to 3455 * R8 minor counter (buffer counter) 3456 * R7 buffer pointer 3457 3458 7ADA 020C SCROLL LI R12,736 Going to move 736 bytes 7ADC 02E0 3459 7ADE 020A LI R10,32 Address to move from 7AE0 0020 3460 7AE2 04C9 CLR R9 Address to move to 3461 7AE4 C18B MOV R11,R6 Save return address 3462 7AE6 06A0 BL @SCRO1 Scroll the screen 7AE8 7B10 3463 7AEA 0205 LI R5,XVDPWD Optimize for speed later 7AEC 8C00 3464 7AEE 0204 LI R4,>02E0 Addr of bottom line on screen 7AF0 02E0 3465 7AF2 0201 LI R1,>7F80 Edge character and space char 7AF4 7F80 99/4 ASSEMBLER SCROLLS PAGE 0080 3466 7AF6 0202 LI R2,28 28 characters on bottom line 7AF8 001C 3467 7AFA 06A0 BL @PUTV1 Init VDP & put out 1st edge ch 7AFC 6422 3468 7AFE D541 MOVB R1,*R5 Put out 2nd edge character 3469 7B00 06C1 SWPB R1 Bare the space character 3470 7B02 D541 SCRBOT MOVB R1,*R5 Write out space character 3471 7B04 0602 DEC R2 One less to move 3472 7B06 16FD JNE SCRBOT Loop if more 3473 7B08 06C1 SWPB R1 Bare the edge character again 3474 7B0A D541 MOVB R1,*R5 Output edge character 3475 7B0C D541 MOVB R1,*R5 Output edge character 3476 7B0E 0456 B *R6 And return go GPL 3477 * Generalized move routine 3478 7B10 04C8 SCRO1 CLR R8 Clear minor counter 3479 7B12 D7E0 MOVB @R10LB,*R15 Write out LSB of read-address 7B14 83F5 3480 7B16 02A7 STWP R7 Get the WorkSpace pointer 3481 7B18 D7CA MOVB R10,*R15 Write out MSB of read-address 3482 7B1A DDE0 SCRO2 MOVB @XVDPRD,*R7+ Read a byte 7B1C 8800 3483 7B1E 058A INC R10 Inc read-from address 3484 7B20 0588 INC R8 Inc minor counter 3485 7B22 060C DEC R12 Dec total counter 3486 7B24 1303 JEQ SCRO4 If all bytes read-write them 3487 7B26 0288 CI R8,12 Filled WorkSpace buffer area? 7B28 000C 3488 7B2A 11F7 JLT SCRO2 No, read more 3489 7B2C D7E0 SCRO4 MOVB @R9LB,*R15 Write LSB of write-address 7B2E 83F3 3490 7B30 0269 ORI R9,WRVDP Enable the VDP write 7B32 4000 3491 7B34 D7C9 MOVB R9,*R15 Write MSB of write-address 3492 7B36 02A7 STWP R7 Get WorkSpace buffer pointer 3493 7B38 D837 SCRO6 MOVB *R7+,@XVDPWD Write a byte 7B3A 8C00 3494 7B3C 0589 INC R9 Increment write-address 3495 7B3E 0608 DEC R8 Decrement counter 3496 7B40 16FB JNE SCRO6 Move more if not done 3497 7B42 C30C MOV R12,R12 More on major counter? 3498 7B44 16E5 JNE SCRO1 No, go do another read 3499 7B46 045B RT Yes, done Edited July 25, 2018 by RXB Quote Link to comment Share on other sites More sharing options...
RXB Posted July 25, 2018 Share Posted July 25, 2018 (edited) This look interesting. I have looked for it in the docs but could not find it. This was RXB 2015; maybe it is in a later version? Actually I did a demo at Chicago using RXB 2001 (in a GRAMULATOR) on just a TI99/4A console, but lost the demo I wrote when my SCSI hard drive failed. Use XB ROM's and Scratch Pad for assembly on just a console. You can change >8300 to >8312 without any problems in XB as long as you do not call certain routines that use these memory address. Also you can use ARG 32 bytes or FAC 32 bytes with some other restrictions, if you are careful from RXB. This would be impossible with other XB variants as they do not have any routines like those in RXB to pull this off. Edited July 25, 2018 by RXB Quote Link to comment Share on other sites More sharing options...
senior_falcon Posted July 28, 2018 Share Posted July 28, 2018 (edited) EA2XB by Harry Wilhelm This is a utility that will read programs that have been saved in EA5 format and use the files to create an Extended BASIC loader program. The loader program can then be saved as a normal XB program, loaded with OLD DSK1.PROGRAM, or loaded and run with RUN “DSK1.PROGRAM”. When the XB loader program is run it will copy the embedded files to their proper memory locations, recreate the Editor Assembler environment (except for the copyright symbol) and start up the program. XB is limited to 24K and there is a bit of overhead in the loader which means that EA5 programs can be no larger than 24376 or >5F38 bytes long to use this technique. If the EA5 program consists of more than 3 files then it will probably not fit. To use EA2XB type: CALL INIT CALL LOAD(“DSK1.EA2XB-O”) CALL LINK(“EA2XB”,”DSK1.EA5PROG”) The EA5 program files are read and an XB loader program is created if the EA5 program is small enough. Otherwise a “MEMORY FULL” error message is issued. You can add a remark to identify the program. Since it is now an XB program it can be saved to cassette with CASS24K. It can take up to 3 files in an EA5 program (plus the loader needed to run them in XB) and neatly combine them all into a single program. Always reload EA2XB-O before converting an EA5 program. There are two EA5 programs in the folder that you can test out: OHMUMMY and OHMUMMZ MS-P and MS-Q EA2XB.zip Edited July 29, 2018 by senior_falcon 8 Quote Link to comment Share on other sites More sharing options...
Asmusr Posted July 28, 2018 Share Posted July 28, 2018 Very nice. 1 Quote Link to comment Share on other sites More sharing options...
RXB Posted July 28, 2018 Share Posted July 28, 2018 Nice point Senior_Falcon I remember seeing this years ago. Quote Link to comment Share on other sites More sharing options...
senior_falcon Posted July 29, 2018 Share Posted July 29, 2018 Forgot to mention a couple of things: 1 - You can add a remark to identify the program. 2 - Since it is now an XB program it can be saved to cassette with CASS24K. 3 - It can take up to 3 files in an EA5 program (plus the loader needed to run them in XB) and combine them all into a single program. 4 Quote Link to comment Share on other sites More sharing options...
RXB Posted July 29, 2018 Share Posted July 29, 2018 (edited) Wait till you see my new RXB 2018 CALL BSAVE and CALL BLOAD that do pretty much the same thing. They were originally designed for SAMS but now you can save any memory do disk or hard drive. CALL BSAVE(2,"DSK4.M2",3,"DSK4.M3",A,"DSK4.MA",B,"DSK4.MB",C,"DSK4.MC",D,"DSK4.MD",E,"DSK4.ME",F,"DSK4.MF") This would save to DSK4 entire 32K memory currently in memory in 4K chunks to disk. CALL BSAVE(2,"DSK4.M2",3,"DSK4.M3",A,"DSK4.MA",B,"DSK4.MB",C,"DSK4.MC",D,"DSK4.MD",E,"DSK4.ME",F,"DSK4.MF") This would load from DSK4 entire 32K memory into current memory in 4K chunks from disk. As you can see memory is assigned locations of 2=>2000, 3=>3000, A=>A000, B=>B000 and so on.... Edited July 29, 2018 by RXB Quote Link to comment Share on other sites More sharing options...
senior_falcon Posted July 29, 2018 Share Posted July 29, 2018 Hmmm. Let me get this straight. You are taking an EA5 program which was originally saved in segments of 8K. You want to use BSAVE to save it in twice as many segments that are 4K long. What is the benefit in using twice as many files to do the same thing ? Quote Link to comment Share on other sites More sharing options...
RXB Posted July 29, 2018 Share Posted July 29, 2018 (edited) Hmmm. Let me get this straight. You are taking an EA5 program which was originally saved in segments of 8K. You want to use BSAVE to save it in twice as many segments that are 4K long. What is the benefit in using twice as many files to do the same thing ? Originally for SAMS, but can be used with any memory space. Say you load FW and save it, now load something else like DM2000 and save it In the SAMS you can to this and switch memory to execute the address to start these programs, but no reason I can not be done without a SAMS from Disk. See with 8K segments does not work very well with SAMS and making a 8K and 4K versions is just a huge waste of program space creating confusings to boot. By the way normal XB requires LINK to pull this off to start programs which means if that program is using EA instead it would not work, but RXB does not care as it just loads and saves then you Execute ADDRESS! I will in future demo all of this, got the SAMS and BLOAD and BSAVE routines all working now so can start making some demos. Edited July 29, 2018 by RXB Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.