You are on page 1of 18

*

* Sound F/X - 1991 - Barry Boone


*
AORG >2000
DEF START,ISTART
NO9938
NOEXP
NOCPU
NOSCRT
NOGEN

DATA
DATA
DATA
DATA
DATA

0
0
0
0
0

-1
-1
-1
-1
-1

=3D
=3D
=3D
=3D
=3D

No
No
No
No
No

9938 RAM used


EXP VRAM used
CPU RAM used
SC/SS RAM used
9640 RAM used

GENFLG
SCFLAG
SSFLAG
VDPFLG
EXPFLG
SSPGS
SCEND
VDPPGS
VDPEND
EXPPGS
EXPEND
VIDSIZ
MEMSIZ
GENMEM
CHNFLG

DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

-1 =3D Geneve, else 99/4A


-1 =3D Supercart, else not
-1 =3D 32K Scart, else not
-1 =3D 9938 present, else not
-1 =3D 9938 Expansion VRAM present
# of SS pages in use/# of Geneve pages in use
Last addr used in last page (9640 or SC)
# of 9938 vid pages in use
last addr in last block of 9938 vram
# of 9938 exp vid pages used
last addr in last block of exp vram
buffer size of block 0 vram buffer
Combined size of all buffers (in 1K increments)
# of 9640 memory pages available
Chained files flag

CSR
SPC

BYTE '_'
BYTE ' '

* these can be EQU'd to the 2nd word in an LI instruction, if mem gets tight
D7
D8
D10
D16
D18
D24
D64
D96
D760

DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA

7
8
10
16
18
24
64
96
760

SSPCDT BYTE 2,8,>20,>80


NREGS BYTE >00,>F0,>00,>0E,>01
BYTE >06,>01,>F4
AMPLVL
GIFOPL
CVTOPL
OPNFIL
SNDMEM
ENDADR
FXH
TSTIT
H9938

DATA
DATA
DATA
DATA
DATA
DATA
TEXT
DATA
DATA

0
>0409
>0489
0
0
0
'FX'
0
>9938

Current Amplification Level


-1 =3D file opened!
-1 =3D Sound file in memory
On 99/4a, is end of sound in memory
Header for FX files

BLKDAT DATA >9090,>9090,>9090,>9090


DATA >9090,>9090,>9090,>9090

Volume tables
Each entry is repeated 16 times so

DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
BLKDA2 DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA

>9191,>9191,>9191,>9191
>9191,>9191,>9191,>9191
>9292,>9292,>9292,>9292
>9292,>9292,>9292,>9292
>9393,>9393,>9393,>9393
>9393,>9393,>9393,>9393
>9494,>9494,>9494,>9494
>9494,>9494,>9494,>9494
>9595,>9595,>9595,>9595
>9595,>9595,>9595,>9595
>9696,>9696,>9696,>9696
>9696,>9696,>9696,>9696
>9797,>9797,>9797,>9797
>9797,>9797,>9797,>9797
>9898,>9898,>9898,>9898
>9898,>9898,>9898,>9898
>9999,>9999,>9999,>9999
>9999,>9999,>9999,>9999
>9A9A,>9A9A,>9A9A,>9A9A
>9A9A,>9A9A,>9A9A,>9A9A
>9B9B,>9B9B,>9B9B,>9B9B
>9B9B,>9B9B,>9B9B,>9B9B
>9C9C,>9C9C,>9C9C,>9C9C
>9C9C,>9C9C,>9C9C,>9C9C
>9D9D,>9D9D,>9D9D,>9D9D
>9D9D,>9D9D,>9D9D,>9D9D
>9E9E,>9E9E,>9E9E,>9E9E
>9E9E,>9E9E,>9E9E,>9E9E
>9F9F,>9F9F,>9F9F,>9F9F
>9F9F,>9F9F,>9F9F,>9F9F
>B0B0,>B0B0,>B0B0,>B0B0
>B0B0,>B0B0,>B0B0,>B0B0
>B1B1,>B1B1,>B1B1,>B1B1
>B1B1,>B1B1,>B1B1,>B1B1
>B2B2,>B2B2,>B2B2,>B2B2
>B2B2,>B2B2,>B2B2,>B2B2
>B3B3,>B3B3,>B3B3,>B3B3
>B3B3,>B3B3,>B3B3,>B3B3
>B4B4,>B4B4,>B4B4,>B4B4
>B4B4,>B4B4,>B4B4,>B4B4
>B5B5,>B5B5,>B5B5,>B5B5
>B5B5,>B5B5,>B5B5,>B5B5
>B6B6,>B6B6,>B6B6,>B6B6
>B6B6,>B6B6,>B6B6,>B6B6
>B7B7,>B7B7,>B7B7,>B7B7
>B7B7,>B7B7,>B7B7,>B7B7
>B8B8,>B8B8,>B8B8,>B8B8
>B8B8,>B8B8,>B8B8,>B8B8
>B9B9,>B9B9,>B9B9,>B9B9
>B9B9,>B9B9,>B9B9,>B9B9
>BABA,>BABA,>BABA,>BABA
>BABA,>BABA,>BABA,>BABA
>BBBB,>BBBB,>BBBB,>BBBB
>BBBB,>BBBB,>BBBB,>BBBB
>BCBC,>BCBC,>BCBC,>BCBC
>BCBC,>BCBC,>BCBC,>BCBC
>BDBD,>BDBD,>BDBD,>BDBD
>BDBD,>BDBD,>BDBD,>BDBD
>BEBE,>BEBE,>BEBE,>BEBE
>BEBE,>BEBE,>BEBE,>BEBE

as to ignore the second nibble in


a sound byte

DATA
DATA
BLKDA3 DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA

>BFBF,>BFBF,>BFBF,>BFBF
>BFBF,>BFBF,>BFBF,>BFBF
>D0D0,>D0D0,>D0D0,>D0D0
>D0D0,>D0D0,>D0D0,>D0D0
>D1D1,>D1D1,>D1D1,>D1D1
>D1D1,>D1D1,>D1D1,>D1D1
>D2D2,>D2D2,>D2D2,>D2D2
>D2D2,>D2D2,>D2D2,>D2D2
>D3D3,>D3D3,>D3D3,>D3D3
>D3D3,>D3D3,>D3D3,>D3D3
>D4D4,>D4D4,>D4D4,>D4D4
>D4D4,>D4D4,>D4D4,>D4D4
>D5D5,>D5D5,>D5D5,>D5D5
>D5D5,>D5D5,>D5D5,>D5D5
>D6D6,>D6D6,>D6D6,>D6D6
>D6D6,>D6D6,>D6D6,>D6D6
>D7D7,>D7D7,>D7D7,>D7D7
>D7D7,>D7D7,>D7D7,>D7D7
>D8D8,>D8D8,>D8D8,>D8D8
>D8D8,>D8D8,>D8D8,>D8D8
>D9D9,>D9D9,>D9D9,>D9D9
>D9D9,>D9D9,>D9D9,>D9D9
>DADA,>DADA,>DADA,>DADA
>DADA,>DADA,>DADA,>DADA
>DBDB,>DBDB,>DBDB,>DBDB
>DBDB,>DBDB,>DBDB,>DBDB
>DCBC,>DCBC,>DCBC,>DCBC
>DCDC,>DCDC,>DCDC,>DCDC
>DDDD,>DDDD,>DDDD,>DDDD
>DDDD,>DDDD,>DDDD,>DDDD
>DEDE,>DEDE,>DEDE,>DEDE
>DEDE,>DEDE,>DEDE,>DEDE
>DFDF,>DFDF,>DFDF,>DFDF
>DFDF,>DFDF,>DFDF,>DFDF

BLKTB1 DATA
DATA
BLKTB2 DATA
DATA
BLKTB3 DATA
DATA

>9091,>9293,>9495,>9697
>9899,>9A9B,>9C9D,>9E9F
>B0B1,>B2B3,>B4B5,>B6B7
>B8B9,>BABB,>BCBD,>BEBF
>D0D1,>D2D3,>D4D5,>D6D7
>D8D9,>DADB,>DCDD,>DEDF

Volume tables for the second nibble

* This routine sets the maximum frequency on all three generators


SNDINI DATA >8100,>A100,>C100
ISTART LI R0,SNDINI
LI R15,>8400
SNDINL MOVB *R0+,*R15
CI R0,SNDINI+6
JNE SNDINL
* Further initialisation deleted (screen, etc).
*
*
*
*
*
*
*

Here is the F/X play module


This part is quite complicated because it tries to access sound data in
every possible memory device, both for the TI-99/4A and the Geneve.
Basically it sets pointers and calls the sound playing routines (possibly
copying them in fast memory first)

FXPLAY ABS @SNDMEM


JNE FXPLY2
B
@ISTART

if no sound loaded, exit

FXPLY2 BLWP
DATA
LI
LI
MOV
JEQ
LI
LI
CI
JEQ
DEC
LI
LI

@VMBWD
934,PLYTXT,12
R8,>8300
R9,>832A
@DELCNT,R0
FXPLY3
R8,TIPLP
R9,TIVLP
R0,1
FXPLY3
@DELCNT
R8,TIPLPD
R9,TIVLPD

Message

R12,>0800
R13,>8800
R15,>8400
R0,>8300
R3,TIPLP
R4,TIPLP$-TIPLP
*R3+,*R0+
R4
LODPAD

CRU for page device


VDP read port
Sound chip port
Where to copy playing routine

@VIDSIZ,R2
R0,>080C
R0,@>8C02
R0
R0,@>8C02
@VDPPGS,R4
R5,1
R1,>A000
@NO9938
HITIT
*R9
CKPCPU

Buffer size
Set VDP address

R2,>4000
R4
PLVLP1
@VDPEND,R2
@>83AB,@>8C06
R0
R0,@>8C02
R5
R0,@>8C02
*R9
R4,R4
PLVLP

Page size

Play data from CPU mem


Play data from VDP mem
if 0, use 11 KHz player
Ditto, but routines in slow memory

Ditto, but routines have delay

FXPLY3
LI
LI
LI
LI
LI
LI
LODPAD MOV
DECT
JNE
MOV
LI
MOVB
SWPB
MOVB
MOV
LI
LI
ABS
JEQ
BL
JMP
PLVLP LI
DEC
JNE
MOV
PLVLP1 MOVB
CLR
MOVB
INC
MOVB
HITIT BL
MOV
JNE
ABS
JNE
MOV
CLR

@NOEXP
VDRSET
@EXPPGS,R4
R5

Copy routine to fast memory

# of 9938 pages in use


Start with page 1
Sound data in high-mem expansion
TMS9938 RAM use
Call playing routine

This is R5, lsbyte: set page


Start from VDP address >0000
Next page
Call playing routine
More pages to come
No exp VRAM used
This part for Geneve only (9938 VDP)
Start from page 0

LI
MOVB
SWPB
MOVB
PLELP LI
DEC
JNE
MOV
PLELP1 MOVB
CLR
MOVB
INC
MOVB
BL
MOV
JNE
LI
MOVB
SWPB
MOVB
VDRSET MOVB

R0,>40AD
R0,@>8C02
R0
R0,@>8C02
R2,>4000
R4
PLELP1
@EXPEND,R2
@>83AB,@>8C06
R0
R0,@>8C02
R5
R0,@>8C02
*R9
R4,R4
PLELP
R0,>00AD
R0,@>8C02
R0
R0,@>8C02
@BYT0,@>8C06

CKPCPU ABS
JNE
MOV
BL
ABS
JNE
MOV
CLR
SSPLLP LDCR
LI
DEC
JNE
MOV
SSPLY LI
BL
INC
MOV
JNE

@NOCPU
CKP964
@ENDADR,R2
*R8
@NOSCRT
SKPZIT
@SSPGS,R4
R5
@SSPCDT(R5),8
R2,>8000
R4
SSPLY
@SCEND,R2
R1,>6000
*R8
R5
R4,R4
SSPLLP

CKP964 ABS
JNE
MOV
LI
P964LP MOVB
LI
DEC
JNE
MOV
P96PLY LI
BL
MOV
JNE
MOVB

@NOGEN
SKPZIT
@SSPGS,R4
R5,MEM964
*R5+,@>8005
R2,>C000
R4
P96PLY
@SCEND,R2
R1,>A000
*R8
R4,R4
P964LP
@SVA000,@>8005

SKPZIT CI
JNE
INC
SKPZT2 B

R8,TIPLPD
SKPZT2
@DELCNT
@ISTART

Page size
Last page: stop here
Set page (this is R5 lsb)
Set VDP address >0000
Next page
Call playing routine
More pages to come
Set VDP address as >00AD

Reset page
No CPU RAM used
Sound is in CPU RAM, get end address
Call playing routine
No SS/SC RAM used
# of SS/SC pages
Bank 0
Select bank
Till end of bank
Last page: till there
Sound is in >6000 bank
Call playing routine
Next bank

No 9640 RAM used


For Geneve only
List of pages
Set a page
End of bank

Beginning of bank
Call sound playing routine
More pages to come
Reset page

* Sound playing routines


* TI-99/4A 11 KHz routines. Currently >54 bytes long (>8300->8354)
* For faster execution, these routines may be copied in scratch-pad memory
* They modulate the volume of the 3 sound generators from data used nibble-by-ni
bble.
* This routine runs at >8300. It gets sound data from CPU memory.
* Data ptr in R1, end pointer in R2
TIPLP MOVB *R1+,R3
Get sound data
SRL R3,8
MOVB @BLKDAT(R3),*R15
Use leftmost nibble, ignore rightmost
MOVB @BLKDA2(R3),*R15
(because tables have 16 identical entries)
MOVB
SRC
SRC
ANDI
MOVB
MOVB
MOVB
C
JNE
RT

@BLKDA3(R3),*R15
R3,8
R3,8
R3,>F
@BLKTB1(R3),*R15
@BLKTB2(R3),*R15
@BLKTB3(R3),*R15
R1,R2
TIPLP

Keep only rightmost nibble

Done?
Not yet

* This one gets sound data from VDP memory


TIVLP MOVB *R13,R3
>832A
SRL R3,8
MOVB @BLKDAT(R3),*R15
MOVB @BLKDA2(R3),*R15
MOVB @BLKDA3(R3),*R15
SRC R3,8
SRC R3,8
ANDI R3,>F
MOVB @BLKTB1(R3),*R15
MOVB @BLKTB2(R3),*R15
MOVB @BLKTB3(R3),*R15
DEC R2
JNE TIVLP
RT
TIPLP$
* Same as above (gets data from cpu mem), with longer delay
TIPLPD MOV R11,R10
TIPLDL MOVB *R1+,R3
SRL R3,8
MOVB @BLKDAT(R3),*R15
MOVB @BLKDA2(R3),*R15
MOVB @BLKDA3(R3),*R15
BL @DELAY
ANDI R3,>F
MOVB @BLKTB1(R3),*R15
MOVB @BLKTB2(R3),*R15
MOVB @BLKTB3(R3),*R15
BL @DELAY
C
R1,R2
JNE TIPLDL
TIPLDZ B
*R10

* Same as above (get data from VDP mem) with longer delay
TIVLPD MOV R11,R10
TIVLDL MOVB *R13,R3
SRL R3,8
MOVB @BLKDAT(R3),*R15
MOVB @BLKDA2(R3),*R15
MOVB @BLKDA3(R3),*R15
BL @DELAY
ANDI R3,>F
MOVB @BLKTB1(R3),*R15
MOVB @BLKTB2(R3),*R15
MOVB @BLKTB3(R3),*R15
BL @DELAY
DEC R2
JNE TIVLDL
B
*R10
* Delay routine - used by 99/4A and 9640 playback routines
DELCNT DATA 0
min. value of 1
DELAY MOV @DELCNT,R0
DELAYL DEC R0
JNE DELAYL
RT
*
* F/X Configuration
*
BTMSCR
BTMSC2
BTMSC3
SPDTXT
DLYNUM

TEXT
TEXT
TEXT
TEXT
TEXT

FXCNFG BLWP
DATA
LI
MOV
LI
CLR
BL
LI
LI
CLR
MOV
SLA
INC
BL
BLWP
DATA
BLWP
DATA
BLWP
DATA
BLWP
DATA
BLWP
DATA
BLWP

'Press: 1 - Increase Delay'


'2 - Decrease Delay'
'FCTN 9 - Exit To Menu'
'Delay Factor:'
'####'
@VMBFD
120,>2020,840
R9,MEMTX2
@MEMSIZ,R7
R2,4
R15
@BINASC
R9,MAXTX2
R2,4
R15
@MEMSIZ,R7
R7,2
R7
@BINASC
@VMBWD
172,MEN3+4,17
@VMBWD
330,MEMTXT,18
@VMBWD
407,MAXTXT,28
@VMBWD
847,BTMSCR,25
@VMBWD
894,BTMSC2,18
@VMBWD

DATA 929,BTMSC3,21
CCFGLP LI
MOV
LI
CLR
BL
BLWP
DATA
CLR
LI
BL
CB
JNE
CLR
MOVB
CI
JL
CI
JEQ
JH
INCDEL INC
JMP
DECDEL DEC
JLT
JMP

R9,DLYNUM
@DELCNT,R7
R2,4
R15
@BINASC
@VMBWD
489,SPDTXT,17
@>8374
R0,>03C0
@KEYIN
@>837C,@SPC
CCFGLP
R1
@>8375,R1
R1,>3100
CCFGLP
R1,>3200
DECDEL
CCFGLP
@DELCNT
CCFGLP
@DELCNT
INCDEL
CCFGLP

*
* Here is the F/X conversion module
*
VOCTX TEXT 'Crea'
FIRSTR DATA 0
CONVRT BLWP @VMBFD
DATA 120,>2020,840
BLWP @VMBWD
DATA 171,MEN4A+4,18
CLR @SNDMEM
*
* First, get the data into memory!
*
CONVRG BL @PRSFNM
LI R0,242
LI R1,MSGINP
LI R2,15
BL @GETDV
DATA DEVNAM
BL @PRSFNM
BLWP @VMBWD
DATA >0400,DEVPAB,60 Now open the file
MOV @GIFOPL,@>8356
BLWP @DSRLNK
DATA 8
JNE NCVTOE
BL @CLOGIF
If an error, do a CLOSE and get new =
filename
JMP CONVRG
NCVTOE LI

R0,>0400

Set INPUT file for READ

LI R1,>0200
BLWP @VSBW
SETO @OPNFIL
CNVRGO BL
LI
LI
LI
BL
DATA
BL
BLWP
DATA
MOV
BLWP
DATA
JNE
LI
BL
SETO
JMP

@PRSCVT
R0,362
R1,MSGOUT
R2,16
@GETDV
CVTNAM
@PRSCVT
@VMBWD
>0480,CVTPAB,60 Now open output file
@CVTOPL,@>8356
@DSRLNK
8
NCVTIE
R0,>0480
@CLOCVT
@OPNFIL
CNVRGO

NCVTIE LI R0,>0480
LI R1,>0300
BLWP @VSBW

Set it for WRITE

GETAMP MOV
LI
MPY
LI
LI
CLR
BL
BLWP
DATA
BLWP
DATA
LI
BL
CI
JNE
INC
C
JL
CLR
CKRTNK CI
JNE
LI
BLWP

@AMPLVL,R6
R2,>A
R2,R6
R9,AMPFAC
R2,3
R15
@BINASC
@VMBWD
482,AMPTXT,26
@VMBWD
522,SPCMOD,37
R0,508
@KEYIN
R1,>2000
CKRTNK
@AMPLVL
@AMPLVL,@D16
GETAMP
@AMPLVL
R1,>0D00
GETAMP
R1,>2000
@VSBW

now get amp level

SETO
BLWP
DATA
BLWP
DATA

@FIRSTR
@VMBFD
522,>2020,37
@VMBWD
934,PROCTX,13

TRNSET CLR
LI
LI
TRNST1 MOVB

R0
R1,>D000
R2,>D100
R0,*R1+

Set up translation tables

MOVB
CI
JL
LI
LI
TRNST2 MOVB
MOVB
CI
JNE

R0,*R2+
R1,>D080
TRNST1
R0,>0F00
R3,>F000
R0,*R1+
R3,*R2+
R1,>D100
TRNST2

MOV
MPY
AI
MOV
AI
LI
S
LI
LI
TRNST4 MOV
TRNST3 MOVB
MOVB
DEC
JNE
AI
AI
CI
JNE

@AMPLVL,R0
@D7,R0
R1,>D010
R1,R2
R2,>0100
R3,16
@AMPLVL,R3
R4,>0100
R5,>1000
R3,R6
R4,*R1+
R5,*R2+
R6
TRNST3
R4,>0100
R5,>1000
R4,>0F00
TRNST4

* At this point, tables are set up


BL @READRC
CI R9,64
JEQ CVTXIT
C
@VOCTX,@>A000
JNE CVTRAW
C
@VOCTX+2,@>A002
JEQ CVTVOC
JMP CVTRAW
* conversion for raw (SND-type) files
CVTLOP BL @READRC
8K read from file
CI R9,64
JEQ CVTXIT
CVTRAW NEG R9
SLA R9,7
AI R9,>C000
r9 points to end of buffer
LI R0,>A000
R0 =3D INCOMING DATA
LI R1,>A000
R1 =3D OUTGOING DATA
CVTLP1 MOVB
SRL
MOVB
MOVB
SRL
SOCB
C
JL
CI
JEQ
MOV
CVTSET SETO

*R0+,R2
R2,8
@>D100(R2),*R1
*R0+,R2
R2,8
@>D000(R2),*R1+
R0,R9
CVTLP1
R9,>C000
NONUKE
R9,R0
*R0+

NONUKE

FIRSTS
CVTXIT

NEWDFT

CI
JNE
AI
SRL
ABS
JEQ
LI
MOV
CLR
CLR
CLR
CLR
BL
CI
JEQ
BL
LI
BL
LI
LI
LI
MOV
DECT
JNE
BLWP
DATA
B

R0,>C000
CVTSET
R1,>607F
R1,7
@FIRSTR
FIRSTS
R0,>A000
@FXH,*R0+
*R0+
*R0+
*R0
@FIRSTR
@WRITRC
R9,>C000
CVTLOP
@CLOGIF
R0,>0480
@CLOCVT
R0,CVTLEN
R1,DEVLEN
R2,42
*R0+,*R1+
R2
NEWDFT
@VMBWD
923,CCPAK,35
@DEATH

Close files

* conversion for a VOC-type file


CVTVOC LI
MOV
CLR
CLR
CLR
LI
BL

R13,>C000
@FXH,*R13+
*R13+
*R13+
*R13+
R14,>A01A
@DOVOC

CVTVC1 BL
SRL
MOVB
DEC
JOC
DEC
JOC

@FETCHR
R15,8
@>D100(R15),*R13
@VOCLO
CVTVC2
@VOCHI
CVTVC2

BL
CVTVC2 BL
SRL
SOCB
DEC
JOC
DEC
JOC
BL

@DOVOC
@FETCHR
R15,8
@>D000(R15),*R13+
@VOCLO
CVTVC3
@VOCHI
CVTVC3
@DOVOC

CVTVC3 CI R13,>D000
JNE CVTVC1

r1 points to outgoing data stream


set up header

r0 =3D incoming data ptr

LI
BL
LI
JMP
FETCHR MOVB
CI
JNE
MOV
BL
MOV
LI
FTCH1 RT

R1,32
@WRITVC
R13,>C000
CVTVC1
*R14+,R15
R14,>C000
FTCH1
R11,@SAVRT
@READRC
@SAVRT,R11
R14,>A000

VOCHI DATA 0
VOCLO DATA 0
DOVOC MOV
BL
ANDI
JEQ
BL
MOVB
BL
MOVB
BL
CLR
MOVB
BL
BL
LI
S
JOC
DEC
DOVOCG MOV
JNE
DEC
DOVOCX B

R11,@DOVOCX+2
@FETCHR
R15,>FF00
DOVOEF
@FETCHR
R15,@VOCLO+1
@FETCHR
R15,@VOCLO
@FETCHR
@VOCHI
R15,@VOCHI+1
@FETCHR
@FETCHR
R0,3
R0,@VOCLO
DOVOCG
@VOCHI
@VOCLO,R0
DOVOCX
@VOCHI
@0

DOVOEF SETO
MOV
DOVOE1 MOVB
CI
JNE
MOV
AI
SRL
BL
B

R1
R13,R9
R1,*R13+
R13,>D000
DOVOE1
R9,R1
R1,>407F
R1,7
@WRITVC
@CVTXIT

DEVPAB
BUFLOC
DEVLEN
DEVNAM

DATA
DATA
DATA
TEXT

>0004
>0500,>8080,>0000
0
'

'

CVTPAB
CVTBUF
CVTLEN
CVTNAM

DATA
DATA
DATA
TEXT

>0002
>0600,>8080,>0000
0
'

'

HFF
SAVR1
FSIZE
DFLAG

DATA
DATA
DATA
DATA

CLOGIF LI
CLOCVT LI
BLWP
AI
MOV
BLWP
DATA
CLR
RT

255
0
0
0
R0,>0400
R1,>0100
@VSBW
R0,9
R0,@>8356
@DSRLNK
8
@OPNFIL

Close an open FX file!

ERRHDL BLWP @VMBWD


DATA 928,MSG6,24
B
@DEATH
LOOPAC DATA 0
RPRT DATA 0

Accumulator for loop

VDREAD LI R1,>A000
LI R9,128
JMP READRS
SCREAD LI R1,>6000
LI R9,64
JMP READRS
VRREAD LI R1,>A000
LI R9,80
JMP READRS
TIREAD LI R1,>A000
LI R9,192
JMP READRS
READRC LI
LI
READRS LI
READRZ LI
READRL MOV
BLWP
them
DATA
JNE
CB
JNE
ABS
JEQ
BLWP
DATA
BLWP
DATA
STWP
MOV
MOV
LWPI

R9,64
R1,>A000
R2,>80
R0,>0500
@GIFOPL,@>8356
@DSRLNK
8
NREDER
R0,@HEX5
ERRHDL
@CHNFLG
NCHNF
@VMBWD
883,CHAINT,36
@VMBWD
924,CHAIN2,34
R0
R0,@RSTR0+2
R0,@RRSTR0+2
>8300

Read 64 128 byte records from file, store =

RRSTR0
RSTR0
NCHNF
NREDER

LI
BL
BLWP
DATA
ANDI
CI
JEQ
BLWP
DATA
LI
BLWP
MOV
SRL
DEC
AI
BLWP
AI
BLWP
LI
CLR
BLWP
MOV
BLWP
DATA
JEQ
LI
LI
BLWP
LWPI
JMP
LWPI
RT
BLWP
A
DEC
JNE
RT

R0,>03C0
@KEYIN
@VMBFD
880,>2020,80
R1,>7F00
R1,>0C00
RSTR0
@VMBWD
935,LOADTX,10
R0,>409
@VSBR
R1,R0
R0,8
R0
R0,>040A
@VSBR
R1,>0100
@VSBW
R0,>400
R1
@VSBW
@GIFOPL,@>8356
@DSRLNK
8
ERRHDL
R0,>0400
R1,>0200
@VSBW
0
READRZ
0
@VMBR
R2,R1
R9
READRL

WRITVC MOV R1,R8


LI R1,>C000
JMP WRITR
WRITRC MOV
LI
WRITR LI
LI
WRITRL BLWP
MOV
BLWP
DATA
JEQ
A
DEC
JNE
RT

R1,R8
R1,>A000
R0,>0600
R2,>80
@VMBW
@CVTOPL,@>8356
@DSRLNK
8
WRITER
R2,R1
R8
WRITRL

WRITER LI
BL
BL
B

R0,>0480
@CLOCVT
@CLOGIF
@ERRHDL

If an error in 1st half, flag it!

PRSHDR MOV
LI
LI
BLWP
BL
B

R11,R10
R0,>0400
R1,>200
@VSBW
@READRC
*R10

VWTR DATA UTILWS,VWTR1


VWTR1 MOV *R13,R0
MOVB @UTILWS+1,@>8C02
ORI R0,>8000
MOVB R0,@>8C02
RTWP
KSCAN DATA UTILWS,KSCAN1
KSCAN1 LWPI >83E0
BL @>E
LWPI UTILWS
RTWP
WTAD4 LI
WTAD3 MOVB
MOVB
SOC
MOVB
MOV
MOV
RT

R1,>4000
*R14+,R0
*R14+,@>8C02
R1,R0
R0,@>8C02
*R14+,R1
*R14+,R2

H4000 EQU $+2


WTAD2 LI R1,>4000
WTAD MOV *R13,R0
MOVB @UTILWS+1,@>8C02
SOC R1,R0
MOVB R0,@>8C02
MOV @2(R13),R1
MOV @4(R13),R2
RT
VSBW

DATA UTILWS,$+2
BL @WTAD2
MOVB R1,@>8C00
RTWP

VSBR DATA UTILWS,VSBR1


VSBR1 CLR R1
BL @WTAD
MOVB @>8800,@2(R13)
RTWP
VMBRD DATA
CLR
BL
JMP
VMBR DATA
CLR
BL
VMBR2 MOVB

UTILWS,$+2
R1
@WTAD3
VMBR2
UTILWS,$+2
R1
@WTAD
@>8800,*R1+

Put file in READ mode

DEC R2
JNE VMBR2
RTWP
VMBFD DATA
BL
VMBF2 MOVB
DEC
JNE
RTWP

UTILWS,$+2
@WTAD4
R1,@>8C00
R2
VMBF2

VMBWD DATA
BL
JMP
VMBW DATA
BL
VMBW2 MOVB
DEC
JNE
RTWP

UTILWS,$+2
@WTAD4
VMBW2
UTILWS,$+2
@WTAD2
*R1+,@>8C00
R2
VMBW2

PNTR
SCLEN
CRULST
SADDR
GPLWS
H20
DECMAL
HZZ
SAVTKX

>8356
>8355
>83D0
>83D2
>83E0
>2000
'.'
>AA
0

EQU
EQU
EQU
EQU
EQU
DATA
TEXT
BYTE
DATA

DSRLNK DATA DLNKWS,DLENTR


DLENTR MOV
MOV
SZCB
MOV
MOV
AI
BLWP
MOVB
SRL
SETO
LI
LNK$LP INC
INC
CI
JGT
C
JEQ
BLWP
MOVB
CB
JNE
LNK$LN MOV
JEQ
CLR
MOV
INC
A

*R14+,R5
@TKX,@SAVTKX
@H20,R15
@PNTR,R0
R0,R9
R9,-8
@VSBR
R1,R3
R3,8
R4
R2,NAMBUF
R0
R4
R4,7
LNKERR
R4,R3
LNK$LN
@VSBR
R1,*R2+
R1,@DECMAL
LNK$LP
R4,R4
LNKERR
@CRULST
R4,@SCLEN-1
R4
R4,@PNTR

SROM

NOROM
NOOFF

NOOFF2

SGO
SGO2

NAME1

NAME2
QCKENT
TKX

LWPI
CLR
LI
JMP
SBZ
AI
CLR
CI
JEQ
CI
JNE
LI
MOV
SBO
LI
CB
JNE
A
JMP
MOV
SBO
MOV
JEQ
MOV
INCT
MOV
MOVB
JEQ
CB
JNE
SRL
LI
CB
JNE
DEC
JNE
INC
BL
JMP
SBZ
LWPI
MOV
MOV
BLWP
SRL
JNE
RTWP

GPLWS
R1
R12,>1200
NOOFF2
0
R12,>100
@CRULST
R12,>1200
NODSR
R12,>2000
NOOFF2
R12,>1000
R12,@CRULST
0
R2,>4000
*R2,@HZZ
NOROM
@TYPE,R2
SGO2
@SADDR,R2
0
*R2,R2
NOROM
R2,@SADDR
R2
*R2+,R9
@SCLEN,R5
NAME2
R5,*R2+
SGO
R5,8
R6,NAMBUF
*R6+,*R2+
SGO
R5
NAME1
R1
*R9
SGO
0
DLNKWS
@SAVTKX,@TKX
R9,R0
@VSBR
R1,13
IOERRZ

NODSR LWPI DLNKWS


LNKERR CLR R1
IOERRZ SWPB R1
MOVB R1,*R13
SOCB @H20,R15
RTWP
UTILWS
DLNKWS
TYPE
NAMBUF

EQU
DATA
DATA
BSS

>8380
0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0
8

END

You might also like