LLUCE/SOURCE/OVERLAY.CRC.S

347 lines
9.2 KiB
ArmAsm

TTL 'Overlay CRC Calculator'
********************************
* *
* Overlay CRC Calculator *
* *
********************************
LST OFF
LSTDO OFF
XC
TR
TR ADR
EXP ONLY
Y = 1
y = 1
N = 0
n = 0
NOLIST = Y
GSBUG = N
DO NOLIST
LISTOBJ = N
LISTSYM = N
ELSE
LISTOBJ KBD 'List This Source? (Y/N)'
LISTSYM KBD 'List Symbol Table? (Y/N)'
FIN
DO LISTOBJ
LST
FIN
LST OFF
]TYPE = ^sysfile ; set file type
]AUX = sysfile ; and aux type
ORG ]AUX ; must be this way
TYP ]TYPE
DSK /RAM5/OVERLAY.CRC
PUT EQUATES/EQUATES
PUT EQUATES/OS.EQUATES
LST RTN
FLNAME = LNBUF+$80
JSR MONSNORM
JSR MONINIT
JSR MONSVID
JSR MONSKBD
STZ DISP40 ; Set 40 Columns
STZ ALTCHRS
LDA #'>'+128
STA MONPROMPT
JSR STARTCRC ; Set Up CRC Tables
RESTART JSR MONCLS ; Control L (Clear Screen)
STZ CRC ; Zero CRC Count
STZ CRC+1
JSR MONCROUT
JSR PRINT
DCI 'Filename -> '
JSR MONINPLN
CPX #0 ; Null File Name?
BNE MVNAME ; Nope
JMP EXIT
MVNAME STX FLNAME ; Save Length Of Name
NAMELUP LDA LNBUF,X ; Move Name
AND #$7F ; Clear Hi Bit
STA FLNAME+1,X ; Save It
DEX ; Next Byte
CPX #-1
BNE NAMELUP
JSR MLI ; Open The File
DB Open
DA OPENLST
BCC OPENOK
JMP OPENERR
OPENOK LDA OPENREF ; Move Reference Numbers
STA READREF
STA WRITEREF
STA CLOSEREF
STA MARKREF
LDX #0 ; Read First 8 Bytes
ID JSR RDBYTE
STA IDBYTES,X
INX
CPX #8
BLT ID
JSR MONCROUT
JSR PRINT ; Print ID Byte
DCI 'ID Byte : '
LDA IDBYTES
JSR MONPRBYTE
JSR MONCROUT
JSR PRINT ; Print Auxiliary Type
DCI 'Aux Type : '
LDA IDBYTES+2
JSR MONPRBYTE
LDA IDBYTES+1
JSR MONPRBYTE
JSR MONCROUT
JSR PRINT ; Print Checksum Of ID
DCI 'Checksum : '
LDA IDBYTES+3
JSR MONPRBYTE
JSR MONCROUT
JSR PRINT ; Print Size Of Code
DCI 'Code Size: '
LDA IDBYTES+5
JSR MONPRBYTE
LDA IDBYTES+4
JSR MONPRBYTE
JSR MONCROUT
LDA #0 ; Checksum Overlay ID
LDX #0
IDCSUM EOR IDBYTES,X
INX
CPX #4
BLT IDCSUM
EOR #$A5 ; ID Ok?
BEQ IDOK
JMP IDERR ; Nope
IDOK LDA IDBYTES+4 ; Move Code Size
STA TEMP
LDA IDBYTES+5
STA TEMP+1
CRCLUP JSR RDBYTE ; Read Overlay Byte
JSR ADDCRC ; Add To Crc
LDA TEMP ; Bump Size Pointer
BNE DWNSIZE
DEC TEMP+1
DWNSIZE DEC TEMP
LDA TEMP ; Done?
BNE CRCLUP ; Nope
LDA TEMP+1
BNE CRCLUP
JSR PRINT
DCI 'Code CRC : '
LDA CRC ; Move CRC To Program
STA IDBYTES+6
LDA CRC+1
STA IDBYTES+7
JSR MONPRBYTE
TXA
JSR MONPRBYTE
JSR MONCROUT
JSR MLI ; Set Mark Back To 0
DB Setmark
DA MARKLST
LDX #0 ; Re-Write First 8 Bytes
WRID LDA IDBYTES,X
STA BYTE
JSR MLI
DB Write
DA WRITELST
INX
CPX #8
BLT WRID
ANOTHER JSR MLI ; Close The File
DB Close
DA CLOSELST
JSR PRINT
DB cr
ASC 'Do Another File? -> _'2088
K_WAIT LDA KYBD ; Wait For A Keypress
BPL K_WAIT
BIT KBDSTRB ; Clear Strobe
CMP #'N'+Hibit ; How About A No?
BEQ QUIT
CMP #'n'+Hibit ; How About A No?
BEQ QUIT
CMP #'Y'+Hibit ; Is It A Yes?
BEQ AGAIN
CMP #'y'+Hibit
BNE K_WAIT
AGAIN JSR MONCOUT ; Print Input
JMP RESTART ; Start Again
QUIT JSR MONCOUT ; Print Input
EXIT JSR MLI ; Try To Quit
DB Quit
DA QUITLST
*-------------------------------
* Should Never Get Here
*-------------------------------
INC SOFTEV ; Force Cold Start
JMP (MONRESET)
OPENERR JSR PRINT
DB cr
ASC 'Error Opening File'8D
BRA ANOTHER
IDERR JSR PRINT
DB cr
ASC 'Invalid Overlay ID'0D0D
ASC 'Probably Not An Overlay'8D
JMP ANOTHER
RDERR JSR PRINT
DB cr
ASC 'Error Reading File'8D
PLA
PLA
JMP ANOTHER
RDBYTE JSR MLI
DB Read
DA READLST
BCS RDERR
LDA BYTE ; Get Byte Read
RTS
*-------------------------------
* Standard In-Line Print Routine
*-------------------------------
PRINT PLA
STA PRN
PLA
STA PRN+1
BRA PR2
PR1 LDA (PRN)
PHP
ORA #Hibit
JSR MONCOUT
PLP
BMI PR3
PR2 INC PRN
BNE PR1
INC PRN+1
BRA PR1
PR3 LDA PRN+1
PHA
LDA PRN
PHA
RTS
QUITLST DB 4
DS 8
OPENLST DB 3
DA FLNAME
DA IOBUF
OPENREF DB 0
READLST DB 4
READREF DB 0
DA BYTE
DA 1 ; Reading 1 Byte
DA 0
WRITELST DB 4
WRITEREF DB 0
DA BYTE
DA 1 ; Writing 1 Byte
DA 0
CLOSELST DB 1
CLOSEREF DB 0
MARKLST DB 2
MARKREF DB 0
DB 0,0,0
BYTE DB 0
IDBYTES DS 8
*===============================
* Calculate CRC
*===============================
STARTCRC LDX #0 ; Zero Crc Pages
CLRCRC STZ CRCBUFLO,X
STZ CRCBUFHI,X
INX
BNE CLRCRC
FETCH TXA ; Set Up CRC Table
EOR CRCBUFHI,X
STA CRCBUFHI,X
LDY #8
MKCRC ASL CRCBUFLO,X
ROL CRCBUFHI,X
BCC LOOP1
LDA CRCBUFHI,X
EOR #>$1021
STA CRCBUFHI,X
LDA CRCBUFLO,X
EOR #<$1021
STA CRCBUFLO,X
LOOP1 DEY
BNE MKCRC
INX
BNE FETCH
RTS
ADDCRC EOR CRC+1 ; Add It To Crc
TAX
LDA CRC
EOR CRCBUFHI,X
STA CRC+1
LDA CRCBUFLO,X
STA CRC
RTS
CRC DA 0
DUM CRC+2
DS \ ; Set To Page Boundary
CRCBUFLO DS $100
CRCBUFHI DS $100
IOBUF DS $400
DEND
LST OFF
DO LISTSYM
LST
FIN