LOAD 'Macros.dump' INCLUDE 'SS.equ' INCLUDE 'Driver.equ' INCLUDE 'Eval.aii.i' ;----------------------------------------------- ; ; Imported addresses ; ;----------------------------------------------- IMPORT D_FastMult IMPORT S_CellWidth IMPORT S_ColLab2Text IMPORT S_QTraverseTable ;----------------------------------------------- ; ; Forward addresses and entries ; ;----------------------------------------------- ENTRY S_InRange ;------------------------------------------------------------------------- ; S_AdjustCell ; S_AdjustCell PROC EXPORT output Cell:l,Xpt:w,Ypt:w ; these are both input BEGIN ; and output CmpWord Cell,#10000 blt OK1 MoveWord #9999,Cell SubWord Ypt,#S_RowHeight,Ypt OK1 CmpWord Cell+2,#$02BF blt OK2 MoveWord #$02BE,Cell+2 Call S_CellWidth,in=(Cell+2:w),out=(:w) SubWord Xpt,s,Xpt OK2 RETURN ENDP ;--------------------------------------------------------------------------- ; S_AdjustPoint ; S_AdjustPoint PROC EXPORT output Xpt:w,Ypt:w BEGIN lda Ypt bpl OKy stz Ypt OKy lda Xpt bpl Exit stz Xpt Exit RETURN ENDP ;--------------------------------------------------------------------------- ; ; S_Cell2Str ; S_Cell2Str PROC EXPORT input ptr:l,cell:l local offset:w,length:w begin moveword #0,[ptr] moveword #1,offset rcall S_ColLab2Text,in=(cell+2:a),out=([ptr]:#1:a) and #$00FF cmp #$0020 ; space bne Cont1 dec offset lda [ptr],y xba sta [ptr],y Cont1 inc offset inc offset moveword #1,length cmpw cell,#10 blt GotLength inc length cmp #100 blt GotLength inc length cmp #1000 blt GotLength inc length GotLength pushword cell lda offset addlong a,ptr,s pushword length pushword #0 _Int2Dec addword length,offset,a dec a ora [ptr] sta [ptr] return ENDP ;------------------------------------------------------------------------ ; ; S_DisposeRowBlock PROC EXPORT input RowBlock:l local RowPtr:l,RowOffset:w,RowHandle:l BEGIN lda RowBlock ora RowBlock+2 beq Exit MoveLong [RowBlock],RowPtr SubWord [RowPtr]:#S_KeyMax,[RowPtr]:#S_KeyMin,a asl a asl a AddWord a,#S_KeyArray,RowOffset loop SubWord RowOffset,#4,RowOffset cmp #S_KeyArray blt killRowBlock tay MoveLong [RowPtr]:y,RowHandle ora RowHandle beq loop Tool _DisposeHandle,in=(RowHandle:l) bra loop killRowBlock Tool _DisposeHandle,in=(RowBlock:l) Exit RETURN ENDP ;------------------------------------------------------------------------ ; ; S_GetDestCellRanges PROC EXPORT input OrigTL:l,OrigBR:l,DestTL:l,DestBR:l output Range1TL:l,Range1BR:l,Range2TL:l,Range2BR:l local JumpIndex:w BEGIN DestTop equ DestTL DestLeft equ DestTL+2 DestBottom equ DestBR DestRight equ DestBR+2 Range1Top equ Range1TL Range1Left equ Range1TL+2 Range1Bottom equ Range1BR Range1Right equ Range1BR+2 Range2Top equ Range2TL Range2Left equ Range2TL+2 Range2Bottom equ Range2BR Range2Right equ Range2BR+2 stz JumpIndex stzl Range1TL stzl Range1BR stzl Range2TL stzl Range2BR in OrigTL:l,OrigBR:l,DestLeft:w,DestTop:w out a:w XCall S_InRange beq OK1 lda #2 tsb JumpIndex OK1 in OrigTL:l,OrigBR:l,DestRight:w,DestBottom:w out a:w XCall S_InRange beq OK2 lda #4 tsb JumpIndex OK2 in OrigTL:l,OrigBR:l,DestRight:w,DestTop:w out a:w XCall S_InRange beq OK3 lda #8 tsb JumpIndex OK3 in OrigTL:l,OrigBR:l,DestLeft:w,DestBottom:w out a:w XCall S_InRange beq OK4 lda #16 tsb JumpIndex OK4 ldx JumpIndex jmp (JumpTable,x) Index4 MoveWord OrigTL,Range2Top MoveWord DestLeft,Range2Left MoveWord DestBottom,Range2Bottom lda OrigTL+2 dec a sta Range2Right Index20 MoveWord DestTop,Range1Top MoveWord DestLeft,Range1Left lda OrigTL dec a sta Range1Bottom MoveWord DestRight,Range1Right brl Exit Index16 MoveWord DestTop,Range2Top MoveWord DestLeft,Range2Left lda OrigTL dec a sta Range2Bottom MoveWord DestRight,Range2Right Index18 MoveWord OrigTL,Range1Top lda OrigBR+2 inc a sta Range1Left MoveWord DestBottom,Range1Bottom MoveWord DestRight,Range1Right brl Exit Index2 MoveWord DestTop,Range2Top lda OrigBR+2 inc a sta Range2Left MoveWord DestBottom,Range1Bottom MoveWord DestRight,Range1Right Index10 lda OrigBR inc a sta Range1Top MoveWord DestLeft,Range1Left MoveWord DestBottom,Range1Bottom MoveWord DestRight,Range1Right brl Exit Index8 lda OrigBR inc a sta Range2Top MoveWord DestLeft,Range2Left MoveWord DestBottom,Range2Bottom MoveWord DestRight,Range2Right Index12 MoveWord DestTop,Range1Top MoveWord DestLeft,Range1Left MoveWord DestBottom,Range1Bottom lda OrigTL+2 dec a sta Range1Right bra Exit Index0 MoveWord DestTop,Range1Top MoveWord DestLeft,Range1Left MoveWord DestBottom,Range1Bottom MoveWord DestRight,Range1Right ErrorIndex Exit RETURN JumpTable DC.W Index0 ; The corner assignments are DC.W Index2 DC.W Index4 ; ------------- DC.W ErrorIndex ; | 2 8 | DC.W Index8 ; | | DC.W Index10 ; | | DC.W Index12 ; | | DC.W ErrorIndex ; | 16 4 | DC.W Index16 ; ------------- DC.W Index18 DC.W Index20 ; This is the destination region DC.W ErrorIndex DC.W ErrorIndex DC.W ErrorIndex DC.W ErrorIndex DC.W Exit ; dest equals src ENDP ;---------------------------------------------------------------------- ; ; S_GetRealCell PROC EXPORT input RefCell:l,RefByte:w,CallingCell:l output RealCell:l BEGIN CmpLong RefCell,#S_NotACell bne isACell MoveLong RefCell,RealCell brl Exit isACell MoveWord RefCell,RealCell ; set row lda RefByte and #$0003 beq doNegRow cmp #2 bge getCol AddWord CallingCell,RealCell,RealCell bra getCol doNegRow SubWord CallingCell,RealCell,RealCell getCol ; set col MoveWord RefCell+2,RealCell+2 lda RefByte and #$000C beq doNegCol cmp #8 bge Exit AddWord CallingCell+2,RealCell+2,RealCell+2 bra Exit doNegCol SubWord CallingCell+2,RealCell+2,RealCell+2 Exit RETURN ENDP ;-------------------------------------------------------------------------- ; ; S_GetRefCell PROC EXPORT input CallingCell:l output RefCell:l,RefByte:w ; in/out parms BEGIN CmpLong RefCell,#S_NotACell beq Exit ; Adjust Row and Col for relative references, if necessary ; lda RefByte and #E_RefAbsAbs+$0080 sta RefByte and #E_RefAbsNeg bne ColOK CmpWord CallingCell+2,RefCell+2 blt posCol SubWord a,RefCell+2,RefCell+2 bra ColOK posCol SubWord RefCell+2,CallingCell+2,RefCell+2 lda #E_RefPosNeg ora RefByte sta RefByte ColOK lda RefByte and #E_RefNegAbs bne RowOK CmpWord CallingCell,RefCell blt posRow SubWord a,RefCell,RefCell bra RowOK posRow SubWord RefCell,CallingCell,RefCell lda #E_RefNegPos ora RefByte sta RefByte RowOK Exit RETURN ENDP ;------------------------------------------------------------------------ ; ; S_InRange PROC EXPORT input Cell1:l,Cell2:l,TestCell:l output Answer:w BEGIN stz Answer lda TestCell cmp Cell1 blt chkGERow2 beq OKRow cmp Cell2 blt OKRow beq OKRow bra Exit chkGERow2 cmp Cell2 blt Exit OKRow lda TestCell+2 cmp Cell1+2 blt chkGECol2 beq OKCol cmp Cell2+2 blt OKCol beq OKCol bra Exit chkGECol2 cmp Cell2+2 blt Exit OKCol inc Answer Exit RETURN ENDP ;----------------------------------------------------------------------------- ; S_NormalizeRange ( TLCell:l,BRCell:l ) ; ; These are input/output parameters! S_NormalizeRange PROC EXPORT output TLCell:l,BRCell:l BEGIN CmpWord TLCell+2,BRCell+2 ; compare the cols only blt doTop ldy BRCell+2 sty TLCell+2 sta BRCell+2 doTop CmpWord TLCell,BRCell ; compare the rows only blt Exit ldy BRCell sty TLCell sta BRCell Exit RETURN ENDP ;------------------------------------------------------------------------ ; ; S_SectRange PROC EXPORT input Range1Ptr:l,Range2Ptr:l,SectRangePtr:l output RangeValid:w BEGIN MoveWord #1,RangeValid ; Find Top ; CmpWord [Range1Ptr],[Range2Ptr] bge setTop lda [Range2Ptr] setTop sta [SectRangePtr] ; Find Left ; ldy #2 CmpWord [Range1Ptr]:y,[Range2Ptr]:y bge setLeft lda [Range2Ptr],y setLeft sta [SectRangePtr],y ; Find Bottom ; ldy #4 CmpWord [Range1Ptr]:y,[Range2Ptr]:y blt setBottom lda [Range2Ptr],y setBottom sta [SectRangePtr],y ; Find Right ; ldy #6 CmpWord [Range1Ptr]:y,[Range2Ptr]:y blt setRight lda [Range2Ptr],y setRight sta [SectRangePtr],y ; Compare if valid range ; lda [SectRangePtr],y ldy #2 cmp [SectRangePtr],y bge ColOK lda #0 sta RangeValid sta [SectRangePtr],y ldy #6 sta [SectRangePtr],y ColOK ldy #4 lda [SectRangePtr],y cmp [SectRangePtr] bge Exit lda #0 sta RangeValid sta [SectRangePtr],y sta [SectRangePtr] Exit RETURN ENDP ;--------------------------------------------------------------------- ; ; S_Text2Cell PROC EXPORT input TextPtr:l,Size:w output CellID:l local Len:w,Index:w,LLimit:w error ErrorFlag BEGIN stz ErrorFlag ; Get Column ; ldy #0 stz Len short colLoop cpy Size bge doneColLoop lda [TextPtr],y cmp #$41 ; hex for 'A' blt doneColLoop and #$DF ; make Upper case cmp #$5B ; hex for ('Z' + 1) bge doneColLoop sta [TextPtr],y iny inc Len bra colLoop doneColLoop long sty Index stz CellID+2 ; Check if it can be cell ; lda Len jeq noGood cmp #3 ; no cell col is 3 long bge noGood cmp #2 beq twoChars lda [TextPtr] and #$00FF SubWord a,#$0040,a ; hex for 'A' - 1 = '@' bra oneChar twoChars SubWord [TextPtr],#$4040,a ; hex for '@@' pha and #$00FF tax ldy #26 Call D_FastMult sta CellID+2 pla xba and #$00FF oneChar AddWord a,CellID+2,CellID+2 ; Get Row ; ldy Index stz Len short MoveWord #'1',LLimit rowLoop cpy Size bge doneRowLoop lda [TextPtr],y cmp LLimit ; hex for 'A' blt doneRowLoop cmp #'9'+1 bge doneRowLoop iny inc Len MoveWord #'0',LLimit bra RowLoop doneRowLoop long stz CellID lda Len beq noGood cmp #5 ; no cell row is 5 long bge noGood nextDigit ldy Index inc Index cpy Size bge Exit lda [TextPtr],y and #$00FF SubWord a,#$0030,s ldx CellID ldy #10 Call D_FastMult AddWord a,s,CellID bra nextDigit noGood inc ErrorFlag stz CellID stz CellID+2 Exit RETURN ENDP ;------------------------------------------------------------------------ ; ; S_TraverseDest PROC EXPORT input OrigTL:l,OrigBR:l,DestTL:l,DestBR:l,Routine:l local Range1TL:l,Range1BR:l,Range2TL:l,Range2BR:l error ErrorFlag BEGIN stz ErrorFlag in OrigTL:l,OrigBR:l in DestTL:l,DestBR:l out Range1TL:l,Range1BR:l,Range2TL:l,Range2BR:l XCall S_GetDestCellRanges lda Range2TL ora Range2TL+2 ora Range2BR ora Range2BR+2 beq doRange1 in Range2TL:l,Range2BR:l,Routine:l XCall S_QTraverseTable,err=ErrorFlag bcs Exit doRange1 lda Range1TL ora Range1TL+2 ora Range1BR ora Range1BR+2 beq Exit in Range1TL:l,Range1BR:l,Routine:l XCall S_QTraverseTable,err=ErrorFlag Exit RETURN ENDP END