Advertisement
Guest User

Untitled

a guest
Sep 4th, 2012
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .macro push stackname, value, sp ; stackname, valuetoassign, stackpointer
  2.  
  3.     .ident( .sprintf("%s%04X",stackname,sp)) .set value
  4.     sp .set sp + 1
  5.    
  6. .endmacro
  7.  
  8. .macro pop stackname, var, sp
  9.  
  10.     sp .set sp - 1
  11.     var  .set .ident( .sprintf("%s%04X",stackname,sp))
  12.    
  13. .endmacro
  14.  
  15.  
  16.  
  17. .macro if flagtest
  18.  
  19.     ; first time this macro is used:
  20.     .ifndef _endif_flagtest_IF_label
  21.         _endif_flagtest_IF_label            .set -1 ; total number of IFs used, first time will be incremented = 0
  22.         _endif_flagtest_SP                      .set 0  ; Stack Pointer
  23.         _endif_flagtest_END_label           .set 0
  24.     .endif
  25.    
  26.     _endif_flagtest_IF_label .set _endif_flagtest_IF_label + 1
  27.    
  28.     push "IF_ENDIF_STACK",_endif_flagtest_IF_label, _endif_flagtest_SP
  29.  
  30.    
  31.     ; Carry flag:
  32.     ;   carry set
  33.     ;   carry clear
  34.     ;   no carry
  35.     ;   not carry
  36.     ;   C set
  37.     ;   C clear
  38.     ;   less
  39.     ;   not less
  40.     ;   greater_equal
  41.     ;   not greater_equal
  42.  
  43.    
  44.     ; carry clear
  45.     .if (.xmatch(.left(1, {flagtest}) , less)) .or (.xmatch(.mid(1,1, {flagtest}) , less))
  46.         .if (.xmatch(.left (1,{flagtest}), not))
  47.             bcc .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label)) ; not less
  48.         .else
  49.             .if (.xmatch(.left(1, {flagtest}) , less))
  50.                 bcs .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label)) ; less
  51.             .else
  52.                 .error "Unknown condition in IF (C flag - carry clear)"
  53.                 .fatal ""
  54.             .endif
  55.         .endif
  56.     .else  
  57.        
  58.         ; Carry set
  59.         .if (.xmatch(.left(1, {flagtest}) , greater_equal)) .or (.xmatch(.mid(1,1, {flagtest}) , greater_equal)) .or (.xmatch(.left(1, {flagtest}) , carry)) .or (.xmatch(.mid(1,1, {flagtest}) , carry)) .or (.xmatch(.left(1, {flagtest}) , C))
  60.             .if (.xmatch(.mid (1, 1,{flagtest}), clear)) .or (.xmatch(.left (1,{flagtest}), no)) .or (.xmatch(.left (1,{flagtest}), not))
  61.                 bcs .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  62.             .else
  63.                 .if (.xmatch(.mid (1, 1, {flagtest}), set)) .or (.xmatch(.left(1, {flagtest}) , greater_equal))
  64.                     bcc .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  65.                 .else
  66.                     .error "Unknown condition in IF (C flag - carry set)"
  67.                 .endif
  68.             .endif
  69.         .else ; end "carry"
  70.        
  71.             ; Special case for greater than check ;
  72.             .if (.xmatch(.left(1, {flagtest}) , greater)) .or (.xmatch(.mid(1,1, {flagtest}) , greater))
  73.                 .if (.xmatch(.left (1,{flagtest}), not)) ; Enter block on EQUAL or LESS - branch away on greater(BCS), stay if equal
  74.                     beq :+
  75.                     bcs .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  76.                     :
  77.                 .else
  78.                     .if (.xmatch(.left(1, {flagtest}) , greater)) ; enter block on greater - branch away on less or equal
  79.                         beq .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  80.                         bcc .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  81.                     .else
  82.                         .error "Unknown condition in IF (C flag - greater)"
  83.                     .endif
  84.                 .endif
  85.             .else ; end "greater"
  86.            
  87.        
  88.         ; Zero flag: - set when equal
  89.         ;   zero
  90.         ;   zero clear
  91.         ;   zero set
  92.         ;   not zero
  93.         ;   equal
  94.         ;   not equal
  95.         ;   Z set
  96.         ;   Z clear
  97.         ;  
  98.            
  99.                 .if (.xmatch(.mid(1,1, {flagtest}) , zero)) .or (.xmatch(.left(1, {flagtest}) , zero)) .or (.xmatch(.mid(1,1, {flagtest}) , equal)) .or (.xmatch(.left(1,{flagtest}) , equal)) .or (.xmatch(.left(1, {flagtest}) , Z))
  100.                     .if (.xmatch(.mid (1, 1, {flagtest}), clear)) .or (.xmatch(.left(1, {flagtest}), not))
  101.                         beq .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  102.                     .else
  103.                         .if (.xmatch(.mid (1, 1,{flagtest}), set)) .or (.xmatch(.left(1,{flagtest}) , equal)) .or  (.xmatch(.left(1, {flagtest}) , zero))
  104.                             bne .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  105.                         .else
  106.                             .error "Unknown condition in IF (Z flag)"
  107.                             .fatal ""
  108.                         .endif
  109.                     .endif
  110.                 .else ; end "zero"
  111.                
  112.                 ; Negative flag:    set indicates negative
  113.                
  114.                 ;   plus
  115.                 ;   not plus
  116.                 ;   positive
  117.                 ;   not positive
  118.                 ;   minus
  119.                 ;   negative
  120.                 ;   not minus
  121.                 ;   not negative
  122.                 ;   N set
  123.                 ;   N clear
  124.                 ;   bit7 set
  125.                 ;   bit7 clear
  126.                    
  127.                     .if  (.xmatch(.mid(1,1, {flagtest}) , plus)) .or (.xmatch(.mid(1,1, {flagtest}) , positive)) .or (.xmatch(.left(1, {flagtest}) , plus)) .or (.xmatch(.left(1, {flagtest}) , positive))
  128.                         .if (.xmatch(.left(1, {flagtest}), not))
  129.                             bpl .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  130.                         .else
  131.                             .if (.xmatch(.left(1, {flagtest}) , plus)) .or (.xmatch(.left(1, {flagtest}) , positive))
  132.                                 bmi .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  133.                             .else
  134.                             .error "Unknown condition in IF (N flag)"
  135.                             .fatal ""
  136.                             .endif
  137.                         .endif
  138.                     .else ; end "plus"
  139.                    
  140.                         .if  (.xmatch(.left(1, {flagtest}) , minus)) .or (.xmatch(.left(1, {flagtest}) , negative)) .or (.xmatch(.mid(1,1, {flagtest}) , minus)) .or (.xmatch(.mid(1,1, {flagtest}) , negative))  .or (.xmatch(.left(1, {flagtest}) , N)) .or (.xmatch(.left(1, {flagtest}) , bit7))
  141.                             .if  (.xmatch(.left(1, {flagtest}), not)) .or (.xmatch(.mid(1,1, {flagtest}), clear))
  142.                                 bmi .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  143.                             .else
  144.                                 .if  (.xmatch(.left(1, {flagtest}) , minus)) .or (.xmatch(.left(1, {flagtest}) , negative)) .or (.xmatch(.mid(1,1, {flagtest}), set))
  145.                                     bpl .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  146.                                 .else
  147.                                     .error "Unknown condition in IF (N flag)"
  148.                                     .fatal
  149.                                 .endif
  150.                             .endif
  151.                         .else ; end "minus"
  152.                        
  153.                         ; V:
  154.                         ; overflow
  155.                         ; overflow set
  156.                         ; overflow clear
  157.                         ; not overflow
  158.                         ; V set
  159.                         ; V clear
  160.                         ; bit6 clear
  161.                         ; bit6 set
  162.                        
  163.                             .if (.xmatch(.mid(1,1, {flagtest}) , overflow)) .or (.xmatch(.left(1, {flagtest}) , overflow)) .or (.xmatch(.left(1,{flagtest}) , V)) .or (.xmatch(.left(1, {flagtest}) , bit6))
  164.                                 .if (.xmatch(.mid (1, 1, {flagtest}), clear)) .or (.xmatch(.left(1, {flagtest}), not))
  165.                                     bvs .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  166.                                 .else
  167.                                     .if (.xmatch(.mid (1, 1,{flagtest}), set)) .or (.xmatch(.left(1,{flagtest}) , overflow))
  168.                                         bvc .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label))
  169.                                     .else
  170.                                         .error "Unknown condition in IF (V Flag)"
  171.                                     .fatal
  172.                                     .endif
  173.                                 .endif
  174.                             .else ; end "zero"
  175.                                 .if (.xmatch(.left(1,{flagtest}) , TRUE)) ; always true for ELSE macro
  176.                                 ; do  nothing (no branch)
  177.                                 .else
  178.                                     .error "Unrecognized IF test condition."
  179.                                     .fatal ""
  180.                                 .endif
  181.                             .endif
  182.                         .endif
  183.                     .endif
  184.                 .endif
  185.             .endif
  186.         .endif
  187.     .endif 
  188.  
  189.  
  190.    
  191. .endmacro
  192.  
  193. ; Create a label that will point to the next ENDIF and create an ENDIF/IF for the ELSE - the IF creates no code
  194.  
  195. .macro else
  196.     jmp .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_IF_label + 1)) ; one more than the last label, same lablel as the "if TRUE"
  197.     endif
  198.     if TRUE
  199. .endmacro
  200.  
  201.  
  202. ; Pop if address from the IF stack and make a label
  203. .macro endif
  204.  
  205.     .if (_endif_flagtest_SP - 1) < 0 ; if accessing the stack will result in a negative value, there are too many ENDIFs
  206.         .error "ENDIF without IF"
  207.         .fatal ""
  208.     .endif
  209.  
  210.     pop "IF_ENDIF_STACK",_endif_flagtest_END_label, _endif_flagtest_SP
  211.    
  212.     .ident ( .sprintf ("%s%04X", "_END_IF_", _endif_flagtest_END_label)):
  213.  
  214. .endmacro
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement