Jump to content
IGNORED

Convert EA5 game to one single XB Int/Var file


jrhodes

Recommended Posts

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!

  • Like 1
Link to comment
Share on other sites

 

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 by RXB
  • Like 1
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by RXB
Link to comment
Share on other sites

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 by RXB
Link to comment
Share on other sites

gallery_34177_1071_213091.gif

 

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 by senior_falcon
  • Like 8
Link to comment
Share on other sites

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.

  • Like 4
Link to comment
Share on other sites

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 by RXB
Link to comment
Share on other sites

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 by RXB
Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...