home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Outlet 81
/
outlet-81.mgt
/
TOR-AS4SO
< prev
next >
Wrap
Text File
|
2021-04-18
|
15KB
|
1,333 lines
; * TORNADO *
; TORNADO ASSEMBLER source -- 106
TEMPASP áFINDADD ;re-used
inclflag áxpos +28
noroomflg áxpos +29
; includs EQU 25651
; ORG 29978 ;=ASSEMBLE
assemble2 èpra ;print flash 'A'
┤Ñ,SYMBTOP ;reset symbtable
┤(SYMPO),Ñ
ΣÇ
┤(ERRCNT),Ç;reset more
⌐Ç
┤(PASS),Ç;1 = pass 1
A1 ┤Ñ,0
┤(ASSPOINT),Ñ;defaults
┤(DUMPA),Ñ
┤(DUMPF),Ñ
┤(inclflag),Ñ;NO include, NO no-room
┤ö,FILSTRT
èdoass ;assemble !
┤Ç,(noroomflg)
àÇ;test for 'noroom'
▓╛,noroom ;exit if so
┤Ñ,PASS ;test for pass 2
ò(Ñ)
▒╛,ASSEXIT ;exit to menu if so
┤(Ñ),3 ;signal pass 2
▓A1
noroom èprmenu
┤ç,merm ;no room exit
▒printerr ;cont. in MENU-wait
pra ┤Ñ,POSM ;AT x,y
èprintmsge
┤Ñ,AMS ;flash A
èprintmsge
═
doass ┤(storevar),▀;store point of entry
A3 ┤Ñ,(ASSPOINT);start of opcode now
┤(TEMPASP),Ñ
A4 èSKIP +1 ;get char, test chr$ 13
▓σ,A6
î":"
▓σ,A6 ;next stmt
î";"
▓σ,A5 ;comment
î126
▓σ,A5 ;block marker
î127 ;(c)
▓╛,A7 ;jp if 'valid' char
A5 ⌐ö;step over rest of line
┤Ç,(ö)
î13
▓╛,A5
A6 ⌐ö;test after chr$ 13
┤Ç,(ö)
î255 ;for end of file
═σ;ret if so, no flag
┤Ç,(inclflag);including?
àÇ
▓σ,a3 ;cont if not including
┤Ç,Æ;test scrbufpointer
î79 ;256 less then 16384 + 2048
▓ë,a3 ;jp if still inside
┤Ç,3 ;signal : refill buffer
┤(noroomflg),Ç
═
A7 Γ128 ;test for token
▓║,A12 ;jp if so
èSTORESYM ;try for label
▓║,A8 ;jp if new label
┤Ç,(PASS);test any existing label
î2 ;on 2nd pass there must
▓║,A8 ; be a value
ê7,(»+0);'value known' flag
▒╛,ERR5
A8 èSKIP +1 ;after a label,
Γ128 ; a token must follow
▒ë,ERR0
î32 ;+128 = EQU
▓╛,A10 ;jp if not
èEVAL ;get number
▓ë,A4 ;jp if another label
A9 ┤(»+14),│;assign val to label
┤(»+15),ú
▌7,(»+0);signal 'value known'
▓A4 ;loop
A10 î64 ;+128 = ORG
▓╛,A11 ;jp if not
èEVAL ;get number
▒ë,ERR1 ;jp if value not found
┤(ASSPOINT),Ñ;else assign value
▓A9
A11 ┤Ñ,(ASSPOINT);if not EQU or ORG, then
┤(»+14),│; assign current addr
┤(»+15),ú
▌7,(»+0); to label
A12 ┤Ñ,A4 ;set RET-addr
ʥ
┤ë,Ç;store tokennr
┤å,0
┤Ñ,ATOKTAB
éÑ,ç;find entry
éÑ,ç
éÑ,ç
┤ë,(Ñ);get defb
⌐Ñ
┤Ç,(Ñ);get jp-addr in HL
⌐Ñ
┤ú,(Ñ)
┤│,Ç
èESTM ;get next char, test end of
▒(Ñ);do it stmt
ATOKTAB û0 :ÖERR0 ;serviceroutines
û136 :ÖABCS
û128 :ÖADDS
û0 :ÖERR0
û0 :ÖERR0
û160 :ÖLOGS
û0 :ÖERR0
û0 :ÖERR0
û64 :ÖBITS
û0 :ÖERR0
û196 :ÖCALLS
û63 :ÖNOPS
û184 :ÖLOGS
û169 :ÖBLOCKS
û185 :ÖBLOCKS
û161 :ÖBLOCKS
û177 :ÖBLOCKS
û47 :ÖNOPS
û0 :ÖERR0
û39 :ÖNOPS
û0 :ÖERR0
û5 :ÖINCS
û0 :ÖDEFBS
û34 :ÖDEFMS
û0 :ÖDEFSS
û0 :ÖDEFWS
û243 :ÖNOPS
û16 :ÖDJNZS
û0 :ÖDUMPS
û0 :ÖERR0
û251 :ÖNOPS
û0 :ÖENDS
û0 :ÖERR0
û0 :ÖEXS
û217 :ÖNOPS
û0 :ÖERR0
û118 :ÖNOPS
û0 :ÖERR0
û0 :ÖERR0
û0 :ÖIMS
û64 :ÖINS
û4 :ÖINCS
û34 :ÖINCLUDS
û170 :ÖBLOCKS
û186 :ÖBLOCKS
û162 :ÖBLOCKS
û178 :ÖBLOCKS
û0 :ÖERR0
û0 :ÖERR0
û194 :ÖJPS
û32 :ÖJRS
û0 :ÖERR0
û64 :ÖLDS
û168 :ÖBLOCKS
û184 :ÖBLOCKS
û160 :ÖBLOCKS
û176 :ÖBLOCKS
û0 :ÖERR0
û0 :ÖERR0
û68 :ÖBLOCKS
û0 :ÖNOPS
û0 :ÖERR0
û0 :ÖERR0
û176 :ÖLOGS
û0 :ÖORGS
û187 :ÖBLOCKS
û179 :ÖBLOCKS
û65 :ÖOUTS
û171 :ÖBLOCKS
û163 :ÖBLOCKS
û0 :ÖERR0
û0 :ÖERR0
û0 :ÖERR0
û193 :ÖPOPS
û197 :ÖPOPS
û0 :ÖERR0
û128 :ÖBITS
û192 :ÖRETS
û77 :ÖBLOCKS
û69 :ÖBLOCKS
û16 :ÖROTAS
û23 :ÖNOPS
û0 :ÖROTAS
û7 :ÖNOPS
û111 :ÖBLOCKS
û24 :ÖROTAS
û31 :ÖNOPS
û8 :ÖROTAS
û15 :ÖNOPS
û103 :ÖBLOCKS
û199 :ÖRSTS
û152 :ÖABCS
û55 :ÖNOPS
û192 :ÖBITS
û32 :ÖROTAS
û0 :ÖERR0
û40 :ÖROTAS
û56 :ÖROTAS
û144 :ÖLOGS
û0 :ÖERR0
û168 :ÖLOGS
û0 :ÖERR0
;insert byte into code
NOMOPS ó;save all regs
┤å,Ç
┤Ç,(PASS);on second pass only
î3
▓╛,NOM2
┤Ñ,(DUMPF);skip if DUMP = 0
┤Ç,ú
┐│
┤Ñ,(dumpa)
▓σ,NOM1
┤Ç,(SYMPO +1);test addr against bottom of
òÇ; symboltab
îú
▒ë,ERROUTS ;no room error
┤(Ñ),å;store it now
nom1 ⌐Ñ
┤(DUMPA),Ñ;adjust dumpaddr + assaddr
NOM2 ┤Ñ,(ASSPOINT)
⌐Ñ
┤(ASSPOINT),Ñ
┤Ñ,#2758;restore HL' (SPEC-error)
ó
═
COMMA èSKIP ;test separator
î","
▒╛,ERR4
SKIP ⌐ö;get next char
┤Ç,(ö)
î32
▓σ,SKIP
î13 ;set Zflag if eol
═
ESTM ⌐ö;test end of statement
èSKIP +1
═σ
î";"
═σ
î":"
═
EVA ⌐ö;eval numeric expr.
EV1 ʥ
èE1 ;do it
ΣÇ;result should be < 255
┐ú
▒╛,ERR2
┤Ç,│;result in A
ɥ
═
EVAL ⌐ö;eval 16-bit num. expr.
E1 ΣÇ;signal val unknown
┤(HULP),Ç
ʇ
ʯ;points to label
èGETNUM ;result in HL
E2 èSKIP +1 ;next char
î45 ;sub
▓╛,E3
èGETNEXV ;next number, in HL
┤Ç,ë;do sub
Γ│;BC = first number
┤│,Ç
┤Ç,å
█Ç,ú
▓E12
E3 î43 ;add
▓╛,E4
èGETNEXV
éÑ,ç
▓E2
E4 î38 ;and = &
▓╛,E5
èGETNEXV
┤Ç,ë
à│
┤│,Ç
┤Ç,å
àú
▓E12
E5 î33 ;or = !
▓╛,E6
èGETNEXV
┤Ç,ë
┐│
┤│,Ç
┤Ç,å
┐ú
▓E12
E6 î42 ;mult
▓╛,E9
èGETNEXV
ʔ
íö,Ñ
┤Ç,å
┤å,16
┤Ñ,0
E7 éÑ,Ñ
Љ
╤
▓║,E8
éÑ,ö
E8 ¢E7
ɔ
▓E2
E9 î47 ;div
▓╛,E13
èGETNEXV
ʔ
íö,Ñ
┤Ç,å
┤å,16
┤Ñ,0
E10 Љ
╤
üÑ,Ñ
█Ñ,ö
▓║,E11
éÑ,ö
E11 ï
¢E10
Љ
╤
ɔ
┤│,ë;result in HL
E12 ┤ú,Ç
▓E2 ;test for more calc ops.
E13 ɯ;exit here
ɇ
┤Ç,(HULP);test 'value known'
éÇ,Ç
═║;jp if so, no label used
┤Ç,(PASS);test second pass
ê1,Ç
┤Ñ,0 ;keep CARRY
═σ;ret with valid label
▒ERR1 ;2nd pass, no value
GETNEXV ʥ;get next num. val from file
⌐ö
èGETNUM ;old val in BC
ɇ;new val in HL
═
GETNUM ┤Ñ,0 ;get a number from file
èSKIP +1
èTESTN ;numeric?
▓║,DECI ;jp if not
î"#"
▓σ,HEXA
î"%"
▓σ,BINAIR
î34
▓σ,ASCI
î"$" ;current addr
▓╛,GN1
┤Ñ,(TEMPASP)
⌐ö
═;with current memaddr in HL
GN1 àÇ;test token
▒╣,ERR0 ;jp if so
èAONLY ;A - z
▒ë,ERR3 ;jp if not
èST0 ;evaluate label
┐Ç
┤│,(»+14);fetch val from label
┤ú,(»+15)
ê7,(»+0 );test valid label
═╛
┤Ç,255 ;signal known/unknown
┤(HULP),Ç
═
ASCI ⌐ö;get ascii value
┤Ç,(ö)
î13
▓σ,ASCER ;error if end of line
┤│,Ç
⌐ö;L = 1th
┤Ç,(ö);A = 2nd
⌐ö
î34
═σ
▒ERR4
DECI Γ48 ;do numeric
┤│,Ç
DC2 ⌐ö
┤Ç,(ö)
èTESTN
͉
Γ48
┤å,ú
┤ë,│
éÑ,Ñ
▓ë,ASCER ;error
éÑ,Ñ
▓ë,ASCER ;error
éÑ,ç
▓ë,ASCER ;error
éÑ,Ñ
▓ë,ASCER ;error
éÇ,│
┤│,Ç
▓║,DC2
⌐ú
▓╛,DC2
ASCER ▒ERR3 ;overflow, >65535
HEXA ⌐ö
┤Ç,(ö)
èTHEX
▓ë,ASCER ;error
┤│,Ç
HX ⌐ö
┤Ç,(ö)
èTHEX
͉
éÑ,Ñ
▓ë,ASCER ;err
éÑ,Ñ
▓ë,ASCER ;err
éÑ,Ñ
▓ë,ASCER ;err
éÑ,Ñ
▓ë,ASCER ;err
┐│
┤│,Ç
▓HX
BINAIR ⌐ö
┤Ç,(ö)
Γ49 ;test 0 / 1
üÇ,0
▓╛,ASCER ;error if not
BI1 ï;get bit
üÑ,Ñ;prepare result
▓ë,ASCER ;overflow error
⌐ö
┤Ç,(ö);more bits
Γ49
üÇ,0
▓σ,BI1
àÇ
═
THEX Γ48 ;test chars 0 - 47
͉;ret if < 48
î10 ;test 58
ï
═║;ret with 0 - 9
Γ7 ;test 58 - 64
î10
͉;ret if so
î16 ;test for ABCDEF
ï;ret C if not
═;NC = valid
STORESYM ┤Ç,(ö);1th char of label
èAONLY ;test A - z
▒ë,ERR1 ;err if not
ST0 ┤Ñ,SYMBTOP ;move max 14 chars into table
┤å,014
ST1 ┤(Ñ),Ç
⌐ö
⌐Ñ
┤Ç,(ö)
èTESTA ;must be alphanumeric
▓ë,ST2 ;jp if end of label
¢ST1
▒ERR1 ;label too long
ST2 íä,â;save Carry
ST3 ┤(Ñ),032 ;add spaces if nec.
⌐Ñ
¢ST3
ʔ;save mempntr
┤Ñ,SYMBTOP ;= labelbuffer
┤ö,(SYMPO);point to bottom of table
▓ST6
ST4 ┤Ñ,SYMBTOP ;= labelbuffer
ST5 ┤Ç,¥;DE points to next label in
┐15 ; table
┤¥,Ç
⌐ö
ST6 ┤Ç,(ö);compare name in buff against
à127 ; existing labels
Σ(Ñ);drop any bit 7
à223 ;CAPS
▓╛,ST5 ;next label if no match
;finds always name in labelbuf !!
┤å,13 ;cp 13 more chars
ST7 ⌐Ñ
⌐ö
┤Ç,(ö)
Σ(Ñ)
à223
▓╛,ST4 ;next label if no match
¢ST7 ;13 times
█Ñ,ö;test found-address
▓╛,ST8 ;jp if not same add = found
íä,â;store Zflag now
┤Ñ,(SYMPO);test bottom of table against
┤ç,(DUMPA); code in mem
àÇ
█Ñ,ç
┤ç,32 ;room for 32 ?
àÇ
█Ñ,ç
▒ë,ERROUTS ;err if no room
┤Ñ,(SYMPO);point to bot of table
òÑ;make room for 2byte number
òÑ
òÑ
íö,Ñ
┤ç,14 ;also move 14 chars from labelbuf
╢; into symboltable
⌐ö
┤(SYMPO),ö;adjust bottompntr
ST8 ┤Ç,¥;make IX point to new entry
à240
┤¥,Ç
ʔ
ɯ
ɔ;retrieve textfilepntr
íä,â;get flag, C = existing label
═;Z = NC = new label
CONDS ┤å,000 ;construct condition bits
î190 ;NZ
═σ
⌐å
î229 ;Z
═σ
⌐å
î186 ;NC
═σ
⌐å
î137 ;C
═σ
⌐å
î200 ;PO
═σ
î189 ;NZ
═σ
⌐å
î199 ;PE
═σ
î227 ;V
═σ
⌐å
î198 ;P
═σ
⌐å
î185 ;M
═
DREG ┤ú,223 ;construct bits for reg. pair
DREG1 ┤å,0 ;with or without SP = 223
î135 ;BC
═σ
⌐å
î148 ;DE
═σ
⌐å
èHLIXY ;HL, IX, IY (store DD or FD)
═σ
⌐å
îú;test given reg.
═
SREG1 ┤å,0 ;construct bits for single reg.
î134 ;B (no (xx) )
═σ
⌐å
î137 ;C
═σ
⌐å
î146 ;D
═σ
⌐å
î157 ;E
═σ
⌐å
î163 ;H
═σ
⌐å
î179 ;L
═σ
┤å,007
î128 ;A
═
SREG2 ┤å,0 ;single regs, also (HL),(IXY+n
î134 ;B
═σ
⌐å
î137 ;C
═σ
⌐å
î146 ;D
═σ
⌐å
î157 ;E
═σ
⌐å
î163 ;H
═σ
⌐å
î179 ;L
═σ
⌐å
î"("
▓σ,SREG3 ;jp if indirect adressing
⌐å
î128 ;A
═σ;Z = found
▄
ï
═;NC = not found
SREG3 èSKIP ;next char
èHLIXY ;test HL, IX, IY
▓╛,SR5 ;exit Cflag if not found
▓ë,SR1 ;jp if indexreg.
èSKIP ;next char, HL found
î")"
═σ;OK
▒ERR4
SR1 ┤│,0 ;default offset =0
èSKIP
î"+"
▓╛,SR2 ;jp with L = 0 if no offset
èEVA ;get number
î128 ;test max
▓ë,SR3 ;OK
▒ERR2
SR2 î"-"
▓╛,SR4 ;exit L = 0
èEVA ;get nr
î129 ;test max
▒║,ERR2
╗
SR3 ┤│,Ç;L = offset
èSKIP +1 ;get char
SR4 î")"
▒╛,ERR4
SR5 ▄;signal 'indexreg.'
═
HLIXY î165 ;HL
═σ
î175 ;IX
▓╛,HL1
┤Ç,221 ;store DD
▓HL2
HL1 î176 ;IY
═╛
┤Ç,253 ;store FD
HL2 èNOMOPS ;store
ΣÇ;set Zflag
▄;C = IX, IY found
═;Z = HL found
ORBC ⌐ö;construct opcodes
┤Ç,å
▓ORY
OR8BC ⌐ö
┤Ç,å
▓ORX
OR16BC ⌐ö
┤Ç,å
éÇ,Ç
ORX éÇ,Ç
éÇ,Ç
éÇ,Ç
ORY ┐ë
▒NOMOPS ;store byte + ret
;SERVICE-ROUTINES (see ATOKTAB)
⌐ö
BLOCKS ┤Ç,237
èNOMOPS
NOPS ┤Ç,ë
▒NOMOPS
RSTS èEV1
┤å,Ç
àë
▓σ,ORBC +1
▓ER0Q
RETS ▓╛,RE1
┤Ç,201
▒NOMOPS
RE1 èCONDS
▓σ,OR8BC
▓ER0Q
POPS ┤ú,132
èDREG1
▓σ,OR16BC
▓ER0Q
BITS èEV1
î8
▒║,ERR2
éÇ,Ç
éÇ,Ç
éÇ,Ç
┐ë
┤ë,Ç
èSKIP +1
î44
▒╛,ERR4
èSKIP
ROTAS èSREG2
▓╛,ER0Q
┤Ç,203
▓║,RO1
èNOMOPS
┤Ç,│
RO1 èNOMOPS
▓ORBC
ADDS ┤ú,Ç;store char for test at AD2
èHLIXY ;test for HLIXIY reg
▓╛,AD4 ;jp if not, must be A
┤ë,9 ;prepare for OR16BC
▓AD2
ABCS î165 ;test for HL
▓╛,AD4 ;jp if not, must be A
┤ú,Ç;store char for test
┤Ç,237 ;insert ED
èNOMOPS
┤Ç,66 ;prepare for OR16BC
ê4,ë
▓╛,AD1 ;jp if C =152 =SBC
┐8
AD1 ┤ë,Ç
AD2 èCOMMA ;get next char
┤å,0 ;build a number in B
î135 ;BC
▓σ,AD3
⌐å
î148 ;DE
▓σ,AD3
⌐å
îú;identical reg.
▓σ,AD3
⌐å
î223 ;SP
AD3 ▒σ,OR16BC ;jp if valid reg.
ER0Q ▒ERR0 ;else ERROR nonsense
AD4 î128 ;use A reg. now
▓╛,LOGS ;jp if no 'A' in source
⌐ö;get char after 'A'
┤Ç,(ö)
òö
î"," ;test for comma
┤Ç,(ö);get previous char again
▓╛,LOGS ;cont. if no comma
⌐ö;get char after comma
⌐ö
┤Ç,(ö);use this char
LOGS èSREG2 ;is it a reg.? (Prepare index)
▓╛,LO1 ;jp if number
▒║,ORBC ;if (single) reg., insert byte
èORBC ;insert code for index reg.
▓INC3 ;insert nr. in L
LO1 ▓ë,ER0Q
èEV1 ;evaluate number
┤│,Ç;store nr.
┤Ç,ë;adjust opcode
┐70
èNOMOPS ;insert code in A
▓INC3 ;insert code in L
INCS èDREG ;test for reg.pair
▓╛,INC2 ;jp if not
┤Ç,3 ;prep. for OR16BC
ê0,ë;test instruction
▓σ,INC1
┐8
INC1 ┤ë,Ç
▒OR16BC
INC2 èSREG2
▒╛,ERR0
▒║,OR8BC
èOR8BC
INC3 ┤Ç,│
▒NOMOPS
CALLS èCONDS
▓╛,CA1
èOR8BC +1
èCOMMA
▓CA2
CA1 ┤Ç,205
èNOMOPS
CA2 èE1
CA3 ┤Ç,│
èNOMOPS
┤Ç,ú
▒NOMOPS
JPS èCONDS
▓╛,JP1
èOR8BC +1
èCOMMA
▓CA2
JP1 î40
▓σ,JP2
┤Ç,195
▓CA1 +2
JP2 èSKIP
èHLIXY
▒╛,ERR0
èSKIP
î41
▒╛,ERR4
⌐ö
┤Ç,233
▒NOMOPS
JRS èCONDS
▓╛,JR1
┤Ç,å
î4
▒║,ERR0
èOR8BC +1
èCOMMA
▓JR2
JR1 ┤Ç,24
èNOMOPS
JR2 ┤ç,(TEMPASP)
┤Ç,ë
Γ126
┤ë,Ç
▓║,JR3
òå
JR3 èE1
▒ë,NOMOPS
█Ñ,ç
┤Ç,ú
┐Ç
▒╛,ERR2
┤Ç,│
Σ128
▒NOMOPS
DJNZS ┤Ç,ë
èNOMOPS
▓JR2
DEFBS èEV1
èNOMOPS
èESTM +1
═σ
î","
▒╛,ERR4
⌐ö
▓DEFBS
DEFWS èCA2
èESTM +1
═σ
î","
▒╛,ERR4
⌐ö
▓DEFWS
DEFSS èE1 ;get number
▒ë,ERR1 ;err if not
ʥ;store number
┤ç,(ASSPOINT);inc asspnt
éÑ,ç
┤(ASSPOINT),Ñ
ɇ;retrieve number
┤Ñ,(dumpa);inc dumpaddr also
éÑ,ç
┤(dumpa),Ñ
═
DEFMS ═σ;ret if 1th char is enter
îë;test for quote
▒╛,ERR4
⌐ö
DE1 ┤Ç,(ö);next char
î13
▒σ,ERR4 ;err if no end-quote
⌐ö
îë;test second quote
═σ;exit if found
èNOMOPS ;else continue inserting
▓DE1
ORGS èE1 ;get number
▒ë,ERR1
┤(ASSPOINT),Ñ
═
DUMPS èE1 ;get number
▒ë,ERR3 ;jp if no number
┤Ç,ú;test for dump = 0
┐│
▓σ,nwdp
èERROUTR ;test against symbtable-bottom
ʥ;store nw dumpaddr
┤ç,(FILEND)
▄
█Ñ,ç;test against end of file
▒ë,ERROUTS ;jp if no room
ɥ
nwdp ┤(DUMPA),Ñ;set nw dumpaddr.
┤(DUMPF),Ñ
═
ENDS ┤▀,(storevar);end of assembling
═
EXS î148 ;DE
▓σ,AEX1
î132 ;AF
▓σ,AEX2
î"("
▓╛,ER0R
èSKIP
î223 ;SP
▓╛,ER0R
èSKIP
î")"
▓╛,ER4R
èCOMMA
èHLIXY
▓╛,ER0R
┤Ç,227
▓EX3
AEX1 èCOMMA
î165
▓╛,ER0R
┤Ç,235
▓EX3
AEX2 èCOMMA
î131 ;AF'
▓╛,ER0R
┤Ç,8
EX3 ⌐ö
▒NOMOPS ;store
INS î128
▓╛,INS2
èCOMMA
î"("
ER4R ▓╛,ER4RX
èSKIP
î137
▓╛,INS1
┤å,7
▓INS3
INS1 ┤Ç,219
èNOMOPS
èEV1
▒LD6 +1
INS2 èSREG1
ER0R ▓╛,ER0RX
èCOMMA
î40
▓╛,ER4RX
èSKIP
î137
▓╛,ER0RX
INS3 èSKIP
î")"
▓╛,ER4RX
┤Ç,237
èNOMOPS
▒OR8BC
OUTS î"("
▓╛,ER4RX
èSKIP
î137 ;C
▓σ,OUT3
┤Ç,211
èNOMOPS
èEV1
OUT1 èNOMOPS
èSKIP +1
î")"
▓╛,ER4RX
OUT2 èCOMMA
î128 ;A
▓╛,ER0RX
⌐ö
═
OUT3 èSKIP
î")"
ER4RX ▒╛,ERR4
┤Ç,237
èNOMOPS
èCOMMA
èSREG1
▒σ,OR8BC
ER0RX ▒ERR0
IMS èEV1 ;get number
î3 ;test max
▒║,ERR2
┤│,Ç
┤Ç,237
èNOMOPS
┤Ç,70
ò│
▓σ,IMT
ò│
▒╛,NOMOPS
┐8
IMT ┐16
▒NOMOPS
LDS î128 ;A
▓╛,LD11
èCOMMA
┤ë,120
èSREG2
▒σ,LD15 -3
LD1 ▓║,LD8
î135 ;BC
▓╛,LD2
┤Ç,10
▓LD6
LD2 î148 ;DE
▓╛,LD3
┤Ç,26
▓LD6
LD3 ┤Ç,58
LD4 èNOMOPS
LD5 èCA2
▓LD7
LD6 ⌐ö
èNOMOPS
LD7 èSKIP +1
î41
▒╛,ERR4
⌐ö
═
LD8 î166 ;I
▓σ,LD9
î203 ;R
▓σ,LD10
┤Ç,62
▒LD19
LD9 ┤ë,87
▒BLOCKS -1
LD10 ┤ë,95
▒BLOCKS -1
LD11 èDREG
▓╛,LD14
èCOMMA
î40
▓╛,LD12
⌐ö
┤Ç,å
î2
┤Ç,42
▓σ,LD4
┤Ç,237
èNOMOPS
┤ë,75
èOR16BC +1
▓LD5
LD12 ┤│,Ç
┤Ç,å
î3
┤Ç,│
▓╛,LD13
èHLIXY
▓╛,LD13
┤Ç,249
⌐ö
▒NOMOPS
LD13 ┤ë,1
èOR16BC +1
▒CA2
LD14 èSREG2
▓╛,LD20
┤Ç,å
ʄ
éÇ,Ç
éÇ,Ç
éÇ,Ç
┐ë
┤ë,Ç
Ʉ
▓ë,LD16
î6
▓σ,LD17
èCOMMA
èSREG2
▓╛,LD18
▒║,ORBC
LD15 èORBC
┤Ç,│
▒NOMOPS
LD16 èCOMMA
èSREG1
▓σ,LD15
┤Ç,ë
à63
┐6
èNOMOPS
┤Ç,│
▓LD19
LD17 èCOMMA
èSREG1
▒σ,ORBC
LD18 ┤Ç,ë
à63
┐6
LD19 èNOMOPS
èEV1
▒NOMOPS
LD20 ▓ë,LD23
î166
▓╛,LD22
┤ë,71
LD21 èBLOCKS
▒OUT2
LD22 î203
┤ë,79
▓σ,LD21
▓ERR0
LD23 î135
▓╛,LD24
┤Ç,2
⌐ö
▒OUT1
LD24 î148
▓╛,LD25
┤Ç,18
⌐ö
▒OUT1
LD25 èE1
èSKIP +1
î41
▓╛,ERR4
èCOMMA
î128
▓╛,LD27
┤Ç,50
LD26 èNOMOPS
▓LD28
LD27 ʥ
èDREG
ɥ
▓╛,ERR0
┤Ç,å
î2
┤Ç,34
▓σ,LD26
┤Ç,237
èNOMOPS
┤ë,67
èOR16BC +1
LD28 ⌐ö
▒CA3
AMS û18,1,65 ;flash A msge
û18,0,255
ERR0 ┤Ñ,EM0 ;addr of errmsge
û221 ;use IY to skip
ERR1 ┤Ñ,EM1
û221
ERR2 ┤Ñ,EM2
û221
ERR3 ┤Ñ,EM3
û221
ERR4 ┤Ñ,EM4
û221
ERR5 ┤Ñ,EM5
┤Ç,(inclflag);including?
àÇ
┤Ç,1 ;if so, then exit, and
▒╛,testex ;signal the error in NOROOMFLG
┤å,0 ;HL points to errmsge
┤ë,(Ñ);get length in BC
òÑ;backwards!
ʥ
ʇ
┤Ñ,ERRCNT
┤Ç,20 ;test for max errors
î(Ñ)
▒ë,ENDS ;exit if so
⌐(Ñ);count errors
ERM ┤Ç,(ö);DE points to fileaddr
⌐ö;find end of line with error
î13
▓╛,ERM
┤Ñ,(FILEND);test room for errorline
èERROUTR
█Ñ,ö;make room in file
┤å,ú;DE = start of next line
┤ë,│;BC = length of 'tail'
⌐ç
┤Ñ,(FILEND)
ɔ;length of errorline
ʔ
éÑ,ö;calc. total length of errline
┤ö,8 ;len '(c) ERROR '
éÑ,ö
íö,Ñ;prepare to make room
┤Ñ,(FILEND)
┤(FILEND),ö;adjust file-end
╢;make room
ɇ
ɥ
╢;insert errmsge
┤ç,8
┤Ñ,ERRMSG -1 ;insert '(c) ERROR '
╢;backwards!
⌐ö
┤Ñ,PASS
╠0,(Ñ);signal 'no second pass'
EXIT ┤▀,(storevar);clear stack
▒A4 ;continue assembling
û127
ù" ERROR "
ERRMSG á$
ù"Nonsense"
û13
EM0 û9 ;len
ù"Label?"
û13
EM1 û7
ù"Range?"
û13
EM2 û7
ù"Number?"
û13
EM3 û8
ù"Char?"
û13
EM4 û6
ù"Multiple!"
û13
EM5 û10
ERROUTR ┤Ç,(SYMPO +1);test HL aginst bottom of
òÇ; symboltable
îú
═║
ERROUTS ┤▀,(storevar);balance stack
┤Ç,2
testex ┤(noroomflg),Ç;signal 'no room'
▒ends
MERM ù"MEMORY "
ù"CONFLICT"
û255